使用 PEM 和 ALIAS 进行 OpenSSL 签名

使用 PEM 和 ALIAS 进行 OpenSSL 签名

我需要直接在这里问这个问题,因为经过大量 Google 搜索和在 StackExchange 上搜索后,我还没有找到任何相关信息。

因此,假设我使用 OpenSSL(在 Windows 平台上,如果这很重要)和 .pem 文件来签名 .txt 文件;我使用的命令是

openssl smime -sign -in unsignedfile.txt -outform der -binary -nodetach -out signedfile.txt.p12 -signer certificate.pem -passin pass:PASSWORD

到目前为止,一切都很好。

我的问题是:.pem 文件是否应该包含多对私钥/证书 - 每个私钥/证书都由一个“friendlyName”标识(我理解为别名、标识符),我如何在上面的命令行中指定我想使用的别名?

那可能吗?

一直在寻找 -alias 选项https://wiki.openssl.org/index.php/Command_Line_Utilities但没有太大帮助。

先感谢您。

答案1

不可能。

PEM 文件通常可以包含多个“对象”,但大多数 OpenSSL 命令行操作(包括此操作)仅使用所需类型的第一个对象——密钥文件中的第一个密钥、证书文件中的第一个证书等。特别是如果您需要私钥和证书,则smime -sign可以从单个文件中读取(第一个)密钥和(第一个)证书。一些操作或选项使用全部文件中的证书,但即使在那里,除了第一个之外,您也无法选择特定的证书。

PKCS12 文件包含结构化数据,可以将各种属性(包括“friendlyname”)与密钥和证书关联起来。当您“导入”PKCS12 时,openssl pkcs12 -in file.p12 ...输出包含这些属性,但在 PEM 格式中,它们只是注释并被忽略,就像其他不在有效块内的内容一样----BEGIN x-----END x同样,当您使用创建 PKCS12 时,openssl pkcs12 -export -out file.p12 ...您可以指定friendlyname 值作为命令行选项进入 PKCS12,但任何在 PEM 输入中的属性都将被忽略。(您不能指定任何其他属性,尽管localkeyid 是自动生成的。)

您可以使用 awk 或类似工具从文件中选择所需的块,例如

awk -vwant=smeagol '/friendlyName:/{sel=($2==want)} /^-----BEGIN/,/^-----END/{if(sel)print}' <manyPEM >onePEM
# and then use onePEM

PS:输出的数据结构smime -outform der是 CMS,它源自 PKCS7,并且通常仍称为 PKCS7。不是 PKCS12,两者有很大不同。命名它.p12可能会混淆和误导人们,比如你自己的未来。

相关内容