2015-10-22 1 views
1

Я пытаюсь подключиться к веб-странице для сбора информации, и я использую jsoup для анализа HTML. Тем не менее, всякий раз, когда я пытаюсь подключиться к URL-адресу для загрузки источника, я получаю сообщение об ошибке в отношении пути сборки PKIX. Я огляделся, и все, что я нашел, говорит, что добавить сертификат CA Root на веб-сайт в мой магазин доверия, который я сделал, но проблема не устранена (сертификат CA Root уже был там). Я могу подключиться к веб-сайту через веб-браузер, но не через класс URL. Вот самый базовый код, который я мог бы написать, который приведет к ошибке.Ошибка при подключении к URL-адресу. Не удалось создать путь к PKIX.

public class URLConnectStart { 
    public static void main(String[] args) { 
     try { 
      URL u = new URL("https://ntst.umd.edu/soc/"); 
      u.openStream();  
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Здесь ошибка

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.startHandshake(Unknown Source) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source) 
    at java.net.URL.openStream(Unknown Source) 
    at URLConnectStart.run(URLConnectStart.java:14) 
    at URLConnectStart.main(URLConnectStart.java:8) 
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) 
    ... 16 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) 
    ... 22 more 

информация из хрома относительно CERT веб-сайта

Info from chrome regarding the website's cert

Любая помощь будет оценена. Это не критическое приложение, поэтому безопасность не так важна, но если я могу поддерживать безопасность, я бы предпочел сделать это. Несмотря ни на что, все, что я хочу сделать, это загрузить HTML для этого сайта с помощью кода.

спасибо.

ответ

2

Веб-сайт does not provide an intermediate certificate, необходимый для заполнения цепочки сертификатов. Некоторые пользовательские агенты/браузеры имеют функциональность под названием AIA, где они загружают необходимые промежуточные продукты, но клиент Java не является одним из них.

SSL Labs resport showing incomplete certificate chain

Если вы администратор сайта, правильный способ решения этой проблемы является предоставление промежуточного сертификата, так что отправляется полная цепочка. Даже если вы являетесь конечным пользователем, подумайте о том, чтобы связаться с веб-сайтом, чтобы исправить эту проблему. Пользователи, использующие браузеры Android, также не смогут получить доступ к этому сайту, не принимая предупреждения о безопасности из-за этой проблемы.

В то же время, если вы хотите обратиться к этому в своем клиенте, вы можете download the missing intermediate cert и add it to your Java certificate store.

+0

Этот комментарий был очень полезен для понимания проблемы, но по какой-то причине я не мог решить проблему. Я смог добавить сертификат в хранилище ключей, но когда я запускаю программу, я все равно получаю ту же ошибку. Предполагается, что в хранилище ключей должно быть более 1 записи, или мне нужно добавить что-то в свой код? – Jtvd78

+0

Хранилище сертификатов должно содержать все корневые сертификаты ЦС, поставляемые вместе с JDK/JRE, в дополнение ко всему, что вы могли добавить. В моем файле cacert по умолчанию (Java 1.8.0_66) было 93 сертификата, и после добавления промежуточного элемента в это хранилище мне удалось подключиться к URL с вашим фрагментом кода. –

+0

Хорошо, я узнал, что я делаю неправильно. Я создавал новые cacerts в папке bin вместо того, чтобы использовать один в/lib/security. Я могу подключиться к веб-сайту, и я свяжусь с администраторами об их проблеме с сертификатом. Спасибо за помощь. – Jtvd78