想知道命令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-signature
v2 (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 [[
、 或awk
、perl
或其他方法比较两个哈希值。
OTOH,如果您的问题实际上是创造那XML body,OpenSSL只能做hash值;其余的则必须使用标准文本工具,或者可能是 XML 工具。