将 Windows 证书导入 Java

2022-09-02 05:37:19

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

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

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

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

任何想法将不胜感激。


答案 1

溶液

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

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

我已经在Java 7中成功地测试了这一点,它运行在64位Windows安装上,该安装信任自签名CA。

配置安全提供程序

如果上述解决方案适合您(应该),则可以跳过本节。否则,请检查与现代 JDK 捆绑在一起的 Java 加密扩展 (JCE) 的设置。JDK 安装应具有一个属性文件,其中包含安全提供程序的列表。该文件的位置可能因Java版本而异。我的位于.在该文件中,找到名称以 开头的一组属性。其中一个条目应设置为 。"%JAVA_HOME%\jre\lib\security\java.security"security.providersun.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,这是一个安全提供商,实际上是Windows CAPI的包装器。

设置该属性以指示 Java 引用可信证书(包括根 CA)的本机 Windows 根密钥库。(同样,设置为告诉 Java 引用本机 Windows MY 密钥库以获取特定于用户的证书及其相应的密钥)。javax.net.ssl.trustStoreTypeWindows-ROOTjavax.net.ssl.keyStoreTypeWindows-MY

javax.net.ssl.trustStore

如果该属性设置为 ,则期望 忽略 的值,并且可以将其设置为 例如 。javax.net.ssl.trustStoreTypeWindows-ROOTjavax.net.ssl.trustStoreNONE

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


答案 2

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

请检查@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");

有没有办法将所有受信任的证书从Windows信任库导入到Java的cacerts?

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

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