ssl - KeyStore 密码和 key 密码的存储位置

标签 ssl ssl-certificate keystore keytool jks

我使用 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

提示输入keystore passwordkey password

问题是,我想知道这两个密码存储在哪里以及以何种形式存储。它是存储在 keystore 文件中还是操作系统中的其他地方(如果是这种情况,请知道确切位置)。

非常感谢与此相关的任何信息。

最佳答案

请注意,您实际上是在创建 keystore 的默认 格式,假设该文件在您运行keytool 时不存在;通过 Java 8 默认是 JKS,但从 9 开始是 PKCS12。 (将文件命名为 something.jks 并不能控制格式,就像将其命名为 something.lollipop 一样会使它成为 child 的糖果。)

如果您像您所说的那样在命令行上指定 -storepass whatever,它不应该提示输入 keystore 密码——至少在该操作中不会提示;如果您再次运行 keytool 以(重新)使用同一个文件,that 将提示,除非您再次在 that 命令行中指定它。同样,如果您在命令行上指定 -keypass whatever,则根据操作需要时,它不应提示输入 key 密码。

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

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

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

关于ssl - KeyStore 密码和 key 密码的存储位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55260512/

相关文章:

c# - Azure Web 应用程序中的 "Could not create SSL/TLS secure channel"

java - 如何在JAVA中获取SSL/TLS证书

Java keystore 、SSL 和 CAS

objective-c - 检索 didReceiveAuthenticationChallenge 中的 SSL 证书字段

Java https 服务器

Java异常客户端认证TLS : password must not be null

ios - 验证用于 XMPPFramework iOS 的 SSL/TLS 版本

ssl - 服务器在服务器问候后立即发送加密握手

redirect - nginx HTTPS 重定向

ssl - IIS10 多个站点和多个 SSL 证书的 SSL 配置