15-OpenSSL命令行之smime:生成PKCS7数据、数字信封

目录

1. openssl smime命令

2. 示例

2.1 生成和解析PKCS7格式的签名数据

2.2 生成和解析PKCS7格式的数字信封


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标准,编码组成一个“数字信封”。

数字信封制作过程如下:

  1. 随机生成对称密钥mk
  2. 用接收方公钥对mk加密
  3. 使用mk对发送内容加密
  4. 如果需要签名,则执行如下步骤:
    1. 对发送内容作数字签名(见数字签名过程,但不作编码);
    2. 使用mk为密钥对签名进行加密;
  5. 按格式编码构成数字信封

解数字信封的过程如下:

  1. 使用接收者自已的私钥解出对称密钥mk;
  2. 使用mk做为密钥解密传送的数据;
  3. 如果存在签名,则执行:
    1. 使用mk为密钥解出签名值;
    2. 验证签名。

命令如下:

加密生成数字信封:

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

如下所示:

TR34ObjectIdentifers DEFINITIONS EXPLICIT TAGS ::= BEGIN -- Content types, from PKCS #7 -- pkcs7 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs7(7) } id-data OBJECT IDENTIFIER ::= { pkcs7 data(1) } id-signedData OBJECT IDENTIFIER ::= { pkcs7 signedData(2) } id-envelopedData OBJECT IDENTIFIER ::= { pkcs7 envelopedData (3) } id-digestedData OBJECT IDENTIFIER ::= { pkcs7 digestedData(5) } id-encryptedData OBJECT IDENTIFIER ::= { pkcs7 encryptedData (6) } pkcs9 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) } smime OBJECT IDENTIFIER ::= { pkcs9 smime(16) } -- Signed attributes, from PKCS #9, S/MIME, and ANS X9.73 -- id-contentType OBJECT IDENTIFIER ::= { pkcs9 contentType(3) } id-messageDigest OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) 4 } id-signingTime OBJECT IDENTIFIER ::= { pkcs9 signingTime(5) } id-contentIdentifier OBJECT IDENTIFIER ::= { smime id-aa(2) contentIdentifier(7) } id-msgSequenceNo OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) x973(10060) attribute(1) msgSequenceNo(1) } id-signingCertificate OBJECT IDENTIFIER ::= { smime id-aa(2) signingCertificate(12) } id-otherSigningCert OBJECT IDENTIFIER ::= { itu-t(0) identified-organization(4) etsi(0) electronic-signature-standard(1733) part1(1) attributes(1) 12 } id-biometricSyntax OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) x973(10060) attribute(1) biometricSyntax(2) } END 请理解这段代码,并使用openssl的接口,采用linux c编程完成对数据的编码和解码
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值