Java 7 - SSL如何信任所有证书

4
我正在编写一个Java代理程序,使用SSL与其他服务器通信。使用ServerSocketFactory以及填充有服务器证书的密钥库和信任库可以使其正常工作。
我想知道,在Java 7中是否有一种方法可以禁用认证并信任所有服务器?(是的,我知道这很危险 - 但代理仅供内部使用)
我看到了一些使用X509TrustManager实现TrustManager的例子,尽管显然Java 7不支持这些契约,并且X509TrustManager本身已被弃用。
感谢您的建议和任何在Java 7上运行的代码示例。

1
如果您不想保证安全性,为什么还要使用SSL呢? - user207421
2
X509TrustManager 不推荐使用了吗?你在哪里看到的?确实有一个新的 X509ExtendedTrustManager,但我不知道旧的接口是否被弃用。虽然很少有人建议使用这些空的信任管理器,但它们在Java 7中仍然可以工作。 - Bruno
你是对的,看起来X509TrustManager有两个实现,一个在javax.net.ssl下,另一个(旧版本)在com.sun.net.ssl下,已被弃用。 - Uri Lukach
EJP,当您编写代理时,您会监视来自许多选择HTTPS的供应商的流量,您的问题假设我们监视所有服务器,但事实并非如此。 - Uri Lukach
1
你并不应该直接使用任何 com.sun.* 类。它们不是 Java 的公共 API 的一部分。如果使用它们,那么它们只会被您所使用的 JRE 的各个提供者内部使用。 - Bruno
2个回答

1
MITM代理服务器(即能够查看SSL / TLS流量的服务器)通常使用自己的CA来为所请求的站点生成伪证书。
将此CA证书安装在您的客户端信任商店中,而不是调整代码。这是一个更清洁的解决方案,并且从长远来看,更容易部署。
(对于您问题的更直接的答案,无数个什么都不做的信任管理器在Java 7中仍然可以正常工作。)

0
我所做的是使用此帖子中提到的代码实现了一个java.security.Provider。

https://code.google.com/p/misc-utils/wiki/JavaHttpsUrl

注意:这是提供的第二个解决方案。
此帖子未提到您还应添加密钥库以使事情正常工作。 因此,这些VM参数也应设置(否则,您将收到“没有共同的密码套件”错误消息):
                -Djavax.net.ssl.keyStore=KEYSTORE LOCATION
                -Djavax.net.ssl.keyStorePassword=YOUR PASS

希望这能对你有所帮助,因为我查看的所有地方都没有提到这一部分。


你的设置看起来非常尴尬。首先,在自己的SSLContext中使用一个不会抛出异常的自定义x509TrustManager在Java 7中仍然可以正常工作。其次,javax.net.ssl.keyStore与信任设置完全无关。根据你的描述,这只对服务器端有用(用于配置服务器证书)。 - Bruno
该代理服务器用于监控许多服务器的流量,服务于组织内部的局域网环境。除此之外,它不应该在公共领域外使用。我的目的是为了避免每次需要监控新服务器时都需要向信任库添加新证书。设置密钥库只需要进行一次操作,除非出现“cipher”异常。 - Uri Lukach
我不确定你是否看过密钥库用作密钥库和用作信任库之间的区别。当服务器端没有设置密钥库时(这与信任库或信任管理器无关),通常会出现“没有共同的加密套件”的情况。 - Bruno
嗨,布鲁诺,我强烈推荐你阅读这篇文章,它解释了ketstore和trustore之间的区别:https://dev59.com/iHRC5IYBdhLWcg3wXP0C 请完整阅读,这是一篇很棒的文章... - Uri Lukach
Uri,我非常清楚keystore和truststore的区别。 我的意思是说你似乎自己并不清楚。我的观点是你只需要在你自己的代理服务器上设置keystore,而不需要在客户端上设置。 - Bruno
嗨,Bruno,我非常清楚这个区别,谢谢你的关心和在这篇帖子中的帮助。 - Uri Lukach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接