Java: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Java: исключение sun.security.provider.certpath.Исключение SunCertPathBuilderException: не удается найти действительный путь сертификации к запрошенной цели
У меня есть класс, который загружает файл с https сервера. Когда я запускаю его, он возвращает множество ошибок. Похоже, у меня проблема с моим сертификатом. Можно ли игнорировать аутентификацию клиент-сервер? Если да, то каким образом?
URI Query: https://176.66.3.69:6443/download.aspx?Lang=EN&AuthToken=package Aug 2, 20113:47:57 PM org.apache.http.impl.nio.client.NHttpClientProtocolHandler exception SEVERE: I/O error: General SSLEngine problem javax.net.ssl.SSLHandshakeException: General SSLEngine problem at com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source) at javax.net.ssl.SSLEngine.wrap(Unknown Source) at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:154) at org.apache.http.impl.nio.reactor.SSLIOSession.isAppInputReady(SSLIOSession.java:276) at org.apache.http.impl.nio.client.InternalClientEventDispatch.inputReady(InternalClientEventDispatch.java:79) at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:161) at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:335) at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315) at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:275) at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:542) at java.lang.Thread.run(Unknown Source) Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at com.sun.net.ssl.internal.ssl.Handshaker$DelegatedTask.run(Unknown Source) at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:180) ... 9 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 com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source) ... 16 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source) at java.security.cert.CertPathBuilder.build(Unknown Source) ... 21 more onCleanup()
[DownloadFile] Exception: javax.net.ssl.SSLHandshakeException: General SSLEngine problem Shutting down Done
Переведено автоматически
Ответ 1
Проблема возникает, когда на вашем сервере установлен самозаверяющий сертификат. Чтобы обойти это, вы можете добавить этот сертификат в список доверенных сертификатов вашей виртуальной машины.
В этой статье автор описывает, как получить сертификат из вашего браузера и добавить его в файл cacerts вашей виртуальной машины. Вы можете либо отредактировать JAVA_HOME/jre/lib/security/cacerts файл, либо запустить приложение с -Djavax.net.ssl.trustStore параметром. Также проверьте, какой JDK / JRE вы используете, поскольку это часто является источником путаницы.
Вот что у меня надежно работает на macOS. Обязательно замените example.com и 443 на фактическое имя хоста и порт, к которому вы пытаетесь подключиться, и укажите пользовательский псевдоним. Первая команда загружает предоставленный сертификат с удаленного сервера и сохраняет его локально в формате x509. Вторая команда загружает сохраненный сертификат в хранилище доверия SSL Java.
Экспортируйте SSL-сертификат с помощью Firefox. Вы можете экспортировать его, нажав URL-адрес в браузере, а затем выберите опцию экспорта сертификата. Предположим, что имя файла сертификата - это your.ssl.server.name.crt
У меня была такая же проблема с действительным подписанным шаблонным сертификатом от symantec.
Сначала попробуйте запустить свое java-приложение с -Djavax.net.debug= SSL, чтобы увидеть, что происходит на самом деле.
В итоге я импортировал промежуточный сертификат, что приводило к разрыву цепочки сертификатов.
Я загрузил отсутствующий промежуточный сертификат от symantec (вы можете увидеть ссылку для скачивания отсутствующего сертификата в журнале подтверждения ssl: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer в моем случае).
И я импортировал сертификат в хранилище ключей java. После импорта промежуточного сертификата мой подстановочный ssl-сертификат, наконец, начал работать:
keytool -import -keystore ../jre/lib/security/cacerts -trustcacerts -alias "VeriSign Class 3 International Server CA - G3" -file /pathto/SVRIntlG3.cer