SSLHandshakeException, когда несколько соединений ssl - PullRequest
1 голос
/ 02 апреля 2012

Я написал модуль, который подключается к сервису через https с аутентификацией. После установки правильного пути к хранилищу ключей он работает нормально. Существует проблема, когда я хочу использовать этот модуль (как jar) в моем приложении Tomcat. Я также установил правильные пути (абсолютные пути) для хранилища ключей, но когда я пытаюсь подключиться, я получаю исключение рукопожатия

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Насколько я помню, я получал это сообщение раньше, когда у меня было неправильное хранилище ключей. Нужно ли что-то еще делать с этим, чтобы он работал под Tomcat. Любая другая проблема, которую я пропустил? Я подключаюсь к другому сервису через https без аутентификации, и это нормально работает (в приложении Tomcat).

edit: проблема состояла в том, чтобы запустить проект, который подключается к различным сервисам через ssl (не только в Tomcat). Один с аутентификацией, второй без. Поэтому я отредактировал заголовок

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Еще раз я даю ответ самому себе. После прочтения Как управлять областью SSLContext Я решил сделать то же самое, и она отлично работает. По умолчанию я не устанавливаю никакой trustStore (поэтому используются cacerts по умолчанию), и когда мне нужно пройти аутентификацию, я использую

httpsUrlConnection.setSSLSocketFactory(getSSLContext().getSocketFactory());

когда getSSLContext () возвращает то, что я написал выше (без setDefault)

Я хотел бы знать, как изменить стандартный SSLContext в приложении Tomcat, чтобы, если кто-то мог помочь, я был бы благодарен

1 голос
/ 03 апреля 2012

Установка нескольких хранилищ доверенных сертификатов на одной и той же JVM дала мне ответ.Мне нужно было только установить свою фабрику ключей, а также фабрику доверия, и она работает:)

System.setProperty не устанавливает уже установленное свойство ssl.

    // load your key store as a stream and initialize a KeyStore
    InputStream trustStream = new FileInputStream("Resources/keystore.ImportKey");
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());

    // if your store is password protected then declare it (it can be null however)
    String trustPassword = "changeit";

    // load the stream to your store
    trustStore.load(trustStream, trustPassword.toCharArray());

    // initialize a trust manager factory with the trusted store
    TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustFactory.init(trustStore);

    KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    keyFactory.init(trustStore, trustPassword.toCharArray());

    // get the trust managers from the factory
    TrustManager[] trustManagers = trustFactory.getTrustManagers();
    KeyManager[] keyManagers = keyFactory.getKeyManagers();

    // initialize an ssl context to use these managers and set as default
    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(keyManagers, trustManagers, null);
    SSLContext.setDefault(sslContext);

просто отлично работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...