我正在尝试打印一个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告诉我该网站不受信任,并询问我是否要继续。
答案 0 :(得分:9)
扩展JEditorPane
以覆盖getStream()
方法。
在该方法中,您可以open a URLConnection
.测试它是否为HttpsURLConnection
。如果是,initialize您的own SSLContext
自定义X509TrustManager
不会对该连接执行任何checks. Get the context's SSLSocketFactory
和set 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
答案 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