我有许多Java应用程序,它们通过SSL保护的连接连接到其他应用程序和服务。在开发过程中,我可以使用JVM参数指定要使用的密钥库/信任库和密码:
-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编码,或任何使密码不是明文的东西)?
非常感谢任何建议。
首先,您可以考虑对其他用户隐藏ps输出,参见以下问题:
其次,将您的证书(假设使用私钥)导入lib/Security/cacates
将毫无意义:它是默认的信任库,但不是默认的密钥库(没有默认值)。
第三,您永远无法真正“加密”您的应用程序将要使用的密码(在非交互模式下)。它必须被使用,所以如果它被加密了,它的加密密钥需要在某个时候以明文形式提供。因此,这有点没有意义。
正如您所建议的,Base 64编码只是一种编码。同样,这是毫无意义的,因为任何人都可以解码它(例如based64-d
)。一些工具,如Jetty,可以以模糊模式存储密码,但这并不比64进制编码更具抵抗力。如果有人从你的肩膀后面看,这很有用,但仅此而已。
您可以调整应用程序以从文件中读取密码(纯文本或模糊文本)。您当然需要确保未经授权的各方无法读取此文件。
真正重要的是确保密钥库文件本身受到保护,不会被非授权用户读取。它的密码是为了保护容器,以防其他人可以读取它,或者当您希望在交互模式下保护访问时。因为你无法避免在无人值守的机器上使用明文密码,所以设置一个难懂的密码没有什么意义,更重要的是保护文件本身。(不清楚您的应用程序是否是交互式的,但我猜应该很少有用户会输入< code>-Djavax.net.ssl....=...交互地。)
如果您无法调整代码以从文件中读取,请将密钥库和密钥密码更改为您不介意公开的密码,如“ABCD”,并确保保护此密钥库文件的读取权限:这才是真正重要的。从辅助文件读取密码本身只是将问题推迟一步,因为密码文件和密钥库文件很可能彼此相邻存储(并由未经授权的一方一起复制)。
应用程序A调用webservice应用程序B 相互认证。 我们有申请证书。由名为C的CA签名的证书。这是jks文件中唯一的单一证书内容 我们使用了相同的jks文件作为应用程序密钥库和信任库。它运转良好。 我的理解是,当应用程序A调用appB时,appB发送其证书,该证书也由名为C的CA签名。appA接受该证书,因为在appA TrsStore中,我们有另一个证书,该证书由名为C的CA签名。 然后,
我试图转换JKS密钥存储到BKS密钥存储使用转换密钥存储实用程序(https://code.google.com/p/zip-signer/downloads/detail?name=convert-keystore-1.2.zip 在执行命令时 我得到以下错误: 密钥存储是通过Java密钥存储实用程序创建的: keytool-genkey-alias myAlias-keyalg RSA-key
问题内容: 我想知道是否存在Java中使用的JKS密钥存储格式的正式规范?我想编写一个往返PKCS#12的转换器,但不是用Java编写的,因此不幸的是,不能选择使用keytool或Java代码。 在一个十六进制编辑器中查看一个告诉我,它可能不是ASN.1。在我开始研究OpenJDK之前,尝试对格式进行逆向工程,是否有人知道是否存在规范?到目前为止我找不到任何东西,将不胜感激! 问题答案: 我认为您
问题内容: 据我了解,密钥库通常会保存私钥/公钥,而信任库通常只保存公钥(并且代表您打算与之通信的受信任方的列表)。好吧,这是我的第一个假设,因此,如果这不正确,那么我可能起步并不顺利… 我很想了解使用keytool时如何/何时区分商店。 因此,到目前为止,我已经使用 这将创建我的keystore.ks文件。我回答了我是否信任bob的问题,但是我不清楚这是否创建了密钥库文件或信任库文件?我可以将我
我正在使用SSL握手连接到URL。为此,我生成了一个. csr文件并对其进行了签名。签名后,我创建了一个my.jks文件,其中包含3个条目 < li >签名的客户端证书 < li >私钥 < li>CA 我使用jetty作为服务器,我专门将密钥库和信任库设置为相同的jks文件,如下所示 它工作正常。但是这是正确的方法吗?我认为密钥库应该包含客户端证书和私钥,信任库应该包含CA。但是当我尝试这样做时
问题内容: 我正在编写使用SSL的应用程序。因此,我有一个虚拟密钥库和一个虚拟信任库,我想提供给我的客户。是否有任何默认文件夹可将它们放入我的发行版中?例如docs,lib,bin …等。密钥库通常放在服务器上的什么地方,信任库通常放在客户端的什么地方? 谢谢 问题答案: 在Java中,根据JSSE参考指南,没有默认值,默认值为“ jssecacerts(如果存在),否则为cacerts ”。 一