将Windows证书导入Java

时间:2016-12-21 07:31:19

标签: java ssl certificate truststore

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

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

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

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

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:10)

解决方案

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

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

我已经成功使用Java 7对其进行了测试,Java 7运行在64位Windows安装上,该安装信任自签名CA.

配置安全提供程序

如果上述解决方案适合您(应该),您可以跳过本节。否则,请检查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引用可信证书的本机Windows ROOT密钥库,其中包括根CA. (同样,将javax.net.ssl.keyStoreType设置为Windows-MY会告诉Java引用本机Windows MY密钥库以获取特定于用户的证书及其相应的密钥。

javax.net.ssl.trustStore中

如果javax.net.ssl.trustStoreType属性设置为Windows-ROOT,则可以预期忽略javax.net.ssl.trustStore的值,并且可以将其设置为e。 G。 NONESome users report that this approach doesn’t work for them though.

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

答案 1 :(得分:1)

  

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

不,您必须在jre/lib/security/cacerts使用JVM默认值或设置您自己的信任库:

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

有没有办法将所有可信证书从windows truststore导入Java的cacerts?

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

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