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

时间:2018-03-08 15:10:51

标签: 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一样严格锁定。 / p>

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

3 个答案:

答案 0 :(得分:4)

类型 Windows-ROOT的密钥库 - 它应该访问当前用户的商店的TrustedRootCAs部分(MMC / certmgr.msc中的行,inetopt.cpl中的选项卡)。在我的系统上,这是8.1 Home with UAC at max,但不在域或工作组中,并且没有策略更改(至少没有我授权),Java代码能够插入到Windows-ROOT中 - 但它确实会弹出一个对话框关于"警告:即将安装CA证书等等,这可能是一个安全风险等等等等。我必须点击;如果该流程无法访问工作站' (显示)我不知道会发生什么,如果失败我也不会感到惊讶。确认我的正常ID(本地,管理员)和访客(本地,peon);作为一个独立的系统我没有真正的计算机帐户,只有本地机器'其中IINM实际上是LocalSystem,并且插入不会去那里。

您可以尝试使用 Windows-MY ,这对我来说应该是(再次)当前用户访问商店的个人部分;对我而言,没有上述对话框。对于具有私钥的证书,个人意图,可用于向服务器或收件人验证计算机/用户,并在其中具有仅证书过去相信另一个系统可能会让你知识渊博的用户感到困惑甚至惊慌,但这对我有用。

答案 1 :(得分:0)

JSSE Reference Guide回答了您的问题。

  

在这种情况下,如果存在这样的属性但它指定的文件存在   不,然后没有使用信任库。如果没有javax.net.ssl.trustStore   属性存在,然后搜索默认信任库。如果一个   找到名为java-home / lib / security / jssecacerts的truststore,它是   用过的。如果没有,那么名为java-home / lib / security / cacerts的信任库   搜索并使用(如果存在)。

如果您没有权限覆盖这两个文件jssecacerts或cacerts中的一个,则您的问题的答案为否。

答案 2 :(得分:0)

除了 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

使用此配置运行 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。所以最好把它留在那里。