java - 将 Windows 证书导入 Java

标签 java ssl certificate truststore

我有一个 java 服务器试图通过 SSL 连接到外部 Ldap 服务器(作为客户端以执行查询)。

我在连接时遇到问题,因为他们在连接时发送给我的证书仅在我的本地 Windows Truststore 中受信任,但在 java truststore (cacerts) 中不存在。

有没有办法告诉 Java 信任任何 Windows 会信任的证书?

或者,有没有一种方法可以将所有受信任的证书从 Windows 信任库导入到 Java 的 cacerts?

任何想法将不胜感激。

最佳答案

解决方案

在 Windows 上,设置以下 JVM 属性:

javax.net.ssl.trustStore=NUL
javax.net.ssl.trustStoreType=Windows-ROOT

我已经使用 Java 7 成功测试了它,它在信任自签名 CA 的 64 位 Windows 安装上运行。

配置安全提供者

如果上述解决方案适合您(应该),您可以跳过此部分。否则,请检查您的 Java Cryptography Extension 的设置(JCE),即 bundled with modern JDKs .您的 JDK 安装应该有一个包含安全提供程序列表的属性文件。该文件的位置可能因 Java 版本而异;我的位于 "%JAVA_HOME%\jre\lib\security\java.security"。在该文件中,找到一组名称以 security.provider 开头的属性。其中一个条目应设置为 sun.security.mscapi.SunMSCAPI

例子

要在运行时设置属性,请使用以下 Java 代码:

System.setProperty("javax.net.ssl.trustStore", "NUL");
System.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT");

解释

javax.net.ssl.trustStoreType

在 Windows 上,Java 附带 SunMSCAPI ,一个安全提供者,实际上是 a wrapper around the Windows CAPI.

javax.net.ssl.trustStoreType 属性设置为 Windows-ROOT 指示 Java 引用 native Windows ROOT keystore 以获取受信任的证书,其中包括根 CA。 (类似地,将 javax.net.ssl.keyStoreType 设置为 Windows-MY 会告诉 Java 为用户特定的证书及其对应的 key 引用 native Windows MY keystore )。

javax.net.ssl.trustStore

如果 javax.net.ssl.trustStoreType 属性设置为 Windows-ROOT,人们会期望 javax.net.ssl 的值。 trustStore 被忽略,可以设置为 e。 G。

此问题的一个常见解决方法是将 javax.net.ssl.trustStore 设置为 NONE,然后创建一个文件名为 NONE 的虚拟文件。如果您发现自己受到此怪癖的影响,请尝试将 javax.net.ssl.trustStore 设置为 NUL,这样您就不必创建任何虚拟文件。

关于java - 将 Windows 证书导入 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41257366/

相关文章:

python - 在 python 中选择和 ssl

java - 如何在imageview上设置捕获的图像

java - 解析异构图

java - 插入 Date.sql 列的默认值

linux - 尝试连接到 http 服务器 (apache) 时出现 ssl 错误

ios - 如何使用自签名证书为 TLS 创建 iOS NWConnection?

security - 关于 SSL 和 HTTPS 的好文章?

ssl - SSL 和证书如何在服务器和浏览器之间工作

ios - 申请进入应用商店后如何更改生产证书(.p12)

java - 使用 JavaParser 计算类中的方法声明 + 方法调用