Подтвердить что ты не робот

Не удалось создать путь PKIX в приложении Java

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

Процедура:

  • Установленный Java JDK 1.7.0_25
  • Установите переменную системной среды JAVA_HOME в C:\Progra~1\Java\jdk1.7.0_25\
  • Импортирован сертификат в cacerts с помощью keytool
  • Убедитесь, что сертификат существует в 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

UPDATE:

И System.out.println(System.getProperty("javax.net.ssl.trustStore")); а также System.out.println(System.getProperty("javax.net.ssl.keyStore"));

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

4b9b3361

Ответ 1

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

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

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

ПРИМЕЧАНИЕ. Не импортируйте промежуточную корневую сертификацию без сертификатов

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

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

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

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

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

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

Ответ 2

Вы импортировали сертификат в доверительный магазин JRE, предоставленный в JDK, но вы используете java.exe из JRE, установленного напрямую.

ИЗМЕНИТЬ

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

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

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

Ответ 3

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

Ответ 4

В вашем пастебине вам нужно добавить сертификат proxy.tkk.com в доверительный магазин.