将Windows证书导入Java
我有一个java服务器试图通过SSL连接到外部Ldap服务器(作为客户端,以执行查询)。
我连接时遇到问题,因为他们在连接时发送给我的证书只在我的本地Windows Truststore中受信任,但在java truststore(cacerts)中不存在。
有没有办法告诉Java信任Windows可信任的任何证书?
或者,有没有办法将所有受信任的证书从Windows信任库导入Java的cacerts?
任何想法将不胜感激。
有没有办法告诉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) ;
解
在Windows上,设置以下JVM属性:
javax.net.ssl.trustStore=NUL javax.net.ssl.trustStoreType=Windows-ROOT
我已成功使用Java 7对其进行了测试,Java 7在64位Windows安装上运行,该安装信任自签名CA.
配置安全提供程序
如果上述解决方案适合您(应该),您可以跳过本节。 否则,请检查Java Cryptography Extension (JCE)的设置,它与现代JDK捆绑在一起 。 您的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 ,这是一个安全提供程序,它实际上是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。 NONE
。 一些用户报告说这种方法对他们不起作用。
此问题的一个常见解决方法是将javax.net.ssl.trustStore
设置为NONE
,然后创建文件名为NONE
的虚拟文件。 如果您发现自己受到这个怪癖的影响,请尝试将javax.net.ssl.trustStore
设置为NUL
这样您就不必创建任何虚拟文件。