Соединение Java https - сертификат недоверен + javax.net.ssl.SSLException: сбой построения пути PKIX - PullRequest
1 голос
/ 11 марта 2019

У меня есть приложение JNLP, которое запускается через соединение HTTPS, и у меня возникли некоторые проблемы с ним.

  • Если я запускаю приложение через HTTP, проблема не возникает
  • Сертификат принимается браузером (FireFox и Internet Explorer)

Примечание. При этом используется сертификат Java 8 +, который не является подписью
Веб-сервер WebLogic + OHS

При запуске через HTTPS я получаю предупреждение безопасности:
Вы хотите продолжить? Соединение с этим сайтом не заслуживает доверия
Примечание. Сертификат недействителен и не может использоваться для проверки подлинности этого веб-сайта.
Дополнительная информация -> Сертификат показывает, что отпечаток пальца SHA-1 правильный (такой же, как тот, который показывает браузер).

Если я нажму «Продолжить», приложение запустится и отлично работает, кроме одной вещи Внутренне он использует apache.commons.httpclient

и там выдается исключение:

DEBUG org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry:404|Closing the connection.
DEBUG org.apache.commons.httpclient.HttpConnection.closeSocketAndStreams:1228|Exception caught when closing output
javax.net.ssl.SSLException: Connection has been shutdown: 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.SSLSocketImpl.checkEOF(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.checkWrite(Unknown Source)
    at sun.security.ssl.AppOutputStream.write(Unknown Source)
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
    at java.io.BufferedOutputStream.flush(Unknown Source)
    at java.io.FilterOutputStream.close(Unknown Source)
    at org.apache.commons.httpclient.HttpConnection.closeSocketAndStreams(HttpConnection.java:1226)
    at org.apache.commons.httpclient.HttpConnection.close(HttpConnection.java:1149)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:405)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
    at com.teamead.cs.sysmon.SendToServerRunnable.run(SendToServerRunnable.java:74)
    at com.teamead.cs.sysmon.SysMonHttpThreadTask.run(SysMonHttpThreadTask.java:40)
Caused by: 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(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.writeRecord(Unknown Source)
    at sun.security.ssl.AppOutputStream.write(Unknown Source)
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
    at java.io.BufferedOutputStream.flush(Unknown Source)
    at java.io.FilterOutputStream.flush(Unknown Source)
    at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:506)
    at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
    ... 5 more
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(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    ... 20 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)
    ... 26 more
DEBUG org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry:434|Method retry handler returned false. Automatic recovery will not be attempted
DEBUG org.apache.commons.httpclient.HttpConnection.releaseConnection:1178|Releasing connection back to connection manager.

Просто кажется, что сертификат не принят.

Но сертификат подписан:
DigiCert High Assurance EV Root CA
-> DigiCert SHA2 High Assurance Server CA
-> Сертификат домена

Я попытался импортировать корневой сертификат «DigiCert High Assurance EV Root CA» в хранилище пользователей Java: Но это не удалось keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect

Я попытался импортировать корневой сертификат" DigiCert High Assurance EV Root CA " в хранилище Java JDK (как Admiistartor):

%JAVA_HOME%\bin\keytool -import -alias digicertRootCA -file  C:\Users\USERNAME\DigiCertHighAssuranceEVRootCA.crt -keystore %JAVA_HOME%\lib\security\cacerts

но проблема остается ...

Чем я пытался импортировать Промежуточный сертификат" DigiCert SHA2 High Assurance Server CA " (который я экспортировал из браузера) в Java JDK castore (как Admiistartor):

%JAVA_HOME%\bin\keytool -import -alias digicertServerCA -file  C:\Users\USERNAME\DigiCertSHA2HighAssuranceServerCABrowserExport.crt -keystore %JAVA_HOME%\lib\security\cacerts

С этим импортированным сертификатом обе проблемы исчезли.

Мои вопросы сейчас:

  • Почему не работает корневой сертификат из цепочки?
  • Есть ли способ импортировать только в пользовательский магазин?
...