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

时间:2010-04-22 20:36:07

标签: java ssl-certificate

我正在尝试打印一个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告诉我该网站不受信任,并询问我是否要继续。

5 个答案:

答案 0 :(得分:9)

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

在该方法中,您可以open a URLConnection.测试它是否为HttpsURLConnection。如果是,initialize您的own SSLContext自定义X509TrustManager不会对该连接执行任何checks. Get the context's SSLSocketFactoryset it as the socket factory。然后返回InputStream from the connection.

这将破坏运行时保护用户免受恶意软件恶意软件攻击的任何企图。如果那是真的你想要的......

答案 1 :(得分:3)

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

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

将其导入主密钥库

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

假设您使用的是$JAVA_HOME

中的Java

答案 2 :(得分:2)

我会使用erickson解决方案 另一种方法是将服务器的证书(可能是自签名的)添加到您的可信证书KeyStore(我会在您的测试环境中进行)。
使用:

java InstallCert YourHost

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

$JAVA_HOME/jre/lib/security 

答案 3 :(得分:0)

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

最后,如果你想完全禁用PKIX检查(只有当你明白这会危及安全性时才应该这样做),唯一的办法是按照erickson的建议实现你自己的SSL上下文和信任管理器。 / p>

答案 4 :(得分:0)

相关说明:我与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