У меня есть приложение 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
С этим импортированным сертификатом обе проблемы исчезли.
Мои вопросы сейчас:
- Почему не работает корневой сертификат из цепочки?
- Есть ли способ импортировать только в пользовательский магазин?