将 Windows 个证书导入 Java

Import Windows certificates to Java

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

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

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

或者,有没有办法将所有受信任的证书从 windows truststore 导入到 Java 的 cacerts?

如有任何想法,我们将不胜感激。

Is there a way to tell Java to trust any certificate that windows would have trust?

请查看@synoly的回答

JVM 默认位于 jre/lib/security/cacerts。您也可以设置自己的信任库:

System.setProperty ("javax.net.ssl.trustStore", path_to_your_trustore_jks_file);
System.setProperty ("javax.net.ssl.trustStorePassword", "password");

is there a way to import all trusted certificates from windows truststore to Java's cacerts?

没有任何自动过程,但您可以构建一个程序来从 windows 证书库中提取受信任的授权机构,并导入到配置为在您的应用程序中使用的信任库(不建议修改 cacerts)

//Read Windows truststore
KeyStore ks = KeyStore.getInstance("Windows-ROOT");
ks.load(null, null) ;

解决方案

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

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

我已经用 Java 7 成功测试了它,它运行在信任 self-signed CA 的 64 位 Windows 安装上。

配置安全提供程序

如果上述解决方案适合您(应该),您可以跳过此部分。否则,请检查 Java Cryptography Extension (JCE), which is 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 security provider which is actually a wrapper around the Windows CAPI.

javax.net.ssl.trustStoreType 属性 设置为 Windows-ROOT 指示 Java 引用本机 Windows ROOT 密钥库以获取受信任的证书,其中包括根 CA。 (类似地,将 javax.net.ssl.keyStoreType 设置为 Windows-MY 会告诉 Java 为 user-specific 证书及其相应密钥引用本机 Windows MY 密钥库)。

javax.net.ssl.trustStore

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

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