OpenSSL命令---smime

用途:

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:输出格式。一般为SMIMEPEMDER三种。默认的格式是SMIME

-content file:包含分离的上下文路径,它仅仅只能用于verify操作。

-to addr:有关的邮件信息值头部。接收的地址。

-from ad:有关的邮件信息值头部。发送的地址。

-subject s:颁发者信息值。

-text:打印出S/MIME邮件的各个部件。

-CApath directory:设置信任CA文件所在路径,此路径中的ca文件名采用特殊的形式:xxx.0,其中xxxCA证书持有者的哈希值,它通过x509 -hash命令获得。

-CAfile filename:某文件,里面是所有你信任的CA的证书的内容。当你要建立client的证书链的时候也需要用到这个文件。

-crl_check-crl_check_all:检查客户端的证书是否在CA的废除列表中。CRLs)在证书文件中。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 steve@openssl.org -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 steve@openssl.org \
-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 steve@openssl.org -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签名属性中的对称加密算法。这就意味着只能手动的改正加密算法。必须将允许的算法装进一个数据库。

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

<think>好的,我现在需要帮助用户了解如何使用OpenSSL的PKCS7数字信封命令进行加密和解密操作。首先,我应该回忆一下PKCS7的基本概念和它在OpenSSL中的应用。PKCS7主要用于数字信封,也就是结合对称加密和非对称加密的技术,通常用于安全地传输密钥和数据。数字信封的结构通常是使用接收方的公钥加密对称密钥,然后用这个对称密钥加密实际数据,最后将两者打包在一起。 接下来,我需要确定用户需要的是命令行操作,而不是编程接口的使用,因为用户明确提到了“命令使用教程”。所以,我应该集中精力在OpenSSL命令工具上,特别是与PKCS7相关的命令。 首先,加密操作需要生成一个对称密钥,然后用接收方的证书(公钥)加密这个对称密钥,接着用这个对称密钥加密数据,最后将加密后的密钥和数据打包成PKCS7格式。解密则是相反的过程,使用接收方的私钥解密对称密钥,再用该密钥解密数据。 我需要确保步骤清晰,并且给出具体的命令示例。例如,生成证书和私钥可能是一个前提,但用户可能已经有这些,不过为了示例的完整性,可能需要包括如何生成自签名证书,或者提醒用户使用已有的证书。 然后,处理加密过程。使用openssl smime命令,指定加密模式,输入文件,输出文件,以及接收方的证书。需要注意的是,SMIME命令通常用于邮件加密,但也可以用来处理PKCS7的数字信封。 解密过程则需要私钥和可能的证书,使用smime命令的解密选项,指定输入和输出文件,以及私钥的位置。 同时,可能需要注意一些常见的参数,比如-inform和-outform指定PEM或DER格式,如果用户需要的话。不过默认情况下,PEM格式可能更常见,所以示例中使用PEM。 另外,用户可能需要了解如何生成测试用的证书和私钥,这样他们可以实际运行示例命令。因此,提供生成自签名证书和私钥的步骤是有帮助的,尽管这可能不是PKCS7直接相关的,但作为准备工作是必要的。 还要考虑可能的错误,比如证书格式不正确,或者私钥不匹配,这时候需要提醒用户确保证书和私钥对应,并且是有效的。 最后,生成相关问题,这些问题应该围绕PKCS7数字信封的其他方面,比如与PKCS#12的区别,错误处理,性能优化等,以帮助用户进一步学习。 现在需要验证这些步骤是否正确,可能需要查阅OpenSSL的官方文档或可靠的参考资料,确保命令参数和流程正确。比如,检查smime命令-encrypt和-decrypt选项是否适用于PKCS7的数字信封操作,以及是否需要其他参数如-stream或-nodes等。 可能还需要考虑是否需要使用特定的加密算法,比如-des3或者-aes256,在示例中给出明确的算法选项,避免用户困惑。 总结下来,回答的结构应该是先简介PKCS7数字信封,然后分步骤给出加密和解密的命令示例,包括生成测试证书的步骤,最后提供相关问题。</think>### OpenSSL PKCS7 数字信封命令使用教程 PKCS7 数字信封通过结合对称加密和非对称加密,实现安全的密钥交换和数据传输[^1]。其核心步骤为: 1. 使用对称加密算法加密数据 2. 使用接收方公钥加密对称密钥 3. 将加密结果打包为PKCS7格式 #### 一、环境准备(生成测试证书) ```bash # 生成CA私钥 openssl genrsa -out ca.key 2048 # 生成自签名证书 openssl req -x509 -new -key ca.key -days 3650 -out ca.crt # 生成接收方密钥对 openssl genrsa -out recipient.key 2048 openssl req -new -key recipient.key -out recipient.csr openssl x509 -req -in recipient.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out recipient.crt ``` #### 二、加密操作(发送方) ```bash echo "Secret Message" > plain.txt openssl smime -encrypt \ -in plain.txt \ -out encrypted.p7m \ -outform PEM \ recipient.crt ``` *参数说明:* - `-aes256`:指定对称加密算法(默认RC2-40) - `-binary`:保留二进制数据格式 - 输出文件包含加密内容和加密后的对称密钥 #### 三、解密操作(接收方) ```bash openssl smime -decrypt \ -in encrypted.p7m \ -inform PEM \ -out decrypted.txt \ -inkey recipient.key \ -recip recipient.crt ``` *注意事项:* 1. 必须使用与加密证书配对的私钥 2. 证书链验证可通过`-CAfile`参数指定 #### 四、进阶操作 1. **多接收方支持**: ```bash openssl smime -encrypt -in plain.txt -out multi.p7m recipient1.crt recipient2.crt ``` 2. **DER格式输出**: ```bash openssl smime -encrypt -in plain.txt -outform DER -out encrypted.der recipient.crt ``` [^1]: PKCS#7标准定义了加密消息语法,广泛应用于数字证书和加密数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值