Корневой сертификат хранилища доверенных сертификатов Java не является доверенным для [myserver.mydomain.com] - PullRequest
0 голосов
/ 21 сентября 2018

Я столкнулся с некоторыми трудностями при попытке подключиться к серверу с помощью пользовательского хранилища доверенных сертификатов Java, где при попытке подключения я получаю следующую ошибку.У меня очень мало опыта использования java для подключения через SSL, поэтому я обеспокоен, что есть кое-что, о чем я не подозреваю, что может вызвать проблему:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: root certificate not trusted of [myserver.mydomain.com]
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
    at org.jiv

Для подключения требуется и хранилище ключей, и хранилище доверенных сертификатов, которое я создалследующим образом:

Keystore:

  • Сгенерирован закрытый ключ на клиенте (openssl genrsa -out mykey.key 4096)
  • Сгенерирован самозаверяющий пароль CSR / wa.(openssl req -new -key mykey.key -out mykey.csr)
  • Создание самозаверяющего сертификата пары открытого ключа (openssl req -x509 -days 365 -key mykey.key -in mykey.csr -out mykey.cer)
  • Создание файла PKCS12 из личного ключа (openssl pkcs12 -export -out mykey.p12 -inkey mykey.key -in mykey.cer)
  • Добавлен новый файл PKCS12 в новое хранилище ключей (keytool -importkeystore -srckeystore mykey.p12 -destkeystore mykeystore.jks -srcstoretype PKCS12)
  • Добавлен открытый сертификат сервера в хранилище ключей после его преобразования из pem в der (keytool -import -alias mnt1 -keystore mykeystore.jks -file puiblicserver.der)

Склад доверенных сертификатов:

  • Добавлен тот же открытый ключ с сервера в новое хранилище доверенных сертификатов (keytool -import -alias root -keystore truststore.jks -file puiblicserver.der)

Оттуда я загружаюmykey.cer в хранилище доверенных сертификатов сервера.Одна вещь, которую я заметил, это то, что когда я проверял соединение, используя мой файл jar (java -Djavax.net.debug=ssl,handshake -jar myjar.jar myserver.mydomain.com User truststore.jks <PW> mykeystore.jks <PW>), это то, что сервер фактически подписан сертификатом Digicert Intermediate.Поэтому я также добавил промежуточные и корневые сертификаты от Digicert в хранилище доверенных сертификатов (не хранилище ключей), но это не работает.

Однако, если я перехожу на промежуточные и корневые сертификаты и использую их в соединении openssl изклиент к серверу, который он успешно соединяет, заставляет меня поверить, что это как-то связано с хранилищем доверенных сертификатов java.


Редактировать: я вызываю соединение в java с помощью следующего:

TLSConfiguration config = new TLSConfiguration();
    config.setHosts(hostnames);
    config.setUserName(username);
    config.setGroup(Group.EPS.value());
    config.setKeystorePath(keystoreFilename);
    config.setKeystorePassphrase(keystorePassword);
    config.setTruststorePath(truststoreFilename);
    config.setTruststorePassphrase(truststorePassword);

Пример: java -Djavax.net.debug=ssl,handshake -jar myjar.jar myserver.mydomain.com User truststore.jks <PW> mykeystore.jks <PW>

1 Ответ

0 голосов
/ 21 сентября 2018

Из вашего вопроса не совсем понятно, каким магазином доверия вы пользуетесь.Вы загрузили свой самозаверяющий сертификат в хранилище доверенных сертификатов по умолчанию с чем-то вроде этого?

keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

Если нет, вам нужно указать Java, какое хранилище доверенных сертификатов использовать.Если вы этого не сделаете, он будет использовать значение по умолчанию (в котором нет вашего собственного сертификата).Вам необходимо сделать следующее:

-Djavax.net.ssl.trustStore=<path to your trusstore>.jks -Djavax.net.ssl.trustStorePassword=<your password>

Примечание: если вы устанавливаете хранилище доверия через параметры -D, ваш код будет доверять ТОЛЬКО ЦА в этом хранилище доверия.

Чтобы указать, какое хранилище ключей использоватьВы можете добавить эти опции Java:

-Djavax.net.ssl.keyStore=<path to your keystore>.jks -Djavax.net.ssl.keyStorePassword=<your keystore password>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...