我可以使用 openssl 根据友好名称提取密钥吗?

问题描述 投票:0回答:2

我的密钥库包含 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 keystore pkcs#12
2个回答
0
投票

我无法用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

0
投票

您无法使用

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-----
分隔符内的文本。

© www.soinside.com 2019 - 2024. All rights reserved.