目录
1. openssl smime命令
用途:
S/MIME工具,用于处理S/MIME邮件,用于生成PKCS7数据、加密、解密、签名和验证S/MIME消息。
用法:
openssl-smime - OpenSSL Documentation
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: 加密信息
-decrypt: 解密信息
-sign: 签名,使用给定的证书和私钥
-verify: 验签
-pk7out: 输出PEM编码的PKCS#7结构
-resign: 重新签名
-in file: 要加密或签名的输入消息,或者,要解密或验证的MIME消息
-out file: 已解密或验证的消息文本,或者,已签名或验证的输出MIME格式消息。
-inform SMIME|PEM|DER: 输入格式。一般为SMIME|PEM|DER三种。默认的是SMIME。
-outform SMIME|PEM|DER: 输出格式。一般为SMIME、PEM、DER三种。默认的格式是SMIME。
-indef、-stream:这两个选项都是表示对I/O流进行编码操作。
-noindef: 禁用流式输入/输出,因为它会产生不定长度的构造编码
-content file: 指定一个包含分离内容的文件,它仅仅只能用于-verify时,且仅当PKCS#7结构使用detached的签名(其中不包含内容)时,此选项才可用
-text: 如果是在加密或签名,此选项会将text/plain的MIME头添加到提供的消息中。
-md digest: 当签名或放弃签名操作时用的摘要算法。默认的摘要算法为sha1。
-cipher: 要使用的加密算法,默认的DES
-nointern: 验签时,通常会搜索消息中包含的证书以查找签名证书。使用此选项时表示仅使用-certfile选项中指定的证书。但是,提供的证书仍可以用作不受信任的CA。
-noverify: 不去验证签名者的证书信息。
-nochain: 不要对签名者证书进行链验证;即:不要将签名消息中的证书用作不受信任的CA
-nosigs: 不验证签名
-nocerts: 签名时签名者的证书通常会被包含在内。指定此选项,表示不包括在内,可以减少签名消息的大小,但签名者证书需要单独传递
-no addr: 通常签名时,会包含一组属性,其中包括签名时间和支持的对称算法。使用此选项时,它们不包括在内。
-nodetach: 使用opaque签名,从测试结果中可以看到,指定此选项可以将被签名的数据加入生成的PKCS7数据中
-binary: 通常,输入消息被转换为“规范”格式,该格式有效地使用CR和LF作为行尾;
如果存在此选项,则不会进行转换。这在处理可能不是MIME格式的二进制数据时非常有用。
-certfile filename:允许指定其他证书。签名时,这些内容将包含在消息中。验证时,将搜索这些签名者证书。输入可以是PEM、DER或PKCS#12格式。
-signer file: 签名者证书。如果需要多个签名者,这个选项可以被用多次。
-recip file: 存放提供者的证书,主要用于解密消息值。这个证书必须匹配多个提供者的消息。
-inkey file: 私钥,主要用于签名或解密。私钥必须匹配相应的证书。如果这个选项没有被指定,私钥必须包含到证书文件中(-recip、-signer)
签名时,此选项可多次用于指定连续的密钥
-keyform DER|PEM|P12|ENGINE: 私钥格式
-passin arg: 私钥密码
-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证书中的废除列表。
-rand file(s):指定随机数种子文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其他系统用“:”。
-des, -des3, -seed, -rc2-40, -rc2-64, -rc2-128, -aes128, -aes192, -aes256,-camellia128, -camellia192, -camellia256:指定的私钥保护加密算法。默认的算法是rc2-40。
cert.pem: 加密时使用的接收方的一个或多个证书。
2. 示例
2.1 生成和解析PKCS7格式的签名数据
PKCS7结构的签名数据(sign)是把原始数据、签名值、签名证书、附加证书(可用于证书链验证)、证书吊销列表打包
步骤如下:
第一步:准备需要的证书
将需要用于证书链验证的证书(除了签名者证书以外)保存到同一个文件中
cat xxx.cer > certChain.cer
cat xxx.cer > certChain.cer
cat xxx.cer > certChain.cer
......
第二步:准备要签名的数据
echo "this is msg for test" > plain.txt
第三步:生成签名数据
openssl smime -binary -sign -nodetach
-signer ./user.cer -inkey ./user.key -certfile ./certChain.cer
-in ./plain.txt -outform pem -out ./file.p7b
第四步:解析生成的签名数据
openssl pkcs7 -in file.p7b -print
2.2 生成和解析PKCS7格式的数字信封
数字信封用于通信双方交换数据。
发送方生成一个随机对称加密密钥,使用对称加密密钥对发送内容进行加密,再用接收方的公钥对对称加密密钥进行加密,最后将加密的对称密钥和加密的发送内容按PKCS#7标准,编码组成一个“数字信封”。
数字信封制作过程如下:
- 随机生成对称密钥mk
- 用接收方公钥对mk加密
- 使用mk对发送内容加密
- 如果需要签名,则执行如下步骤:
- 对发送内容作数字签名(见数字签名过程,但不作编码);
- 使用mk为密钥对签名进行加密;
- 按格式编码构成数字信封
解数字信封的过程如下:
- 使用接收者自已的私钥解出对称密钥mk;
- 使用mk做为密钥解密传送的数据;
- 如果存在签名,则执行:
- 使用mk为密钥解出签名值;
- 验证签名。
命令如下:
加密生成数字信封:
openssl smime -encrypt -binary
-in ./plain.txt -outform PEM -out ./enveloped.txt
./certs/recipient.cer
解析数字信封内容:
openssl pkcs7 -in ./enveloped.txt -print
如下所示:
解密得到原始数据:
openssl smime -decrypt -inform PEM -in ./enveloped.txt -inkey ./certs/4.pem
如下所示: