it-roy-ru.com

Сбой построения пути PKIX в приложении Java

Я почти неделю боролся за то, чтобы мои приложения работали после перемещения моих приложений с Windows 2000 на Windows 2008 R2 Server.

Процедура:

  1. Установленная Java JDK 1.7.0_25
  2. Установите системную переменную среды Java_HOME в C:\Progra~1\Java\jdk1.7.0_25\
  3. Импортировал сертификат в cacerts с keytool
  4. Убедитесь, что сертификат существует в keytool с -list.

Я попытался повторить шаг 3 с InstallCert, чтобы убедиться, что я ничего не испортил.

Вышеуказанные методы не решили мою проблему, поэтому я попытался сделать это программно:

System.setProperty("javax.net.ssl.trustStore",
"C:/Progra~1/Java/jdk1.7.0_25/jre/lib/security/cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Все еще без удачи. Я застрял и не совсем уверен, в каком направлении идти отсюда.

Трассировки стека:

javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at Sun.security.ssl.Alerts.getSSLException(Alerts.Java:192)
    at Sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.Java:1886)
    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 Sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.Java:515)
    at Sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.Java:185)
    at Sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.Java:153)
    at util.SMS.send(SMS.Java:93)
    at domain.ActivationSMSSenderMain.sendActivationMessagesToCustomers(ActivationSMSSenderMain.Java:80)
    at domain.ActivationSMSSenderMain.<init>(ActivationSMSSenderMain.Java:44)
    at domain.ActivationSMSSenderMain.main(ActivationSMSSenderMain.Java:341)
Caused by: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:385)
    at Sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.Java:292)
    at Sun.security.validator.Validator.validate(Validator.Java:260)
    at Sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.Java:326)
    at Sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.Java:231)
    at Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:126)
    at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1323)
    ... 14 more
Caused by: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at Sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.Java:196)
    at Java.security.cert.CertPathBuilder.build(CertPathBuilder.Java:268)
    at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:380)
    ... 20 more

Обновление:

И System.out.println(System.getProperty("javax.net.ssl.trustStore")); И System.out.println(System.getProperty("javax.net.ssl.keyStore")); 

возвращает null.

33
JavaCake

Я столкнулся с похожими проблемами, причина и решение которых оказалось довольно простыми:

Основная причина: Не удалось импортировать правильный сертификат с помощью keytool 

ПРИМЕЧАНИЕ. Импортируйте только корневые сертификаты CA (или собственные подписанные) 

ПРИМЕЧАНИЕ: не импортируйте промежуточный сертификат, не являющийся корневым сертификатом цепочки сертификатов

Пример решения для imap.gmail.com

  1. Определите корневой сертификат CA: 

    openssl s_client -showcerts -connect imap.gmail.com:993
    

    в этом случае мы находим, что корневым центром сертификации является Equifax Secure Certificate Authority

  2. Скачать корневой сертификат CA .
  3. Убедитесь, что загруженный сертификат имеет правильные отпечатки SHA-1 и/или MD5, сравнив его с информацией найдено здесь
  4. Сертификат импорта для javax.net.ssl.trustStore:

    keytool -import -alias gmail_imap -file Equifax_Secure_Certificate_Authority.pem
    
  5. Запустите свой Java-код 
31
jb1

Вы импортировали сертификат в хранилище доверенных сертификатов JRE, предоставленного в JDK, но вы запускаете Java.exe установленного JRE.

ПРАВКА

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

Гораздо лучшим решением было бы создать ваше доверенное хранилище own, начиная с копии файла cacerts, и конкретно указать Java использовать это через системное свойство javax.net.ssl.trustStore.

Вы должны выполнить сборку этой части процесса сборки, чтобы быть в курсе изменений в файле cacerts, вызванных обновлениями JDK.

9
user207421

Если вы используете Eclipse, просто перепроверьте в Eclipse Windows -> предпочтения ----> Java ---> установленные JREs указывает текущий JRE и JRE, где вы настроили свой сертификат. Если нет, удалите JRE и добавьте jre, где установлен ваш сертификат

3
Mohammed Irfan Tirupattur

Согласно вашему Pastebin, вам нужно добавить сертификат proxy.tkk.com в склад доверенных сертификатов.

0
Sean Baker

В моем случае проблема была решена путем установки Oracle официального JDK 10, а не использования стандартного OpenJDK, поставляемого с моей Ubuntu. Это руководство, которому я следовал: https://www.linuxuprising.com/2018/04/install-Oracle-Java-10-in-ubuntu-or.html

0
acohen