将JRE设置为使用Windows信任库,特别是用户的信任库

Bag*_*era 3 java windows ssl certificate truststore

摘要:Java选项“ Djavax.net.ssl.trustStoreType = WINDOWS-ROOT”允许Java将Windows信任存储区用于计算机帐户。可以使用什么选项将Windows信任存储区用作用户帐户

我们有一个在Windows客户端上运行的Java应用程序。该应用程序从各种来源获取数据,其中一些来源使用默认cacerts文件中没有的证书。

当用户选择访问外部数据的项目时,系统会提示他们下载外部站点的证书。由于我们的安全设置,cacerts文件对于用户是只读的。由于JRE无法将证书导入到cacerts中,因此不会下载外部文件。并提示用户反复下载证书。

当授予用户对cacerts的写入权限时,不会发生此问题。但是我们的安全团队不会让我们向普通用户授予对该文件的写入权限。他们的政策是,用户自己的配置文件之外的C:驱动器上的任何文件都不应读写。

我们认为我们找到了一种解决方法,可以使Java使用Windows信任库。我们在启动脚本中添加了标志“ Djavax.net.ssl.trustStoreType = WINDOWS-ROOT”。这迫使Java使用Windows信任存储,用户可以对其进行写入。

不幸的是,用户只能写入其证书存储区,而不能写入计算机的证书存储区。当我们以管理员身份运行该应用程序时,证书将导入到计算机的存储中。此后,不提示普通用户下载证书。但是,如果我们不使用管理员权限一次运行该证书,则不会导入该证书,因为Java尝试写入Windows 计算机帐户存储,该帐户与cacerts一样被严格锁定。

是否有一个标志可以强制Java使用整个Windows信任存储,而不仅仅是计算机帐户的存储?

dav*_*085 6

Windows-ROOT类型的密钥库应该可以工作-应该为当前用户访问商店的TrustedRootCAs部分(MMC / certmgr.msc中的行,inetopt.cpl中的选项卡)。在我的系统上,该系统最大支持8.1个UAC,但没有在域或工作组中使用UAC,并且没有策略更改(至少没有我授权的更改),Java代码能够插入Windows-ROOT中-但是它确实会弹出一个对话框我必须单击“警告:即将安装CA证书等等,这可能是安全隐患”。如果该过程无法访问“工作站”(显示),我将不知道会发生什么,如果失败,也不会感到惊讶。用我的普通ID(本地,管理员)和Guest(本地,牡丹)确认;作为一个独立的系统,我没有真实的计算机帐户,只有IINM实际上是LocalSystem的“本地计算机”,插入的文件也没有。

您可以改用Windows-MY,它应该(对我而言)确实(对于)当前用户访问商店的“个人”部分;对我而言,无需上述对话框即可工作。Personal 专用于带有私钥的证书,这些私钥可用于向服务器或收件人验证机器/用户,并且在那里仅用于信任另一个系统的证书可能会混淆甚至警告您较有知识的用户,但确实对我有用。

  • 以防万一有人来这里寻找 Gradle 的解决方案(就像我一样),在项目根目录上创建一个名为“gradle.properties”的文件,其中包含“systemProp.javax.net.ssl.trustStoreType=Windows-ROOT”行。 (5认同)
  • OpenJdk 11 源代码中有执行此操作的代码:https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/SunMSCAPI.java #L88 (3认同)

Adr*_*c55 6

此外javax.net.ssl.trustStoreType=Windows-ROOT,我还必须定义javax.net.ssl.trustStore=NUL它才能在 Windows 上工作,即使是println(System.getProperty('javax.net.ssl.trustStore'))打印的null. 另请参阅https://newbedev.com/import-windows-certificates-to-java

因为 Gradle 需要这个,所以我必须将以下内容添加到我的gradle.properties

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

使用此配置运行 Gradle 一次后,我不再需要systemProp.javax.net.ssl.trustStore=NUL, 直到我添加了另一个 Maven 存储库。然后我PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target又得到了一个。

看来Gradle在某个地方缓存了这个证书,因为删除.gradle我的用户主目录中的目录后,我还需要systemProp.javax.net.ssl.trustStore=NUL再次使用。所以最好把它留在那里。