如何使用 openssl smime -sign 获取 -out xml 中的摘要值?

如何使用 openssl smime -sign 获取 -out xml 中的摘要值?

想知道命令openssl smime-签名以获得消化值。

像下面这样的东西 -


MIME-Version: 1.0
Content-Type: multipart/signed;protocol="application/pkcs7-
signature";micalg="sha-256";boundary="707e08bf1d5b44f6b18bc0999df569c8"

This is an S/MIME signed message

--707e08bf1d5b44f6b18bc0999df569c8
<cms>
<file>
<name>index.xml</name>
<digest>4pDBO3/ZNCpaAvxOWbQ0AUnDbT1oAaWMrPIDZz/a1i0=</digest>
<digesttype>sha256</digesttype>
<path>.</path>
</file>
</cms>
--707e08bf1d5b44f6b18bc0999df569c8
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"

MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0B

......

生成它的命令是什么?

验证使用 -

openssl smime -verify -in sign -CAfile Sign_Key.crt -out xmlwithdigest
openssl dgst -binary -sha256 infile  | openssl base64

然后比较消化值?

答案1

您的邮件显然是尝试发送 S/MIME 明文签名(又称分离签名)邮件,请参阅rfc5751 秒 3.4.3et pred,虽然实际上并不正确;第一部分是数据实体,没有 MIME 标头。

包括 OpenSSL 在内的一些软件可以处理这种偏差,但 OpenSSL(仍然!)使用x-pkcs7-signaturev2 (rfc2311) 的子类型创建独立的签名,而不是pkcs7-signature像您的消息那样使用较新版本的子类型。

此类 S/MIME 消息中使用的 PKCS7/CMS 分离签名具有多个可以使用或不使用的可选组件。从您显示的截断数据中,无法确定该消息使用哪些选项,并且无论如何您都没有表明您是否以某种方式关心这些选项。

生成它的命令是什么?

使用 OpenSSL,openssl smime -sign -sha256 -signer $certfile [-inkey $keyfile] 没有 -nodetach以这种格式创建一条消息,除了我上面提到的使用旧的子类型和x-.-inkey如果私钥与证书包含在同一文件中,则可以省略该选项。您可以选择:

  • 包含或不包含签名者的证书

  • 明确包含附加(链)证书

  • 使用或不按照系统手册页中的描述使用signedAttributes或在线。您可以从命名文件输入和输出,或者使用 stdin 和 stdout,它们又可以由 shell(或操作系统)重定向或通过管道传输。

    除了非常旧的 OpenSSL 版本(0.9.8 或更低版本)之外,您还可以使用openssl cms它实际上是 的超集openssl smime,尽管它的名称默认值执行 S/MIME——获得任何一个 openssl smime 或者 openssl cms要执行 CMS,您必须指定-outform签名或加密、-inform验证或解密!

Q 中的命令smime verify验证 S/MIME 签名(默认情况下还有适用的证书链,但看来您使用的是独立证书,因此没有真正的链),然后丢弃它,仅输出签名的数据,在你的例子中是 XML。

外层标签<cms> 可以意味着此数据旨在表示加密消息语法,即 PKCS7 (rfc5652 et pred) 的后继者,但此数据组合不对应于任何 CMS 消息。这些名称确实表明它包含特定文件的哈希值;如果您有该文件的(声称的)副本并且想要验证该文件的哈希值,OpenSSL 无法自动执行此操作(甚至无法{md5,sha1,etc}sum -c使用更简单的临时文本格式通过常见 Unix 命令完成检查)。手动检查,你的第二个命令是否正确启动;要从 XML 中提取哈希值,您可以执行以下操作

 $ grep -Po '<digest>\K[^<]*' 

或者,如果您没有 PCRE 的 grep,则sed awk perl这里的其他 Q 几乎肯定涵盖了等效项;然后用 shelltest "$x" == "$y"[ "$x" == "$y" ]、 bash、ksh、zsh [[、 或awkperl或其他方法比较两个哈希值。

OTOH,如果您的问题实际上是创造那XML body,OpenSSL只能做hash值;其余的则必须使用标准文本工具,或者可能是 XML 工具。

相关内容