【问题标题】:Import Windows certificates to Java将 Windows 证书导入 Java
【发布时间】:2017-05-06 13:22:54
【问题描述】:

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

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

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

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

任何想法将不胜感激。

【问题讨论】:

    标签: java ssl certificate truststore


    【解决方案1】:

    有没有办法告诉 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) ;
    

    【讨论】:

    • 感谢您的回复。 (1) 那么是否可以使用您提供的 sn-p 将 Windows 密钥库中的所有证书添加到运行时的 Java 信任库中? (我正在考虑我的java服务器启动时这样做)(2)为什么不建议修改cacerts?
    • 1) 是的,这是可能的,但更改将取决于何时以及如何加载 trustore
    • 2) 因为 cacerts 在 JVM 发行版之间会发生变化。如果系统管理员安装了新的 JVM,您将丢失所有更改。
    【解决方案2】:

    解决方案

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

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

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

    配置安全提供者

    如果上述解决方案适合您(它应该),您可以跳过本节。否则,请检查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。 NONE.

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

    【讨论】:

    • 非常新的答案,但已针对我的用例进行了测试和批准(HTTPS 公司代理背后的 Intellij)
    • 您确定“某些用户报告此方法对他们不起作用”上的链接。对吗?
    • @palacsint 奇怪。我记得在写答案时仔细检查了链接,但你当然是对的,它似乎完全不相关。我想我会把它从答案中删除。
    • 将windows系统环境变量JAVA_OPTS设置为“-Djavax.net.ssl.trustStore=NONE -Djavax.net.ssl.trustStoreType=Windows-ROOT”,然后这将对你所有的JVM生效开始。
    • 导航到哪里来实际设置这些属性?
    猜你喜欢
    • 2014-11-10
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2014-05-10
    • 2010-10-21
    相关资源
    最近更新 更多