Java的keytool不提示输入密钥密码

Maa*_*wes 4 java passwords prompt keystore keytool

Javakeytool有一个名为 的参数-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
Run Code Online (Sandbox Code Playgroud)

或者

keytool -genkeypair -alias test1 -keyalg RSA -keysize 4096 -sigalg SHA256withRSA -keystore test.pfx -storepass test1234
        -keypass ""
Run Code Online (Sandbox Code Playgroud)

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

alw*_*arn 11

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

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

注意:如果您使用 jks 或 jceks,java 将向您显示一条警告消息:

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


如果您输入:

keytool -genkeypair -keyalg RSA -keysize 2048 -keystore double.pfx -storepass Storepass -keypass Keypass
Run Code Online (Sandbox Code Playgroud)

您将收到以下警告:

Warning:  Different store and key passwords not supported for PKCS12 KeyStores.
Run Code Online (Sandbox Code Playgroud)

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

  • 不仅仅是第三方工具。Java 本身不支持通过 JSSE 系统属性输入密钥密码。您必须初始化自己的“SSLContext”和“KeyManager”等来支持它。这确实是相当困难的。 (2认同)