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

2022-09-03 13:49:18

摘要:Java 选项允许 Java 对计算机帐户使用 Windows 信任存储区。哪个选项允许它对用户帐户使用 Windows 信任存储?-Djavax.net.ssl.trustStoreType=WINDOWS-ROOT

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

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

当用户被授予 对 的写入权限时,问题不会发生。但是,我们的安全团队不允许我们将对该文件的写入权限授予普通用户。他们的策略是,驱动器上除用户自己的配置文件之外的任何文件都不应是可读写的。cacertsC:

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

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

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


答案 1

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

您可以尝试使用Windows-MY,它应该并且对我来说确实访问了(再次)当前用户商店的个人部分;对我来说,无需上述对话框即可工作。Personal适用于具有私钥的证书,这些私钥可用于向服务器或收件人验证计算机/用户,并且其中只有一个仅用于信任另一个系统的证书可能会使您更了解的用户感到困惑甚至警报,但它确实对我有用。


答案 2

此外,我还必须定义这在Windows上工作,即使打印了。另请参见 https://newbedev.com/import-windows-certificates-to-javajavax.net.ssl.trustStoreType=Windows-ROOTjavax.net.ssl.trustStore=NULprintln(System.getProperty('javax.net.ssl.trustStore'))null

由于我需要为Gradle提供此功能,因此我必须将以下内容添加到我的:gradle.properties

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

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

似乎Gradle将此证书缓存在某个地方,因为在删除用户主页中的目录后,我还需要再次。因此,最好将其留在那里。.gradlesystemProp.javax.net.ssl.trustStore=NUL