【问题标题】:Java's keytool doesn't prompt for key passwordJava 的 keytool 不提示输入密钥密码
【发布时间】:2021-06-04 02:31:44
【问题描述】:

Java 的keytool 有一个名为-keypass 的参数,除了用于整个密钥存储的密码之外,它还允许您设置一个(单独的)密码来保护您的私钥。

根据文档:

-keypass的值是用来保护生成的密钥对的私钥的密码。如果未提供密码,则会提示用户输入密码。如果您在提示符处按下 Return 键,则密钥密码将设置为与密钥库密码相同的密码。 -keypass 值必须至少包含六个字符。

但是,当我在调用此命令时省略密码时,我似乎根本没有收到提示,至少当它与 -genkeypair 结合使用以生成 RSA 密钥对时。相反,我只是获得一般帮助页面。如果我使用"" 强制输入“空”密码,那么它(正确地)告诉我密码至少应为 6 个字符。

有没有办法强制keytool 提示输入特定于密钥的密码,而不是根据-genkeypair 的文档在命令行中提供它?


我已经针对 Java 11 LTS 进行了测试:

keytool -genkeypair -alias test1 -keyalg RSA -keysize 4096 -sigalg SHA256withRSA -keystore test.pfx -storepass test1234
        -keypass

keytool -genkeypair -alias test1 -keyalg RSA -keysize 4096 -sigalg SHA256withRSA -keystore test.pfx -storepass test1234
        -keypass ""

两者似乎都不起作用;如您所见,我已经将-keypass 参数移到了末尾,因此它无法将参数作为密码吞噬。

【问题讨论】:

    标签: java passwords keystore prompt keytool


    【解决方案1】:

    Java 11 的默认密钥库类型为 PKCS12,始终假定密钥库密码和密钥密码相同,因此不会提示您输入 (documentation)

    如果您需要使用密钥密码来满足您的要求,您可以使用其他密钥库类型,例如 jksjceks

    注意:如果您使用的是 jks 或 jceks,java 会显示警告消息:

    JKS 密钥库使用专有格式。建议迁移到行业标准格式 PKCS12


    如果你输入:

    keytool -genkeypair -keyalg RSA -keysize 2048 -keystore double.pfx -storepass Storepass -keypass Keypass
    

    您将收到以下警告:

    Warning:  Different store and key passwords not supported for PKCS12 KeyStores.
    

    请注意,PKCS#12 密钥存储本身确实支持多个密码:它们对多个部分(密钥、证书)和 KeyBag 等具有单独的派生。只是缺少 Java 支持。我在解析几个关键存储并查看格式后发现了这一点。

    【讨论】:

    • 不幸的是,当我解析 PKCS#12 密钥库时,这是不正确的。
    • 如果您可以在文档中指出这一点,那么我很乐意查看。如前所述,我可以设置密码,但我无法从提示中进行设置。
    • 文档没有明确说明,但文档中有一条声明Every implementation of the Java platform is required to support the following standard KeyStore type PKCS#12blog 提到了这一点。
    • 是的,我知道,但是为什么您认为 PKCS#12 不允许您为密钥设置单独的密码?
    • 我猜这是 PKCS#12 的非书面标准。我知道这不是一个具体的答案,但我能找到的最好的答案是在 Java 的 keytool document 中,上面写着 - For example, most third-party tools require storepass and keypass in a PKCS #12 keystore to be the same. To create a PKCS#12 keystore for these tools, always specify a -destkeypass that is the same as -deststorepass.