在 Java 中请求 URL 时忽略证书错误

Posted

技术标签:

【中文标题】在 Java 中请求 URL 时忽略证书错误【英文标题】:Ignore certificate errors when requesting a URL in Java 【发布时间】:2011-02-11 06:20:41 【问题描述】:

我正在尝试打印一个 URL(根本不涉及浏览器),但该 URL 当前正在抛出以下内容:

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

我使用 JEditorPane 的 setPage 方法调用 URL,该方法仅将 URL 作为参数。假设我无法更改任何服务器端并且我仍然需要访问此资源,我将如何忽略证书错误(或其他使我达到目标的东西)?

通过浏览器访问此 URL 告诉我该站点不受信任,并询问我是否要继续。

【问题讨论】:

【参考方案1】:

扩展JEditorPane 以覆盖getStream() 方法。

在那个方法里面,你可以open a URLConnection.测试是否是HttpsURLConnection。如果是,initialize 你的own SSLContext 带有一个自定义的X509TrustManager,它不会为连接执行任何checks. Get the context's SSLSocketFactory 和set it as the socket factory。然后返回InputStreamfrom the connection.

这将阻止运行时为保护用户免受提供恶意软件的欺骗性站点的任何尝试。如果那是真的你想要的......

【讨论】:

【参考方案2】:

这可能是因为您的密钥库中用于访问目标HTTPS URL 的证书与来自服务器的证书不匹配。

您需要将证书导入 JVM 的密钥库。 获取密钥库证书以访问此 URL,然后使用

将其导入主密钥库

keytool -importkeystore -srckeystore /path/to/custom/keystore -destkeystore $JAVA_HOME/jre/lib/security/cacerts

假设你使用的是来自$JAVA_HOME的Java

【讨论】:

可能确实是这样。另见java.sun.com/developer/technicalArticles/Security/…【参考方案3】:

我会使用埃里克森解决方案。 另一种方法是将服务器的证书(可能是自签名的)添加到您的受信任证书 KeyStore 中(我会在您的测试环境中这样做)。 使用:

java InstallCert YourHost

创建 jssecacerts 文件 然后将其复制到以下文件夹:

$JAVA_HOME/jre/lib/security 

【讨论】:

【参考方案4】:

如果它是您每次要联系的同一台服务器,则可以通过将其添加到信任库来简单地信任该证书。我不会将此添加到默认的 cacerts 文件中,但您可以创建自己的密钥库并通过 javax.net.ssl.trustStore 系统属性指定它。

最后,如果您想完全禁用 PKIX 检查(只有在您明白这会严重损害安全性时才应该这样做),唯一的方法是按照 erickson 的建议实现您自己的 SSL 上下文和信任管理器。

【讨论】:

【参考方案5】:

在相关说明中:我与 WCF .net Web 服务的相互证书身份验证导致我的测试环境出现问题。我将这两行添加到我的代码中以解决问题并允许我解决问题:

//Uncomment this in case server demands some unsafe operations       
System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");       

//this command allowed me to see the detailed debugger log for detecting the
//issue with my certs.
System.setProperty("javax.net.debug","all");

这是在 Java/Windows/Unix 世界中处理 SSL 协商和证书的一个很好的参考:Transport Layer Security (TLS) Renegotiation Issue Readme

【讨论】:

以上是关于在 Java 中请求 URL 时忽略证书错误的主要内容,如果未能解决你的问题,请参考以下文章

让git忽略ssl证书错误

让git忽略SSL证书错误。及push项目时消除警告

c# https请求忽略证书验证_各种编程语言忽略http的SSL证书认证

OkHttp使用https,忽略证书验证

iOS https请求对自签名证书忽略

配置SSL证书之后,Bitnami Redmine创建问题时保存报错问题解决方案