2013-07-23 59 views
5

我有许多Java应用程序通过SSL连接连接到其他应用程序和服务。在开发过程中,我可以通过使用JVM ARGS指定密钥库/信任库使用,密码:运行Java进程时隐藏JKS密钥库/信任库密码

-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参数意味着查看进程列表的任何人都能够以明文形式查看密码。

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

任何建议非常感谢。

回答

8

首先,你可以考虑隐藏来自其他用户的输出的PS,看到这些问题:

其次,输入你的证书(与假设私钥)变成lib/security/cacerts将毫无意义:它是默认的信任库,但不是默认的密钥库(fo r没有默认值)。

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

如您所说,Base 64编码仅仅是一种编码。再一次,这是毫无意义的,因为任何人都可以解码它(例如based64 -d)。 某些工具(如Jetty)可以将密码存储在混淆模式中,但这不会比Base 64编码更具抵抗性。如果有人看着你的肩膀,这很有用,但就是这样。

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

真正重要的是要确保密钥库文件本身受到不希望读取它的用户的保护。它的密码是为了在其他人可以读取的情况下保护容器,或者当你想在交互模式下保护访问时。由于您无法真正避免在无人照管模式下在机器上清楚地使用密码,因此密码困难并不重要,相反,保护文件本身更重要。 (目前还不清楚你的应用程序是否是交互式的,但我想很少有用户可以交互式输入-Djavax.net.ssl....=...。)

如果您无法使您的代码适应文件读取,请将您的密钥库和密钥密码更改为不介意“ABCD”的密码,并确保您保护此密钥库文件的读取访问权限:最终这才是真正重要的。从辅助文件中读取密码本身仅仅是将问题推迟一步,因为密码文件和密钥库文件可能彼此相邻存储(并且由未授权方复制)。

+0

同意,在某些地方,必须存储密钥或密码。我想这是我们必须用流程/用户帐户/文件权限解决的问题。谢谢! – Matt