我正在尝试使用从 Ionos Web 主机下载的更新的 SSL 证书来更新密钥库。
我在他们的 PFX 创建工具中输入我的私钥和密码后下载了 PFX 文件,并选中了“包含中间证书”选项(这是我过去一直做的)。
当我运行 keytool 来更新密钥库时,这是我使用的命令:
keytool -importkeystore -srckeystore example.com_private_key.pfx -srcstoretype pkcs12 -destkeystore mykeystore.jks -deststoretype JKS
它要求我输入一些密码,然后询问我是否要覆盖别名。输入“是”后,它给了我“无效的空输入”错误。
我还尝试创建一个新的密钥库而不是更新旧的密钥库,输入密码后我收到了相同的错误。
我仍然保留着去年的旧 PFX 文件,并且在使用该文件创建密钥库时 keytool 不会给出错误。
我还尝试重新颁发私钥并重新下载带或不带中间证书选项的 PFX,但遇到了相同的错误。
我不知道从哪里开始找出如何克服这个问题。我唯一的假设是新的 PFX 文件有问题,但不知道如何验证它或排除故障。
有什么建议吗?
编辑:
我决定在 PFX 文件上运行 keytool -list,这就是输出
>keytool -list -v -keystore example.com_private_key.pfx
Enter keystore password:
Keystore type: PKCS12
Keystore provider: SUN
Your keystore contains 1 entry
Alias name: *.example.com
Creation date: 22-Mar-2023
Entry type: PrivateKeyEntry
*******************************************
*******************************************
通常这会列出一大堆东西,但这似乎是空的。
按照@dave_thompson_085的建议,我能够解决这个问题。
来自
Invalid null input
的 keytool
错误是由于 PFX 文件在其
friendlyName
属性中缺少 localKeyID
和 Bag Attributes
造成的。 Bag Attributes
被设置为 <Empty Attributes>
的值,而不是正确的值。
您可以使用 OpenSSL 从 bad PFX 文件中获取信息来检查这一点。
运行:
openssl pkcs12 -info -nokeys -in "C:\example.com_private_key.pfx"
您将得到如下所示的输出:
MAC Iteration 1024
MAC verified OK
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 1024
Certificate bag
Bag Attributes: <Empty Attributes>
subject=/CN=*.example.com
issuer=/C=US/O=Example CA/OU=www.exampleca.com/CN=Example CA
-----BEGIN CERTIFICATE-----
MIICwDCCAmagAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtjELMAkGA1UEBhMCVVMx
...
...
zYnRrIjp7ImFjdGlvbiI6IlJPTEVfQ09NUExFVEVEIiwicmVwb3NpdG9yeSI6Imh
0dHA6024Ly9leGFtcGxlLmNvbSJ9fSwidGltZXN0YW1wIjoxNTcxMTQxMjg0fQ==
-----END CERTIFICATE-----
Certificate bag
Bag Attributes: <Empty Attributes>
subject=/C=US/O=Example CA/OU=www.exampleca.com/CN=Example CA
issuer=/C=US/O=Example CA/OU=www.exampleca.com/CN=Example CA Root
-----BEGIN CERTIFICATE-----
MIICwDCCAmagAwIBAgIBATANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJVUzET
...
...
Qnl0ZXMgYW5kIEhhY2thdGhvbi9yZWFsIENBIHRlc3QgaW5zdGFuY2Ugc3lzLg==
-----END CERTIFICATE-----
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 1024
您将看到两个证书的
Bag Attributes
的值为 <Empty Attributes>
。
为了解决此问题,我使用 OpenSSL 手动创建了一个新的 PFX 文件。
首先,从您的 SSL 提供商获取以下文件:
example.com_private_key.key
)example.com_ssl_certificate.cer
)example.com_ssl_certificate_INTERMEDIATE.cer
)然后使用 OpenSSL 通过运行以下命令来创建新的 PFX 文件:
openssl pkcs12 -export -out "C:\example.com_private_key_fixed.pfx" -name "*.example.com" -inkey "C:\example.com_private_key.key" -in "C:\example.com_ssl_certificate.cer" -certfile "C:\example.com_ssl_certificate_INTERMEDIATE.cer" -caname "Example Certificate Authority Friendly Name"
将属性替换为适当的文件路径和
friendlyName
值。
根据 Dave 的说法,不需要
friendlyName
属性,但我将它们包含在内,因为它们位于我上次工作的 PFX 文件中。
您可以使用 OpenSSL 来验证
Bag Attributes
是否已正确设置。
运行:
openssl pkcs12 -info -nokeys -in "C:\example.com_private_key_fixed.pfx"
您将得到如下所示的输出:
MAC Iteration 1024
MAC verified OK
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 1024
Certificate bag
Bag Attributes:
localKeyID: 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10
friendlyName: *.example.com
subject=/CN=*.example.com
issuer=/C=US/O=Example CA/OU=www.exampleca.com/CN=Example CA
-----BEGIN CERTIFICATE-----
MIICwDCCAmagAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtjELMAkGA1UEBhMCVVMx
...
...
zYnRrIjp7ImFjdGlvbiI6IlJPTEVfQ09NUExFVEVEIiwicmVwb3NpdG9yeSI6Imh
0dHA6024Ly9leGFtcGxlLmNvbSJ9fSwidGltZXN0YW1wIjoxNTcxMTQxMjg0fQ==
-----END CERTIFICATE-----
Certificate bag
Bag Attributes:
friendlyName: Example Certificate Authority Friendly Name
subject=/C=US/O=Example CA/OU=www.exampleca.com/CN=Example CA
issuer=/C=US/O=Example CA/OU=www.exampleca.com/CN=Example CA Root
-----BEGIN CERTIFICATE-----
MIICwDCCAmagAwIBAgIBATANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJVUzET
...
...
Qnl0ZXMgYW5kIEhhY2thdGhvbi9yZWFsIENBIHRlc3QgaW5zdGFuY2Ugc3lzLg==
-----END CERTIFICATE-----
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 1024
您将看到
Bag Attributes
现在已正确设置。 PFX 文件现在也应该能够使用 keytool
导入,而不会出现“无效的空输入”错误。
我不知道这是否重要,但是我从网络主机下载的最后一个工作
PFX文件中的中级证书的
friendlyName
与中级证书的 subject
属性完全相同,但具有斜杠替换为逗号并且顺序相反。
所以
`subject=/C=US/O=Example CA/OU=www.exampleca.com/CN=Example CA`
将变成:
`-caname "CN=Example CA,OU=www.exampleca.com,O=Example CA,C=US"`
输入证书颁发机构的
friendlyName
时。
再次强调,
friendlyName
可能并不重要,但我认为值得一提,因为这是我在查看由我的网络主机生成的旧工作PFX文件时注意到的。
再次感谢@dave_thompson_085!刚刚更新了今年的 SSL 证书,但我的网络托管服务商仍然没有解决他们的 PFX 文件问题。只好再次用 OpenSSL DIY 一下。欢呼帮助!