是否有可能说服Java应用程序忽略SSL问题而不修改其代码?

时间:2012-10-23 12:13:11

标签: java ssl

我有一些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

3 个答案:

答案 0 :(得分:7)

通过完全忽略信任验证来忽略证书验证错误的代码修改(例如,使用不执行任何操作的信任管理器)通常不是正确的方法。它们可能会受到一些开发人员的欢迎,因为他们不必经历任何有关处理证书的步骤,但他们只是忽略了问题而不是修复它,从而也引入了MITM攻击的漏洞。 (因为问题然后被解决了,所以在生产版本中永远不会修复它。)

JSSE Reference Guide

中介绍了配置信任管理的各种方法

简而言之,您可以将证书显式导入JRE信任库(通常是JRE目录中的cacerts文件),也可以将其导入您自己的信任库(可能基于默认信任的副本) store),并使用javax.net.ssl.trustStore(和相关的)系统属性指定其路径(请参阅JSSE参考指南)。

这些配置设置会影响所有使用默认设置的SSLSocketSSLEngine(代码中没有任何特定的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