大多数支持 SSL 的 Web 浏览器都有一个 CA 列表,它们将自动接受其证书。如果浏览器遇到授权 CA 在列表中的证书,浏览器将自动接受该证书,并与站点建立 SSL 连接。
有一个运行在 JBoss 7 上的 Java 1.6 客户端,它需要与 LDAP 服务器建立 SSL 连接。由于客户端在生产中,如果 LDAP 服务器更新其证书而没有通知我在 JBoss 上相应地更新证书,客户端将失败。我的问题是:我如何才能以浏览器无缝“接受”证书的类似方式安全地连接 (ssl) 到 LDAP?
我不知道这在Java中是否可行。但是,欢迎任何想法和反馈。
最佳答案
Java 有一个默认的信任库,其中包含所有受信任的证书。它位于 %JRE_HOME%\lib\security\cacert
下,拥有所有受信任的 CA 证书(Verisign 等)。
因此,如果您的客户端 https
应用程序尝试连接到部署了由这些颁发者签名的证书的服务器,您将不会遇到任何问题(与您的浏览器发生的情况相同)。
现在解决你的问题。您没有提及有关您的 LDAP
服务器的足够信息。
我可以想到以下几点:
- LDAP 服务器部署了由某个 CA(不是其中之一)签名的证书 已知的)。
- LDAP 服务器部署自签名证书
对于情况 (1),您需要做的就是将签名者的证书 添加到您的信任库(即签署您的 LDAP 服务器证书的问题的证书)。如果 LDAP 服务器更改证书,您将不受影响,前提是它从您现在设置为受信任的同一 CA 获取证书。这个受信任的证书可以添加到 cacerts
中,但推荐的解决方案是使用您自己的单独信任库,导入它并在 JVM 中设置它以覆盖默认的 cacerts
。谷歌有很多例子。
对于情况 (2),这是一个非常糟糕的设置并且有麻烦,因为每次 LDAP
服务器更改证书时您都需要手动更新信任库。
但无论如何我只能假设证书因过期而发生变化?我想不出其他原因(除了私钥的妥协,但这不是你描述的问题)
关于java - Java 应用程序如何无缝地接受服务器证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12501286/