我的密钥库包含 2 个密钥,我想运行 2 个命令,这两个命令将根据 alias/
friendlyName
输出每个相应的密钥。目前,以下命令将两个密钥输出到 TESTKEY.key
文件。我已阅读 openssl 文档并尝试使用 -name
参数,后跟每个各自的友好名称,但它仍然将两个密钥输出到一个文件。 winpty
用于 gitbash
winpty openssl pkcs12 -in KEYSTORE_NAME.p12 -out TESTKEY.key -nodes -nocerts
尝试使用
-name
但产生相同的输出:
winpty openssl pkcs12 -in KEYSTORE_NAME.p12 -name friendly_name_one -out KEY_ONE.key -nodes -nocerts
我无法用openssl解决这个问题,但是Java
keytool
在这方面似乎更强大。以下命令导出私钥和相应的证书。可以玩玩(keytool -importkeystore --help
)
keytool -importkeystore -srckeystore /path/to/cert/combined.p12 -srcalias http_ca -destkeystore /path/to/cert/single.p12
要获取 srcalias,请使用以下命令之一:
keytool -list -keystore /path/to/cert/combined.p12
或
openssl pkcs12 -in /path/to/cert/combined.p12 -info -nodes
您无法使用
keytool
从密钥库导出私钥。
您可以使用
openssl
,但它会为您提供所有私钥。例如:
$ openssl pkcs12 -in ${keystore_file} -nocerts -nodes -passin pass:${keystore_password}
Bag Attributes
friendlyName: alias1
localKeyID: 62 44 56 F7 91 F2 8B 9B 44 7C 39 31 31 55 38 32 32 31
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
NOUCAQACAwDZhwIDAQABAfIIAQICAO8CAgDpAgIAkQICAMECAgPP
-----END PRIVATE KEY-----
Bag Attributes
friendlyName: alias2
localKeyID: 62 44 58 F7 91 F2 8B 9B 44 7C 39 31 31 55 38 32 32 30
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MCUCAQACAwDZhwIDAQABAgIIAQICAO8CAgDpAgIAkQICAMECAgDH
-----END PRIVATE KEY-----
Bag Attributes
friendlyName: alias3
localKeyID: 62 45 58 F7 91 F2 8B 9B 44 7C 39 31 31 55 38 32 32 30
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MDUCAQACAwDZhwIDAQABAgIIAQICAO8CAgDpAgIAkQICAMECAgDI
-----END PRIVATE KEY-----
您可以使用
csplit
拆分 friendlyName
以提取所需的私钥。例如获取 alias2
的私钥:
targetAlias="alias2"
tmp_dir=$(mktemp -d -p .)
openssl pkcs12 -in ${keystore_file} -nocerts -nodes -passin pass:${keystore_password} \
| csplit - -s "/friendlyName:/" "{*}" -f ${tmp_dir}/xx
if grep -q -l "friendlyName: ${targetAlias}" ${tmp_dir}/xx*; then
cat $(grep -l "friendlyName: ${targetAlias}" ${tmp_dir}/xx*)
else
echo "Could not find ${targetAlias} in ${keystore_file}" >&2
fi
csplit
命令将openssl
上的friendlyName:
输出拆分为xx
目录中前缀为${tmp_dir}
的文件。
上面的输出将是:
friendlyName: alias2
localKeyID: 62 44 58 F7 91 F2 8B 9B 44 7C 39 31 31 55 38 32 32 30
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MCUCAQACAwDZhwIDAQABAgIIAQICAO8CAgDpAgIAkQICAMECAgDH
-----END PRIVATE KEY-----
Bag Attributes
如果将此输出放入文件中
key.pem
那么它可以用作后续 openssl
命令的输入,例如:
openssl pkcs12 -export -in cert.pem -inkey key.pem -name ${targetAlias} -out ${targetAlias}-keystore.pfx \
-passin pass:${keystore_password} -passout pass:${keystore_password}
这是因为
openssl
命令仅查看 -----BEGIN PRIVATE KEY-----
和 -----END PRIVATE KEY-----
分隔符内的文本。