首页 > 解决方案 > KeyStore 密码和密钥密码的存储位置

问题描述

我使用 windows 和 linux 机器通过 java keytool 创建 java keystore (JKS)。当我运行下面提到的 keytool 命令时:

keytool -genkey -alias TESTSSL -dname "cn=Test.com, ou=testlab, o=myorg, c=UK" -keyalg "RSA" -keysize 2048 -keystore TESTSSL.private.jks -validity 10 -storepass XXXXXXX

它提示输入密钥库密码密钥密码

问题是,我想知道两个密码的存储位置和形式。它是存储在密钥库文件中还是存储在操作系统中的其他位置(如果是这种情况,请知道确切位置)。

任何与此相关的信息高度赞赏。

标签: sslssl-certificatekeystorekeytooljks

解决方案


请注意,您实际上是在创建密钥库的默认格式,假设在您运行时该文件不存在keytool;通过 Java 8,默认是 JKS,但从 9 开始,它是 PKCS12。(命名文件something.jks并不能控制格式,正如命名它something.lollipop会使它成为孩子的甜头。)

如果您-storepass whatever按照您的说明在命令行上指定,它不应该提示输入密钥库密码 - 至少不会在该操作中;如果您keytool再次运行以(重新)使用相同的文件,除非您再次在该命令行上指定它,否则将提示。同样,如果在命令行上指定,根据操作需要时,不应该提示输入密钥密码。-keypass whatever

对于 JKS JCEKS 和 PKCS12,根本不存储密码。这样做是非常不安全的。相反,密码加上“salt”(随机值)由单向“密钥派生”算法处理,以创建用于至少加密密钥库中的私钥条目并进行身份验证的密钥(MAC) 整个密钥库。在 Java 中实现的 PKCS12(弱)加密证书和私钥;JKS 和 JCEKS 没有。在 Java 中实现的 PKCS12 可能不支持不同于存储密码的私钥密码。

如果您在使用密钥库文件时不能或未提供正确的密码,则可能会失败,具体取决于您尝试执行的操作,因此您的工作是记住它们,并在必要时转移或分发它们。如果您需要在难以手动管理的规模上执行此操作,那么可以使用多种密码管理工具(它可以处理所有事物的密码,而不仅仅是 Java 密钥库),而且来源很多。

对于非基于文件的密钥库,例如某些系统上的 PKCS11 或 Windows 上的操作系统提供的存储,如何实现和使用密码(如果有的话)取决于该密钥库的细节,尽管存储密码通常会做不好或不好的做法。


推荐阅读