Java 连接到URL时出错-PKIX路径生成失败

Java 连接到URL时出错-PKIX路径生成失败,java,ssl,encryption,certificate,pkix,Java,Ssl,Encryption,Certificate,Pkix,我正在尝试连接到一个网页来收集信息,我正在使用jsoup来解析HTML。但是,每当我尝试连接到URL下载源代码时,我都会收到一个错误消息,说明PKIX构建路径。 我四处查看了一下,发现的所有信息都表明我已经将网站的CA根证书添加到了我的信任库中,但问题仍然存在,CA根证书已经存在。我可以通过网络浏览器连接到网站,但不能通过URL类。下面是我能写的最基本的代码,它会产生错误 public class URLConnectStart { public static void main(Str

我正在尝试连接到一个网页来收集信息,我正在使用jsoup来解析HTML。但是,每当我尝试连接到URL下载源代码时,我都会收到一个错误消息,说明PKIX构建路径。 我四处查看了一下,发现的所有信息都表明我已经将网站的CA根证书添加到了我的信任库中,但问题仍然存在,CA根证书已经存在。我可以通过网络浏览器连接到网站,但不能通过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的关于网站证书的信息

任何帮助都将不胜感激。这不是一个关键的应用程序,所以安全性并不是那么重要,但如果我能维护安全性,我宁愿这样做。不管怎样,我想做的就是通过代码下载这个网站的HTML

多谢各位

完成证书链所需的网站。一些用户代理/浏览器有一个名为AIA的功能,可以下载必要的中间产品,但Java客户端不是其中之一

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


同时,如果您想在客户端解决这个问题,您可以和。

您可以手动将证书安装到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之外,那么请提供该jre的路径

keytool-import-file C:\Certificate\c6.cer-keystore C:\Program Files\Java\jre1.8.0\u 181\lib\security\cacerts-alias c66-storepass changeit-noprompt
这个评论对理解这个问题很有帮助,但由于某种原因,我无法解决这个问题。我能够将证书添加到密钥库中,但当我运行该程序时,仍然会出现相同的错误。密钥库中应该有多个条目,或者我需要向代码中添加一些内容吗?除了您可能添加的其他内容外,证书存储通常应该包含与JDK/JRE捆绑在一起的所有根CA证书。我的默认cacert文件Java 1.8.066有93个证书,在将中间文件添加到此存储之后,我能够使用您的代码片段连接到URL。好的,我发现了我做错了什么。我在bin文件夹中创建了一个新的cacerts,而不是使用/lib/security中的cacerts。我可以连接到该网站,我将与管理员联系他们的证书问题。感谢您的帮助。似乎您可以使用JVM参数-Dcom.sun.security.enableAissuers=true激活中间证书AIA的自动下载。有关更多详细信息,请参阅