openssl使用手册Word格式.docx
《openssl使用手册Word格式.docx》由会员分享,可在线阅读,更多相关《openssl使用手册Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
#############################################################
#消息摘要算法应用例子
#用SHA1算法计算文件file.txt的哈西值,输出到stdout
$openssldgst-sha1file.txt
#用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt
$opensslsha1-outdigest.txtfile.txt
#用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin
#签名的privatekey必须为DSA算法产生的,保存在文件dsakey.pem中
$openssldgst-dss1-signdsakey.pem-outdsasign.binfile.txt
#用dss1算法验证file.txt的数字签名dsasign.bin,
#验证的privatekey为DSA算法产生的文件dsakey.pem
$openssldgst-dss1-prverifydsakey.pem-signaturedsasign.binfile.txt
#用sha1算法为文件file.txt签名,输出到文件rsasign.bin
#签名的privatekey为RSA算法产生的文件rsaprivate.pem
$opensslsha1-signrsaprivate.pem-outrsasign.binfile.txt
#用sha1算法验证file.txt的数字签名rsasign.bin,
#验证的publickey为RSA算法生成的rsapublic.pem
$opensslsha1-verifyrsapublic.pem-signaturersasign.binfile.txt
(3)对称密码
OpenSSL支持的对称密码包括Blowfish,CAST5,DES,3DES(TripleDES),IDEA,RC2,RC4以及RC5。
OpenSSL0.9.7还新增了AES的支持。
很多对称密码支持不同的模式,包括CBC,CFB,ECB以及OFB。
对于每一种密码,默认的模式总是CBC。
需要特别指出的是,尽量避免使用ECB模式,要想安全地使用它难以置信地困难。
enc命令用来访问对称密码,此外还可以用密码的名字作为命令来访问。
除了加解密,base64可作为命令或者enc命令选项对数据进行base64编码/解码。
当你指定口令后,命令行工具会把口令和一个8字节的salt(随机生成的)进行组合,然后计算MD5hash值。
这个hash值被切分成两部分:
加密钥匙(key)和初始化向量(initialization
vector)。
当然加密钥匙和初始化向量也可以手工指定,但是不推荐那样,因为容易出错。
#对称加密应用例子
#用DES3算法的CBC模式加密文件plaintext.doc,
#加密结果输出到文件ciphertext.bin
$opensslenc-des3-salt-inplaintext.doc-outciphertext.bin
#用DES3算法的OFB模式解密文件ciphertext.bin,
#提供的口令为trousers,输出到文件plaintext.doc
#注意:
因为模式不同,该命令不能对以上的文件进行解密
$opensslenc-des-ede3-ofb-d-inciphertext.bin-outplaintext.doc-passpass:
trousers
#用Blowfish的CFB模式加密plaintext.doc,口令从环境变量PASSWORD中取
#输出到文件ciphertext.bin
$opensslbf-cfb-salt-inplaintext.doc-outciphertext.bin-passenv:
PASSWORD
#给文件ciphertext.bin用base64编码,输出到文件base64.txt
$opensslbase64-inciphertext.bin-outbase64.txt
#用RC5算法的CBC模式加密文件plaintext.doc
#输出到文件ciphertext.bin,
#salt、key和初始化向量(iv)在命令行指定
$opensslrc5-inplaintext.doc-outciphertext.bin-SC62CB1D49F158ADC-ivE9EDACA1BD7090C6-K
89D4B1678D604FAA3DBFFD030A314B29
(4)公匙密码
4.1Diffie-Hellman
被用来做钥匙协商(keyagreement),具有保密(secrecy)功能,但是不具有加密(encryption)或者认证(authentication)功能,因此在进行协商前需用别的方式对另一方进行认证。
首先,Diffie-Hellman创建一套双方都认可的参数集,包括一个随机的素数和生成因子(generatorvalue,通常是2或者5)。
基于这个参数集,双方都计算出一个公钥匙和私钥匙,公钥匙交给对方,对方的公钥匙和自己的私钥匙用来计算共享的钥匙。
OpenSSL0.9.5提供了dhparam命令用来生成参数集,但是生成公钥匙和私钥匙的命令dh和gendh已不推荐使用。
未来版本可能会加上这个功能。
#Diffie-Hellman应用例子
#使用生成因子2和随机的1024-bit的素数产生D0ffie-Hellman参数
#输出保存到文件dhparam.pem
$openssldhparam-outdhparam.pem-21024
#从dhparam.pem中读取Diffie-Hell参数,以C代码的形式
#输出到stdout
$openssldhparam-indhparam.pem-noout-C
4.2数字签名算法(DigitalSignatureAlgorithm,DSA)
主要用来做认证,不能用来加密(encryption)或者保密(secrecy),因此它通常和Diffie-Hellman
配合使用。
在进行钥匙协商前先用DSA进行认证(authentication)。
有三个命令可用来完成DSA算法提供的功能。
dsaparam命令生成和检查DSA参数,还可生成DSA私钥匙。
gendsa命令用来为一套DSA参数生成私钥匙,这把私钥匙可明文保存,也可指定加密选项加密保存。
可采用DES,3DES,或者IDEA进行加密。
dsa命令用来从DSA的私钥匙中生成公钥匙,还可以为私钥匙加解密,或者改变私钥匙加密的口令。
#DSA应用例子
#生成1024位DSA参数集,并输出到文件dsaparam.pem
$openssldsaparam-outdsaparam.pem1024
#使用参数文件dsaparam.pem生成DSA私钥匙,
#采用3DES加密后输出到文件dsaprivatekey.pem
$opensslgendsa-outdsaprivatekey.pem-des3dsaparam.pem
#使用私钥匙dsaprivatekey.pem生成公钥匙,
#输出到dsapublickey.pem
$openssldsa-indsaprivatekey.pem-pubout-outdsapublickey.pem
#从dsaprivatekey.pem中读取私钥匙,解密并输入新口令进行加密,
#然后写回文件dsaprivatekey.pem
$openssldsa-indsaprivatekey.pem-outdsaprivatekey.pem-des3-passin
4.3RSA
RSA得名于它的三位创建者:
RonRivest,AdiShamir,LeonardAdleman。
目前之所以如此流行,是因为它集保密、认证、加密的功能于一体。
不像Diffie-Hellman和DSA,RSA算法不需要生成参数文件,这在很大程度上简化了操作。
有三个命令可用来完成RSA提供的功能。
genrsa命令生成新的RSA私匙,推荐的私匙长度为1024位,不建议低于该值或者高于2048位。
缺省情况下私匙不被加密,但是可用DES、3DES或者IDEA加密。
rsa命令可用来添加、修改、删除私匙的加密保护,也可用来从私匙中生成RSA公匙,或者用来显示私匙或公匙信息。
rsautl命令提供RSA加密和签名功能。
但是不推荐用它来加密大块数据,或者给大块数据签名,因为这种算法的速度较来慢。
通常用它给对称密
匙加密,然后通过enc命令用对称密匙对大块数据加密。
#RSA应用例子
#产生1024位RSA私匙,用3DES加密它,口令为trousers,
#输出到文件rsaprivatekey.pem
$opensslgenrsa-outrsaprivatekey.pem-passoutpass:
trousers-des31024
#从文件rsaprivatekey.pem读取私匙,用口令trousers解密,
#生成的公钥匙输出到文件rsapublickey.pem
$opensslrsa-inrsaprivatekey.pem-passinpass:
trousers-pubout-outrsapubckey.pem
#用公钥匙rsapublickey.pem加密文件plain.txt,
#输出到文件cipher.txt
$opensslrsautl-encrypt-pubin-inkeyrsapublickey.pem-inplain.txt-outcipher.txt
#使用私钥匙rsaprivatekey.pem解密密文cipher.txt,
#输出到文件plain.txt
$opensslrsautl-decrypt-inkeyrsaprivatekey.pem-incipher.txt-outplain.txt
#用私钥匙rsaprivatekey.pem给文件plain.txt签名,
#输出到文件signature.bin
$opensslrsautl-sign-inkeyrsaprivatekey.pem-inplain.txt-outsignature.bin
#用公钥匙rsapublickey.pem验证签名signature.bin,
$opensslrsautl-verify-pubin-inkeyrsapublickey.pem-insignature.bin-outplain
(5)S/MIME[SecureMultipurposeInternetMailExchange]
S/MIME应用于安全邮件交换,可用来认证和加密,是PGP的竞争对手。
与PGP不同的是,它需要一套公匙体系建立信任关系,而PGP只需直接从某个地方获取对方的公匙就可以。
然而正因为这样,它的扩展性比PGP要好。
另一方面,S/MIME可以对多人群发安全消息,而PGP则不能。
命令smime可用来加解密、签名、验证S/MIMEv2消息(对S/MIMEv3的支持有限而且很可能不工作)。
对于没有内置S/MIME支持的应用来说,可通过smime来处理进来(incoming)和出去(outgoing)的消息。
#从X.509证书文件cert.pem中获取公钥匙,
#用3DES加密mail.txt
#输出到文件mail.enc
$opensslsmime-encrypt-inmail.txt-des3-outmail.enccert.pem
#从X.509证书文件cert.pem中获取接收人的公钥匙,
#用私钥匙key.pem解密S/MIME消息mail.enc,
#结果输出到文件mail.txt
$opensslsmime-decrypt-inmail.enc-recipcert.pem-inkeykey.pem-outmail.txt
#cert.pem为X.509证书文件,用私匙key,pem为mail.txt签名,
#证书被包含在S/MIME消息中,输出到文件mail.sgn
$opensslsmime-sign-inmail.txt-signercert.pem-inkeykey.pem-outmail.sgn
#验证S/MIME消息mail.sgn,输出到文件mail.txt
#签名者的证书应该作为S/MIME消息的一部分包含在mail.sgn中
$opensslsmime-verify-inmail.sgn-outmail.txt
(6)口令和口令输入(passphase)
OpenSSL口令选项名称不是很一致,通常为passin和passout。
可以指定各种各样的口令输入来源,不同的来源所承担的风险取决于你的接受能力。
stdin
这种方式不同于缺省方式,它允许重定向标准输入,而缺省方式下是直接从真实的终端设备
(TTY)读入口令的。
pass:
直接在命令行指定口令为password。
不推荐这样使用。
env:
从环境变量中获取口令,比pass方式安全了些,但是进程环境仍可能被别有用心的进程读到。
file:
从文件中获取,注意保护好文件的安全性。
fd:
从文件描述符中读取。
通常情况是父进程启动OpenSSL命令行工具,由于OpenSSL继承了父进程的文件描述符,因此可以从文件描述符中读取口令。
(7)重置伪随机数生成器(SeedingthePseudorandomNumberGenerator)
对于OpenSSL,正确地重置PRNG(PseudoRandomNumberGenerator)很重要。
命令行工具会试图重置PRNG,当然这不是万无一失的。
如果错误发生,命令行工具会生成一条警告,这意味着生成的随机数是可预料的,这时就应该采用一种更可靠的重置机制而不能是默认的。
在Windows系统,重置PRNG的来源很多,比如屏幕内容。
在Unix系统,通常通过设备/dev/urandom来重置PRNG。
从0.9.7开始,OpenSSL还试图通过连接EGD套接字来重置PRNG。
除了基本的重置来源,命令行工具还会查找包含随机数据的文件。
假如环境变量RANDfile被设置,它的值就可以用来重置PRNG。
如果没有设置,则HOME目录下的.rnd文件将会使用。
OpenSSL还提供了一个命令rand用来指定重置来源文件。
来源文件之间以操作系统的文件分割字符隔开。
对于Unix系统,如果来源文件是EGD套接字,则会从EGD服务器获取随机数。
EGD服务器是用Perl写成的收集重置来源的daemon,可运行在装了Perl的基于Unix的系统,见。
如果没有/dev/random或者/dev/urandom,EGD是一个不错的候选。
EGD不能运行在Windows系统中。
对于Windows环境,推荐使用EGADS(EntropyGatheringAndDistributionSystem)。
它可运行在Unix和Windows系统中,见。
(本文参考O’Reilly-NetworkSecuritywithOpenSSL)
附加测试实例:
[root@server02~]#echozhaohang>
file.txt
[root@server02~]#openssldgst-sha1file.txt
SHA1(file.txt)=cf017022db32f04cb57d2ec1ae6b39751a6155e4
[root@server02~]#opensslsha1-outdigest.txtfile.txt
[root@server02~]#catdigest.txt
#签名的privatekey必须为DSA算法产生的,保存在文件dsakey.pem中$openssldgst-dss1-signdsakey.pem-outdsasign.binfile.txt
#用DES3算法的CBC模式加密文件file.txt
$opensslenc-des3-salt-infile.txt-outciphertext.bin-passpass:
123456
#用DES3算法的CBC模式解密文件ciphertext.bin
$opensslenc-des3-d-inciphertext.bin-passpass:
#用DES3算法的OFB模式解密文件ciphertext.bin:
$opensslenc-des-ede3-ofb-d-inciphertext.bin-outfile.txt-passpass:
123456#用Blowfish的CFB模式加/解密file.txt,口令从环境变量HOSTNMAE中取$opensslbf-cfb-salt-infile.txt-outciphertext.bin-passenv:
HOSTNAME
$opensslbf-cfb-d-inciphertext.bin-passenv:
#DSA应用例子-数字签名算法
$opensslgendsa-outdsaprivateke