【问题标题】:Hide JKS keystore / truststore password when running Java process运行 Java 进程时隐藏 JKS 密钥库/信任库密码
【发布时间】:2013-07-23 16:02:07
【问题描述】:

我有许多 Java 应用程序,它们通过使用 SSL 保护的连接连接到其他应用程序和服务。在开发过程中,我可以使用 JVM args 指定要使用的密钥库/信任库和密码:

-Djavax.net.ssl.trustStore=certificate.jks 
-Djavax.net.ssl.trustStorePassword=mypassword 
-Djavax.net.ssl.keyStore=certificate.jks 
-Djavax.net.ssl.keyStorePassword=mypassword 
-Djavax.net.ssl.keyStoreType=jks

这非常有效。但是,在生产时需要隐藏密码,使用 JVM args 意味着任何查看进程列表的人都可以看到明文密码。

有没有一种简单的方法来解决这个问题?我考虑将证书导入 JRE 的 lib/security/cacerts 文件,但我的理解是这仍然需要密码。一种选择是将加密的密码存储在文件中,然后让应用程序即时读取和解密,但这将涉及更改和重新发布所有应用程序(其中有很多),所以我如果可能的话,宁愿避免这种情况。 javax.net.ssl 库是否有任何对加密密码的本机内置支持(即使它像 base64 编码一样简单,或者任何使密码不是明文的东西)?

非常感谢任何建议。

【问题讨论】:

    标签: ssl ssl-certificate keystore truststore


    【解决方案1】:

    首先,您可以考虑对其他用户隐藏 ps 输出,请参阅以下问题:

    其次,将您的证书(假设使用私钥)导入lib/security/cacerts 是没有意义的:它是默认的信任库,但不是默认的密钥库(没有默认值)。

    第三,您永远无法真正“加密”您的应用程序将要使用的密码(在非交互模式下)。它必须被使用,所以如果它被加密,它的加密密钥需要在某个时候以明文形式提供。因此,这有点毫无意义。

    正如您所建议的,Base 64 编码只是一种编码。同样,这是毫无意义的,因为任何人都可以解码它(例如based64 -d)。 某些工具,例如 Jetty,可以以模糊模式存储密码,但这并不比 base 64 编码更具抵抗力。如果有人在你的肩膀上看着,这很有用,但就是这样。

    您可以调整您的应用程序以从文件中读取密码(纯文本或混淆)。您当然需要确保未经授权的各方无法读取此文件。

    真正重要的是确保密钥库文件本身受到保护,不会受到不打算阅读的用户的影响。其密码旨在保护容器,以防其他人可以读取或您想要保护交互模式下的访问。由于您无法真正避免在无人值守模式下在机器上使用明文密码,因此设置难密码并没有什么意义,而保护文件本身更为重要。 (目前尚不清楚您的应用程序是否具有交互性,但我猜应该很少有用户会交互输入-Djavax.net.ssl....=...。)

    如果您无法调整您的代码以从文件中读取,请将您的密钥库和密钥密码更改为您不介意公开的密码,例如“ABCD”,并确保保护对此密钥库文件的读取访问权限:那就是到底什么才是真正重要的。从辅助文件中读取密码本身只是将问题推迟了一步,因为密码文件和密钥库文件很可能彼此相邻存储(并被未经授权的一方复制在一起)。

    【讨论】:

    • 同意,在某个时候,某个地方,必须存储一个密钥或密码。我想这是我们必须通过进程/用户帐户/文件权限来解决的问题。谢谢!
    猜你喜欢
    • 2013-04-12
    • 2021-11-02
    • 1970-01-01
    • 2014-11-20
    • 2017-07-23
    • 2010-09-24
    • 2018-11-11
    • 2021-08-31
    • 1970-01-01
    相关资源
    最近更新 更多