我有一些Java应用程序抱怨不同的SSL问题,如自签名证书或不受信任的证书。
由于我没有这些应用程序的代码并且获得良好的证书太难了,我正在寻找一种能让我强行连接的解决方案。
到目前为止,我尝试了这些但似乎还不够:
-Dcom.sun.net.ssl.checkRevocation=false
-Djava.security.debug=certpath
我仍然看到:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
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
答案 0 :(得分:7)
通过完全忽略信任验证来忽略证书验证错误的代码修改(例如,使用不执行任何操作的信任管理器)通常不是正确的方法。它们可能会受到一些开发人员的欢迎,因为他们不必经历任何有关处理证书的步骤,但他们只是忽略了问题而不是修复它,从而也引入了MITM攻击的漏洞。 (因为问题然后被解决了,所以在生产版本中永远不会修复它。)
中介绍了配置信任管理的各种方法简而言之,您可以将证书显式导入JRE信任库(通常是JRE目录中的cacerts
文件),也可以将其导入您自己的信任库(可能基于默认信任的副本) store),并使用javax.net.ssl.trustStore
(和相关的)系统属性指定其路径(请参阅JSSE参考指南)。
这些配置设置会影响所有使用默认设置的SSLSocket
和SSLEngine
(代码中没有任何特定的SSLContext
)。
某些应用程序使用自己的SSLContext
为特定连接加载特定的密钥库或信任库。这通常使用独立于JSSE默认选项的参数进行配置,在这种情况下,您必须检查应用程序文档或代码。
答案 1 :(得分:6)
http://code.google.com/p/misc-utils/wiki/JavaHttpsUrl提供了几种侵入式解决方案。
SSLSocketFactory可以是overridden with system property。
但custom HostnameVerifier只能通过额外的启动参数或on the fly使用特殊的java代理进行认可。
此外,AspectJ weaving agent可用于override any method behavior。
另请考虑使用MiTM HTTPS proxy的替代方法(如果应用程序允许重新配置网址和证书)。
答案 2 :(得分:0)
是的。
使用JVM args:
REQUIRES_NEW
或以编程方式:
您可以覆盖默认的TrustManager和HostnameVerifier。 该链接为reusable code example。