我有一个 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/