2

我正在尝试连接到网页以收集信息,并且我正在使用 jsoup 来解析 HTML。但是,每当我尝试连接到 URL 以下载源代码时,都会收到一条错误消息,说明有关 PKIX 构建路径的信息。我环顾四周,发现的所有内容都说要将网站的 CA Root 证书添加到我的信任库中,我这样做了,但问题仍然存在(CA Root 证书已经存在)。我可以通过网络浏览器连接到网站,但不能通过 URL 类。这是我可以编写的最基本的代码,它会产生错误。

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

来自 chrome 的有关网站证书的信息

来自 chrome 的有关网站证书的信息

任何帮助,将不胜感激。这不是一个关键应用程序,因此安全性并不是那么重要,但如果我能保持安全性,我宁愿这样做。无论如何,我想做的就是通过代码下载该网站的 HTML。

谢谢你。

4

2 回答 2

4

该网站不提供完成证书链所需的中间证书。一些用户代理/浏览器具有称为 AIA 追逐的功能,它们在其中下载必要的中间体,但 Java 客户端不是其中之一。

SSL Labs 报告显示不完整的证书链

如果您是站点管理员,解决此问题的正确方法是提供中间证书,以便发送完整的链。即使您是最终用户,也请考虑联系网站以解决此问题。由于此问题,使用 Android 浏览器的人们也将无法访问该站点,除非接受安全警告。

同时,如果您想在您的客户端中解决此问题,您可以下载缺少的中间证书并将其添加到您的 Java 证书存储中。

于 2015-10-22T19:21:41.203 回答
1

您可以手动将证书安装到 java 密钥库。

  • 打开 chrome 并给出 URL。在地址栏中
  • 单击带锁图标的安全
  • 将出现带有一些选项的弹出窗口。
  • 选择证书->正下方的有效链接。
  • 单击详细信息选项卡并选择复制到文件
  • 给一些名字并保存它。

清除是否存在任何别名的第一个命令(我更喜欢在 Windows 中从 JAVA_HOME 运行它,因此路径与此相关。如果您从外部运行,请相应地更改路径。

  • keytool -delete -alias "c11" -keystore ../jre/lib/security/cacerts -storepass changeit -noprompt

现在我们需要安装证书

  • keytool -import -file "C:\Certificateert\c1.cer" -keystore ../jre/lib/security/cacerts -alias "c11" -storepass changeit -noprompt

密钥库的默认密码是changeit

如果您有多个证书,请将此命令添加到每个文本文件中,并将其保存为bat扩展名并放入JAVA_HOME\bin或您喜欢的任何位置。确保提到的路径是相对的。

如果您的 jre 在 jdk 之外,则提供该路径。

  • keytool -import -file "C:\Certificate\c6.cer" -keystore "C:\Program Files\Java\jre1.8.0_181\lib\security\cacerts" -alias "c66" -storepass changeit -noprompt
于 2018-09-25T10:17:45.900 回答