当前位置: 首页 > 知识库问答 >
问题:

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

强烨
2023-03-14

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

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

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

当用户被授予对cacerts的写入权限时,问题不会发生。但我们的安全团队不允许我们向普通用户授予对该文件的写访问权限。他们的政策是,在C:驱动器上,用户个人档案之外的任何文件都不应读写。

我们认为我们找到了一个让Java使用Windows信任存储的解决方案。我们添加了标志-Djavax。网ssl。trustStoreType=WINDOWS-ROOT,将其添加到启动脚本中。这迫使Java使用Windows信任存储,用户可以对其进行写入。

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

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

共有3个答案

田琛
2023-03-14

除了javax.net.ssl.trustStoreType=Windows-ROOT我还必须定义javax.net.ssl.trustStore=NUL才能在Windows上工作,即使println(System.get属性('javax.net.ssl.trustStore'))打印null。另见https://newbedev.com/import-windows-certificates-to-java

因为Gradle需要这个,我不得不在我的Gradle中添加以下内容。属性

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

使用这种配置运行Gradle一次之后,我不再需要systemProp。javax。网ssl。trustStore=NUL,直到我添加了另一个maven存储库。然后我得到了一个PKIX路径构建失败:sun。安全供应商。certpath。SunCertPathBuilderException:再次找不到请求目标的有效认证路径。

Gradle似乎将此证书缓存在某个地方,因为在删除了我的用户主页中的. gradle目录后,我还需要system Prop.javax.net.ssl.trustStore=NUL。所以最好把它留在那里。

宋康安
2023-03-14

JSSE参考指南回答了您的问题。

在这种情况下,如果这样的属性存在但它指定的文件不存在,则不使用信任存储。如果不存在javax.net.ssl.trustStore属性,则会搜索默认信任库。如果找到名为java-home/lib/Security/jssecacerts的信任库,则使用它。如果没有,则搜索并使用名为java-home/lib/Security/cacerts的信任存储(如果存在)。

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

王云
2023-03-14

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

你可以试试Windows MY,它应该也确实可以为当前用户访问商店的个人部分;对我来说,没有上面描述的对话框也能正常工作。Personal适用于带有私钥的证书,这些私钥可用于向服务器或收件人验证此计算机/用户,并且在证书中包含仅用于信任另一个系统的证书可能会混淆甚至警告您的更有知识的用户,但它确实适用于我。

 类似资料:
  • 我已经创建了一个Weblogic 12c域,其中包含一个托管服务器,并在该服务器上安装了SOA Suite 12.2。为了能够在我的组合中通过SSL调用REST服务,我创建了一个带有有效证书链的信任库,以便通过SSL连接到REST服务器。 我使用/u01/data/keystores/identitykeystore中的自定义标识存储为SOA托管服务器创建了自定义标识和自定义信任。jks和信任存储

  • 问题内容: 据我了解,密钥库通常会保存私钥/公钥,而信任库通常只保存公钥(并代表你打算与之通信的受信任方的列表)。好吧,这是我的第一个假设,因此,如果这不正确,那么我可能起步并不顺利。 不过,我很想了解使用keytool时如何/何时区分商店。 因此,到目前为止,我已经使用 这将创建我的keystore.ks文件。我回答yes了我是否信任bob的问题,但是我不清楚这是否创建了密钥库文件或信任库文件?

  • 现在,我尝试自己用Java解码文件,并将其写入文件: 这样我就得到了不可读的字符,比如���� . 我还尝试将字节数组转换为字符串: 通过这种方式,我得到了与我从网站下载的相同的六转储,但是没有空格和换行符。在这两种情况下,我得到以下错误: 我很感激你的帮助

  • 我写一个java应用程序连接到数据库与ssl连接使用jTDS。我已经向连接URL添加了属性ssl=需要,以启用ssl连接。 但是我找不到如何配置属性,在那里我可以指定使用哪个信任存储以及它的密码是什么?此处列出了所有jTDS连接属性:http://jtds.sourceforge.net/faq.html 根据此链接,SQL server jdbc驱动程序具有以下类型的属性trustStore和t

  • 我目前正在使用Weblogic 12c(12.1.1.0)。我有一个特殊的问题,我无法解决它。我已将服务器配置为使用自定义密钥存储和信任存储。我用的是-Djavax。网调试=用于调试的ssl。当服务器启动时,部署的应用程序使用https连接到另一个应用程序进行验证。在此连接过程中,使用自定义信任存储验证其证书。 验证按预期完成,然后服务器启动而不报告任何错误。现在,一旦我访问IE上的应用程序并执行

  • 来自服务器端的PEM文件,打开时为以下格式: 我试图将其转换为两个JKS文件(信任存储和密钥存储),我可以通过SSL使用java应用程序调用服务器。 谢谢你在这方面的帮助。