将Windows证书导入Java

Yoa*_*nda 7 java ssl certificate truststore

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

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

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

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

任何想法将不胜感激.

Syn*_*oli 11

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

javax.net.ssl.trustStore=NUL
javax.net.ssl.trustStoreType=Windows-ROOT
Run Code Online (Sandbox Code Playgroud)

我已成功使用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");
Run Code Online (Sandbox Code Playgroud)

说明

javax.net.ssl.trustStoreType

在Windows上,Java附带了SunMSCAPI,这是一个安全提供程序,实际上是Windows CAPI的包装器.

设置该javax.net.ssl.trustStoreType属性以Windows-ROOT指示Java引用可信证书的本机Windows ROOT密钥库,其中包括根CA. (类似地,设置javax.net.ssl.keyStoreTypeWindows-MY告诉Java引用本机Windows MY密钥库以获取用户特定证书及其相应的密钥).

javax.net.ssl.trustStore中

如果javax.net.ssl.trustStoreType属性设置为Windows-ROOT,则可以预期javax.net.ssl.trustStore忽略值,并且可以将其设置为e.G.NONE.一些用户报告说这种方法对他们不起作用.

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

  • 非常新的答案,但经过测试和批准用于我的用例(Intellij在HTTPS公司代理后面) (2认同)
  • 将Windows系统环境变量JAVA_OPTS设置为“-Djavax.net.ssl.trustStore=NONE -Djavax.net.ssl.trustStoreType=Windows-ROOT”,然后这将对您启动的所有JVM生效。 (2认同)

ped*_*ofb 5

有没有办法告诉 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");
Run Code Online (Sandbox Code Playgroud)

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

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

//Read Windows truststore
KeyStore ks = KeyStore.getInstance("Windows-ROOT");
ks.load(null, null) ;
Run Code Online (Sandbox Code Playgroud)