如何创建分离的CMS签名?

时间:2016-02-16 22:00:43

标签: openssl

我一直在尝试使用OpenSSL创建一个独立的PKCS#7 / CMS签名。我有一个大的zip文件,我想创建一个数字签名,但我不希望嵌入在签名中的内容。这是可以使用OpenSSL,还是只能验证分离的签名而不是创建它们?

1 个答案:

答案 0 :(得分:7)

是的,您可以,甚至是the commandline utility的默认设置 - 您必须指定-nodetach来嵌入'数据。但违反直觉的PKCS#7 / CMS格式是默认值(S / MIME),因此您必须指定-outform。 假设您拥有pkey.pem中几种支持的PEM格式之一的私钥以及cert.pem中PEM中的相应证书,以及data中的数据,并且您想要' raw& #39; (二进制)CMS signature

openssl cms -sign -signer cert.pem -inkey pkey.pem -binary -in data -outform der -out signature

如果证书和密钥位于同一个PEM文件中(有时是OpenSSL稍微扩展的PEM格式的便捷功能),请将该文件指定为-signer并省略-inkey。如果密钥和证书采用任何非PEM格式(包括PKCS#12),请先将它们转换为PEM。

对于PEM格式输出更改为-outform pem。在支持重定向的OS / shell上(我认为现在除了VMS之外),省略-in-out分别使用stdin或stdout,其中包括来自或来自其他进程的管道。 (当然,接收者/验证者一点一点地重现签名数据是至关重要的,如果它不在文件中,通常会更难。)

默认情况下,OpenSSL使用signedAttributes又称两级别的间接签名形式;仅签署 数据(哈希)添加-noattr。有关更多选项,请参见联机帮助页:省略签署者证书或包含验证程序的其他(链)证书,更改指示的内容类型和签名哈希和算法选项。

如果您更喜欢使用(C)API编写自己的程序,请从CMS_sign开始。您还应该能够在安装了OpenSSL的任何Unix系统上本地查看这些(和相关的)手册页,通常只有man cmsman CMS_sign等,尽管某些安装可能需要调整MANPATH和/或指定特殊像1ssl和3ssl这样的部分。