OpenSSL命令---CMS

用途:

该命令处理S/MIME v3.1邮件。可以用它对S/MIME消息进行加密、解密、签名、验证签名、压缩以及解压缩等操作。

用法:

openssl cms [-encrypt] [-decrypt] [-sign] [-verify] [-cmsout] [-resign] [-data_create] [-data_out ] [-digest_create ] [-digest_verify ] [-compress] [-uncompress] [-EncryptedData_encrypt] [-sign_receipt][-verify_receipt receipt] [-in filename ] [-inform SMIME|PEM|DER ] [-rctform SMIME|PEM|DER ] [-out filename] [-outform SMIME|PEM|DER] [-stream -indef -noindef] [-content filename] [-text] [-noout][-print] [-CAfile file] [-CApath dir] [-md digest] [-cipher] [-nointern] [-no_signer_cert_verify] [-nocerts][-noattr] [-nosmimecap] [-binary] [-nodetach] [-certfile file] [-certsout file] [-signer file] [-recip file] [-keyid][-receipt_request_all -receipt_request_first] [-receipt_request_from emailaddress] [-receipt_request_to emailaddress] [-receipt_request_print] [-secretkey key] [-secretkeyid id][-econtent_type type] [-inkey file] [-passin arg] [-rand file(s)] [cert.pem...] [-to addr] [-from addr][-subject subj] [-purpose, -ignore_critical, -issuer_checks, -crl_check, -crl_check_all, -policy_check, 
-extended_crl, -x509_strict, -policy -check_ss_sig]


选项说明:

-encrypt:用接收者的证书对邮件进行加密。输入文件是需要加密的信息数据。输出文件是MIME格式的已经加密了的邮件信息值。

-decrypt:用提供者的证书和私钥文件对邮件进行解密。输入文件是MIME格式的已经加密了的邮件信息值。解密的邮件信息将会写入到输出文件中。

 -sign:用提供者的证书和私钥文件对邮件进行签名。输入文件是需要签名的信息数据。输出文件是MIME格式的已经签名了的邮件信息值。

-verify:验证已经签名了的邮件。输入和输出都是已经签名了的数据。如果支持的话清除文本和不透明的签名信息值。

-cmsout:获取一个输入消息,输出一个PEM编码格式的CMS结构。

-resign:重新签名一个消息:即获取目前有可能已经被多个签名者签名的现存数据。

-data_create:创建一个CMS B<Data>类型的数据。

-data_out:输出CMS B<Data>类型的上下文。

 -digest_create:创建一个CMS B< DigestedData>类型数据。

-digest_verify:验证一个CMS B< DigestedData>类型数据并输出上下文。

-compress:创建一个CMS B< CompressedData>类型数据。OpenSSL在编译时必须要包含“zlib”选项值。

-uncompress:解压缩一个CMSB< CompressedData>类型数据并输出上下文。OpenSSL在编译时必须要包含“zlib”选项值。

 -EncryptedData_encrypt:用CMS B< EncrytedData >类型数据并输出上下文。用提供的对称密钥和加密算法对加密灵活的上下文进行加密。

-sign_receipt:对提供的消息产生并输出一个签名的收据。输入的消息中必须包含一个签名的收据请求信息。功能根-sign命令相似。

-verify_receipt receipt:验证从B<receipt>文件中读取的签名的收据。输入的消息必须包含一个签名的收据请求信息。功能根-verify命令相似。

-in filename:用于加密或签名的消息值。

-inform SMIME|PEM|DER:指定了CMS结构的输入格式。默认的是SMIME格式(读取一个S/MIME格式消息)。B<PEM> B<DER>格式改变CMS结构的输入格式为PEMDER。目前仅仅影响了CMS结构的输入格式,如果没有CMS结构则输入不会造成任何影响。

-rctform SMIME|PEM|DER:指定一个已经签名了的收据格式,以用于B<-receipt_verify>操作。

-out filename:已经被解密或验证了的MIME格式的消息。

-outform SMIME|PEM|DER:指定了CMS结构的输出格式。默认的是SMIME格式(写出一个S/MIME格式消息)。B<PEM> B<DER>格式改变CMS结构的输出格式为PEMDER。目前仅仅影响了CMS结构的输入格式,如果没有CMS结构则输入不会造成任何影响。

-stream -indefB<-stream> B<-indef>两个选项等价于流I/O的编码操作。

-content filename:指定了一个文件包含的分离的目录。它仅仅在B<-verify>中使用。如果CMS结构被用于分离签名值,将会有用。如果输入的格式是S/MIME则不会有效。

-text:如果加密或签名数据时,这个选项添加无格式的MIME头部的文本信息到提供的消息中。如果解密或验证则分离出头部信息:如果解密或验证签名不是一个MIMI格式的数据,则会发生错误。

-noout:对B<-cmsout>操作来说,不输出解析了的CMS结构。当和B<-print>选项合并使用的时候非常有用,因为CMS的语法将会被检查。

-print:对B<-cmsout>操作来说,打印CMS结构中的所有的域。对测试用途时这个选项非常有用。

 -CAfile file:一个文件包含可信任的CA证书。仅仅用于B<-verify>命令。

-CApath dir:包含可信任CA证书的目录。仅仅用于B<-verify>命令。这个目录必须是一个标准的目录:每个CA文件的文件名为XXXX.0XXXX为其持有者摘要值。

-md digest:当签名或放弃签名的摘要算法。如果不存在,则默认的摘要算法为SHA1

-cipher:使用的加解密算法。例如triple DES (168字节) - B<-des3>256字节 AES - B<-aes256>。任何标准的算法名字(用与EVP_get_cipherbyname()函数)优于一个破折号,例如B<-aes_128_cbc>

 -nointern:当验证一个消息时,证书通常包含在签名消息中。这个选项仅仅与B<-certfile>中指定的证书一起使用。无论怎样,提供的证书可以作为一个可信任的CA来使用。

-no_signer_cert_verify:不去验证签名消息中的签名证书。

-nocerts:当用签名者的证书签名的时候,一般签名者的证书将附加到签名信息后。设置此选项后,将不附加签名者的证书。这样会减少签名值的大小,但是验证签名值的时候必须从本地区复制一份签名者的证书。

-noattr:当一个消息被签名后,一系列属性将包含进去,属性包括签名时间以及支持的对称算法。设置了此选项后将不再添加属性信息。

 -nosmimecap:排除签名信息中的对称算法列表,其它选项例如签名时间和目录类型始终被包含。

 -binary:默认的是:输入消息是被转换了的,它的格式是"canonical",即结尾一般是CR LF格式。当这个选项被设置后,数据没有转换操作。当处理二进制数据的时候这个选项非常有用。

 -nodetach:当签名一个消息时用不透明的签名:如果邮件代理商不支持S/MIME格式,则这个表单将抵抗邮件转换。没有这个选项,清除文本的签名将会被使用。

-certfile file:允许指定附加的证书。当签名的时候将会包含这些证书。当验证的时候需要搜寻签名者的证书。证书必须是PEM格式的。

 -certsout file:包含到消息中的证书信息将会写到file中。

-signer file:一个签名证书,可以用于签名或取消签名。当多个签名者被请求时,这个选项可以被用于多次。如果一个消息将被验证并验证成功,则签名者的证书将会写入到file中。

-recip file:当解密消息的时候所使用的接受者的证书。这个证书必须要匹配接受者的消息值,如果不匹配,则会出现错误。

-keyid:用颁发者的密钥标识来标识证书,代替颁发者名字和序列号。提供者的证书必须包含密钥标识的额外信息。B<-sign> B<-encrypt>选项使用。

-receipt_request_all -receipt_request_first:对B<-sign>选项来说,包含一个签名的收据请求。表明请求必须被所有的请求者或者请求者的第一个所提供(它们是邮件目录而不是邮件列表)。不管B<-receipt_request_from>是否被包含。

-receipt_request_from emailaddress:对B<-sign>选项来说,包含一个签名的收据请求。添加一个接受者提供的明确的地址。

-receipt_request_to emailaddress:添加一个明确的地址,该地址是已经签名了的请求发送的地址。当请求已经被签名后这个选项必须设置。

-receipt_request_print:对B<-verify>来说,打印已经签名了的收据请求的内容。

-secretkey key:指定使用的对称密钥。该密钥必须被提供并且是16进制的,它和对称加密算法一起使用。B<-EncryptedData_encrypt>B<-EncrryptedData_decrypt>, B<-encrypt> B<-decrypt> 选项将会使用它。当被B<-encrypt>B<-decrypt>时,提供的密钥将会用于封装或解封装内容。

-secretkeyid id:对称密钥的密钥标识符或者是B<KEKRecipientInfo>的类型值。如果B<-secretkey>被用于B<-encrypt>选项时,它必须设置。包含B<-decrypt>选项时,当试图解密B<KEKRecipientInfo>信息时,如果密钥值没有被提供,则id值将会被用于查找密钥值。

-econtent_type type:如果没有提供B<Data>类型,则设置压缩内容的类型值为typeType元素可以是任何有效的OID,该OID可以是文本格式也可以是数字形式。

-inkey file:签名或验证签名时所使用的私钥。它必须匹配相应的证书。如果这个选项没有被指定,私钥必须包含在B<-recip> B<-signer>指定的证书文件中。当签名时,这个选项可以使用多次来指定连续的密钥值。

-passin arg:私钥密码保护口令。

-rand file(s):随机种子产生文件。

cert.pem...:一个或多个消息收件人的证书,当签名一个消息时使用。

-to, -from, -subject:相关的邮件头部信息值。它们将包含在签名值之外并手动添加它们。签名时很多S/MIME邮件客户端可以根据表单中的地址信息来检查签名者的证书邮件地址。

-purpose, -ignore_critical, -issuer_checks, -crl_check, -crl_check_all, -policy_check, -extended_crl, -x509_strict, -policy -check_ss_sig:设置证书链的验证选项值。

注意:

MIME格式的消息必须在头部和输出中没有任何空白行的时候发送。一些邮件程序会自动的添加一行空白行。能够改变格式的一种方法是立即对发送邮件进行管道处理。

提供的消息必须是签名了的或是加密了的。它们必须包含MIME头部信息或S/MIME客户端希望显示的属性值。你可以使用B<-text>选项来自动地添加清楚地文本头部信息值。

一个"signed and encrypted"消息是其中一种,签名消息既是加密消息。这个就可以产生加密消息。

程序的版本仅仅允许一个签名者对应一个消息,但是接收到的消息可以用多个签名者来验证。如果一个消息包含多个签名者,则一些S/MIME客户端将会阻塞。有可能的是签名一个已经签名的消息时,去进行“平行的”签名。

S/MIME客户端中,B<-encrypt> B<-decrypt>选项反射处理普通的使用方式。严格的来说,CMS处理数据:CMS加密的数据将会用于其它用途。

当添加一个新的签名者时,B<-resign>选项用一个现存的消息进行摘要。这就意味着对现存的签名者来说,属性有可能被提出多次。

B<-stream> B<-indef>选项使实验的流I/O称为可能。对一个DER编码的结果来说,它用不定长的长度结构来编码则不管DER。如果内容没有被分离,流处理被B<-encrypt>操作和B<-sign>操作所支持。

流一般是用于B<-sign> 操作,用来分离数据。

退出程序的返回值:

0:操作成功。

1:当解析命令选项时出现一个错误。

2:输入文件中的一个文件不能够被读取。

3:当创建一个CMS文件或读取一个MIME消息时发生一个错误。

4:解密或验证签名时发生错误。

5:消息已经验证通过,但写出签名者的证书时出错。

下面的选项兼容PKCS#7格式:

B<smime>命令仅仅处理老的PKCS#7格式的内容。CMS命令支持用密码写的消息语法格式。消息中一些有用的特性不能够被应用程序(仅仅支持老的格式)所处理。它们的详细说明如下:

B<-keyid>用于B<-sign> B<-encrypt>选项。

B<-outform PEM>用不同的头部。

当用B<-encrypt>选项时使用B<-secretkey>选项。

实例:

创建一个清除文本的签名消息值:

openssl cms -sign -in message.txt -text -out mail.msg -signer mycert.pem

创建一个不透明的签名消息值:

openssl cms -sign -in message.txt -text -out mail.msg -nodetach -signer mycert.pem

创建一个签名值,包含很多附加的证书和从其它文件读取私钥值:

openssl cms -sign -in in.txt -text -out mail.msg -signer mycert.pem -inkey mykey.pem -certfile mycerts.pem

用两个签名者、用密钥标识符签名一个消息:

openssl cms -sign -in message.txt -text -out mail.msg \
-signer mycert.pem -signer othercert.pem -keyid

Unix环境下发生一个签名了的消息,包含头部:

openssl cms -sign -in in.txt -text -signer mycert.pem \
-from [email protected] -to someone@somewhere \
-subject "Signed message" | sendmail someone@somewhere

验证一个消息,如果验证成功,则提取出签名者的证书:

openssl cms -verify -in mail.msg -signer user.pem -out signedtext.txt

发送用3DES加密了的邮件:

openssl cms -encrypt -in in.txt -from [email protected] \
-to someone@somewhere -subject "Encrypted message" \
-des3 user.pem -out mail.msg

签名并加密邮件(注意的是加密的命令不会包含B<-text>选项,因为已经加密了的信息已经包含MIME头部信息值):

openssl cms -sign -in ml.txt -signer my.pem -text \
| openssl cms -encrypt -out mail.msg \
-from [email protected] -to someone@somewhere \
-subject "Signed and Encrypted message" -des3 user.pem


解密一个邮件:

openssl cms -decrypt -in mail.msg -recip mycert.pem -inkey key.pem

64编码签名数据:

openssl cms -verify -inform DER -in signature.der -content content.txt

128字节的Camellia算法加密信息:

openssl cms -encrypt -in plain.txt -camellia128 -out mail.msg cert.pem


为一个现存的消息添加一个签名者:

openssl cms -resign -in mail.msg -signer newsign.pem -out mail2.msg

BUGs:

MIME分离不是非常灵活:似乎是处理更多的被丢弃的消息,还有可能会造成阻塞。

现在的代码仅仅能够写出签名者的证书到文件:如果签名者有一个加密证书,则它必须手动地导出。则有一些探索的功能:怎样保存加密证书。

理想的是有一个数据库来维护每个邮件地址的证书信息。

现在的代码不允许取出SMIMECapabilities签名属性中的对称加密算法。这就意味着只能手动的改正加密算法。必须将允许的算法装进一个数据库。

没有废除列表来检查签名者的证书。

你可能感兴趣的:(cms,OpenSSL,smime,v3.1邮件)