想知道openssl smime -sign获取摘要值的命令。
像下面的东西 -
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
然后比较摘要值?
您的消息显然是对 S/MIME 明确签名(又名分离签名)消息的尝试,请参阅rfc5751 sec 3.4.3 et pred,尽管它实际上并不正确;第一部分,即数据实体,没有 MIME 标头。
包括 OpenSSL 在内的一些软件可以处理这种偏差,但是 OpenSSL(仍然!)使用
x-pkcs7-signature
v2 (rfc2311)的子类型创建分离的签名,而不是pkcs7-signature
像您的消息那样来自较新版本的签名。在这种类型的 S/MIME 消息中使用的 PKCS7/CMS 分离签名具有几个可以使用或不使用的可选组件。从您显示的截断数据中,无法确定该消息使用哪些选项,并且无论如何您都没有表明您是否以一种方式或另一种方式关心这些选项。
使用 OpenSSL,
openssl smime -sign -sha256 -signer $certfile [-inkey $keyfile]
without-nodetach
会以这种格式创建消息,除了我上面提到的使用带有x-
.-inkey
如果私钥包含在与证书相同的文件中,则可以省略该选项。您可以选择:包括或不包括签名者的证书
明确包括附加(链)证书
按照系统或在线手册页中的说明使用或不使用signedAttributes 。您可以输入和输出到命名文件或使用标准输入和标准输出,它们又可以由外壳(或操作系统)重定向或管道传输。
除了非常旧的 OpenSSL 版本(0.9.8 或更低版本)之外,您还可以使用
openssl cms
它实际上是一个超集,openssl smime
尽管它的名称默认为执行 S/MIME - 要获取或 执行 CMS,您必须指定签名openssl smime
或 加密或用于验证或解密!openssl cms
-outform
-inform
Q 中的
smime verify
命令验证 S/MIME 签名(默认情况下也验证适用的证书链,但您似乎使用的是独立证书,因此没有真正的链),然后丢弃它,仅输出签名数据,在您的情况下是 XML。外部标签
<cms>
可能意味着该数据旨在表示加密消息语法,是 PKCS7 (rfc5652 et pred) 的继承者,但这种数据组合不对应于任何 CMS 消息。这些名称确实表明它包含特定文件的哈希值。如果您有该文件的(声称的)副本并且想要验证该文件的哈希值,OpenSSL 无法自动执行此操作(甚至{md5,sha1,etc}sum -c
使用更简单的临时文本格式的常见 Unix 命令也无法完成检查)。要手动检查,您的第二个命令是正确的开始;要从 XML 中提取哈希,您可以执行类似的操作或者,如果您没有 PCRE 的 grep,则
sed awk perl
几乎可以肯定这里有其他 Q 涵盖的等价物;然后用shelltest "$x" == "$y"
or[ "$x" == "$y" ]
, or bash,ksh,zsh[[
, orawk
orperl
, 或者其他方法比较这两个hash值。OTOH,如果您的问题实际上是创建那个 XML 主体,OpenSSL 只能做哈希值;其余的将不得不使用标准文本工具,或者可能是 XML 工具。