用途:
S/MIME工具,用于处理S/MIME邮件,它能加密、解密、签名和验证S/MIME消息。
用法:
openssl smime [-encrypt] [-decrypt] [-sign] [-verify] [-pk7out] [-nointern] [-nosigs] [-noverify] [-nocerts] [ -nodetach] [-noattr] [-binary] [-in file] [-inform SMIME|PEM|DER] [-certfile file] [-signer file] [-recip file] [-passin arg] [-inkey file] [-keyform PEM |ENGINE] [-out file] [-outform SMIME|PEM|DER] [-content file] [-to addr] [-from ad] [-subject s] [-text] [-CApath directory] [-CAfile filename] [-crl_check] [-crl_check_all] [-indef] [-noindef] [-stream] [-rand file(s)] [-md digest] [cert.pem…] [-des] [-des3] [-rc2-40] [-rc2-64] [-rc2-128]
选项说明:
-encrypt:用给定的接受者的证书加密邮件信息。输入文件是一个消息值,用于加密。输出文件是一个已经被加密了的MIME格式的邮件信息。
-decrypt:用提供的证书和私钥值来解密邮件信息值。从输入文件中获取到已经加密了的MIME格式的邮件信息值。解密的邮件信息值被保存到输出文件中。
-sign:用提供的证书和私钥值来签名邮件信息值。输入文件是一个消息值,用于签名。输出文件是一个已经被签名了的MIME格式的邮件信息。
-verify:验证已经签名了的邮件信息值。输入文件和输出文件都是已经签名了的邮件信息值。同时支持清除文本以及不透明的签名。
-pk7out:将一个PEM格式的输入信息转换为PKCS#7结构。
-nointern:对签名者来说,不从消息中查找证书。
-nosigs:不去验证签名值。
-noverify:不去验证签名者的证书信息。
-nocerts:当签名的时候不包含签名者的证书信息值。
-nodetach:用不透明的签名。
-binary:不转换二进制消息到文本消息值。
-in file:输入消息值,它一般为加密了的以及签名了的MINME类型的消息值。
-inform SMIME|PEM|DER:输入消息的格式。一般为SMIME|PEM|DER三种。默认的是SMIME。
-certfile filename:添加filename中所有的证书信息值。
-signer file:一个签名证书,当签名或放弃一个签名数据时使用。这个选项可以被用多次。如果一个消息已经被验证并验证通过,则将签名者的证书放到file中。
-recip file:存放提供者的证书,主要用于解密消息值。这个证书必须匹配多个提供者的消息。
-passin arg:私钥保护口令来源。
-inkey file:私钥存放地址,主要用于签名或解密数据。这个私钥值必须匹配相应的证书信息。如果这个选项没有被指定,私钥必须包含到证书路径中(-recip、-signer)。
-keyform PEM |ENGINE:私钥格式。一般为PEM 、ENGINE格式。
-out file:已经被解密或验证通过的数据的保存位置。
-outform SMIME|PEM|DER:输出格式。一般为SMIME、PEM、DER三种。默认的格式是SMIME。
-content file:包含分离的上下文路径,它仅仅只能用于verify操作。
-to addr:有关的邮件信息值头部。接收的地址。
-from ad:有关的邮件信息值头部。发送的地址。
-subject s:颁发者信息值。
-text:打印出S/MIME邮件的各个部件。
-CApath directory:设置信任CA文件所在路径,此路径中的ca文件名采用特殊的形式:xxx.0,其中xxx为CA证书持有者的哈希值,它通过x509 -hash命令获得。
-CAfile filename:某文件,里面是所有你信任的CA的证书的内容。当你要建立client的证书链的时候也需要用到这个文件。
-crl_check、-crl_check_all:检查客户端的证书是否在CA的废除列表中。CRL(s)在证书文件中。crl_check_all表示要检查所有的CA证书中的废除列表。
-indef、-stream:这两个选项对I/O流进行编码操作。
-noindef:不对数据进行编码操作。
-md digest:当签名或放弃签名操作时用的摘要算法。默认的摘要算法为sha1。
-rand file(s):指定随机数种子文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其他系统用“:”。
cert.pem:提供者的证书信息。
-des, -des3, -seed, -rc2-40, -rc2-64, -rc2-128, -aes128, -aes192, -aes256,-camellia128, -camellia192, -camellia256:指定的私钥保护加密算法。默认的算法是rc2-40。
注意:
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:在创建PKCS#7文件或读取MIME格式消息时出错。
4:解密或验证签名时出现错误。
5:消息已经被验证但是一个错误发生。
实例:
创建一个签名的消息:
openssl smime -sign -in message.txt -text -out mail.msg -signer mycert.pem
创建一个不透明的签名消息:
openssl smime -sign -in message.txt -text -out mail.msg -nodetach -signer mycert.pem
创建一个签名的消息,包含很多附加证书和读取私钥文件从其它文件中:
openssl smime -sign -in in.txt -text -out mail.msg -signer mycert.pem -inkey mykey.pem -certfile mycerts.pem
有两个签名者对消息签名:
openssl smime -sign -in message.txt -text -out mail.msg -signer mycert.pem -signer othercert.pem
用Unix目录发送一个签名了的消息,包含头部:
openssl smime -sign -in in.txt -text -signer mycert.pem \ -from [email protected] -to someone@somewhere \ -subject "Signed message" | sendmail someone@somewhere
验证一个已签名的消息,如果已经成功,提取签名者的证书:
openssl smime -verify -in mail.msg -signer user.pem -out signedtext.txt
发送用3DES加密了的数据:
openssl smime -encrypt -in in.txt -from [email protected] \ -to someone@somewhere -subject "Encrypted message" \ -des3 user.pem -out mail.msg
签名并加密邮件信息值:
openssl smime -sign -in ml.txt -signer my.pem –text openssl smime -encrypt -out mail.msg -from [email protected] -to someone@somewhere -subject "Signed and Encrypted message" -des3 user.pem
注意:加密的命令中不包含-text选项,因为消息已经被加密了的并包含了MIME头部。
解密邮件信息:
openssl smime -decrypt -in mail.msg -recip mycert.pem -inkey key.pem
Netscape格式的输出表单是一个经过PKCS#7结构签名了的。你可以用这个项目来验证签名值:
-----BEGIN PKCS7-----
-----END PKCS7-----
用下面的命令:
openssl smime -verify -inform PEM -in signature.pem -content content.txt
可以用base64解码签名值:
openssl smime -verify -inform DER -in signature.der -content content.txt
用128位的Camellia算法创建一个加密的消息:
openssl smime -encrypt -in plain.txt -camellia128 -out mail.msg cert.pem
对一个现存的消息添加一个签名者:
openssl smime -resign -in mail.msg -signer newsign.pem -out mail2.msg
BUGs:
MIME分离不是非常灵活:似乎是处理更多的被丢弃的消息,还有可能会造成阻塞。
现在的代码仅仅能够写出签名者的证书到文件:如果签名者有一个加密证书,则它必须手动地导出。则有一些探索的功能:怎样保存加密证书。
理想的是有一个数据库来维护每个邮件地址的证书信息。
现在的代码不允许取出SMIMECapabilities签名属性中的对称加密算法。这就意味着只能手动的改正加密算法。必须将允许的算法装进一个数据库。
没有废除列表来检查签名者的证书。