Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Openssl 如何创建分离的CMS签名?_Openssl - Fatal编程技术网

Openssl 如何创建分离的CMS签名?

Openssl 如何创建分离的CMS签名?,openssl,Openssl,我一直在尝试用OpenSSL创建一个分离的PKCS#7/CMS签名。我有一个大的zip文件,我想为它创建一个数字签名,但我不想在签名中嵌入内容。这在OpenSSL中是可能的,还是它只能验证分离的签名而不创建它们?是的,您可以,它甚至是默认的-,您必须指定-nodetach来“嵌入”数据。但与直觉相反,PKCS#7/CMS格式不是默认格式(S/MIME是),因此必须指定-outform。 假设您拥有pkey.PEM中支持的几种PEM格式之一的私钥,以及cert.PEM中的PEM中的相应证书,并且d

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

是的,您可以,它甚至是默认的-,您必须指定
-nodetach
来“嵌入”数据。但与直觉相反,PKCS#7/CMS格式不是默认格式(S/MIME是),因此必须指定
-outform
。 假设您拥有
pkey.PEM
中支持的几种PEM格式之一的私钥,以及
cert.PEM
中的PEM中的相应证书,并且
data
中的数据,并且您想要
签名中的“原始”(二进制)CMS:

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格式输出更改为
-输出PEM
。在支持重定向的OS/shell上(我认为现在除了虚拟机之外都是重定向),省略
-in
-out
分别使用stdin或stdout,这可以包括从其他进程或到其他进程的管道。(当然,接收者/验证者必须一点一点地复制签名数据,如果签名数据不在文件中,通常会更加困难。)

默认情况下,OpenSSL使用
SignedAttribute
aka两级aka间接签名形式;要仅对数据(散列)签名,请添加
-noattr
。有关更多选项,请参见手册页:省略签名者证书或包含验证者的其他(链)证书,更改指定的内容类型和签名哈希以及算法选项


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

Stack Overflow是编程和开发问题的网站。您可能应该讨论API调用。如果OP对命令行实用程序感兴趣,他/她会问超级用户。我实际上是问命令行实用程序,而不是C API。但现在我知道用超级用户来问这个问题了。谢谢。“但与直觉相反,PKCS#7/CMS格式不是默认格式(S/MIME是),因此您必须指定-outform”。哇!荒唐的这正是我的问题。非常感谢你!!答案的链接已断开。你能更新一下吗?