Я столкнулся с некоторыми трудностями при попытке подключиться к серверу с помощью пользовательского хранилища доверенных сертификатов 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>