openssl使用手冊(cè)
openSSL有兩種運(yùn)行模式:交互模式和批處理模式。
直接輸入openssl回車進(jìn)入交互模式,輸入帶命令選項(xiàng)的openssl進(jìn)入批處理模式。
(1) 配置文件
OpenSSL的默認(rèn)配置文件位置不是很固定,可以用openssl ca命令得知。
你也可以指定自己的配置文件。
當(dāng)前只有三個(gè)OpenSSL命令會(huì)使用這個(gè)配置文件:ca, req, x509。有望未來版本會(huì)有更多命令使用配置文件。
(2)消息摘要算法
支持的算法包括:MD2, MD4, MD5, MDC2, SHA1(有時(shí)候叫做DSS1), RIPEMD-160。SHA1和RIPEMD-160產(chǎn)生160位哈西值,其他的產(chǎn)生128位。除非出于兼容性考慮,否則推薦使用SHA1或者RIPEMD-160。
除了RIPEMD-160需要用rmd160命令外,其他的算法都可用dgst命令來執(zhí)行。
OpenSSL對(duì)于SHA1的處理有點(diǎn)奇怪,有時(shí)候必須把它稱作DSS1來引用。
消息摘要算法除了可計(jì)算哈西值,還可用于簽名和驗(yàn)證簽名。簽名的時(shí)候,對(duì)于DSA生成的私匙必須要和DSS1(即SHA1)搭配。而對(duì)于RSA生成的私匙,任何消息摘要算法都可使用。
#############################################################
# 消息摘要算法應(yīng)用例子
# 用SHA1算法計(jì)算文件file.txt的哈西值,輸出到stdout
$ openssl dgst -sha1 file.txt
# 用SHA1算法計(jì)算文件file.txt的哈西值,輸出到文件digest.txt
$ openssl sha1 -out digest.txt file.txt
# 用DSS1(SHA1)算法為文件file.txt簽名,輸出到文件dsasign.bin
# 簽名的private key必須為DSA算法產(chǎn)生的,保存在文件dsakey.pem中
$ openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt
# 用dss1算法驗(yàn)證file.txt的數(shù)字簽名dsasign.bin,
# 驗(yàn)證的private key為DSA算法產(chǎn)生的文件dsakey.pem
$ openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt
# 用sha1算法為文件file.txt簽名,輸出到文件rsasign.bin
# 簽名的private key為RSA算法產(chǎn)生的文件rsaprivate.pem
$ openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt
# 用sha1算法驗(yàn)證file.txt的數(shù)字簽名rsasign.bin,
# 驗(yàn)證的public key為RSA算法生成的rsapublic.pem
$ openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt
(3) 對(duì)稱密碼
OpenSSL支持的對(duì)稱密碼包括Blowfish, CAST5, DES, 3DES(Triple DES), IDEA, RC2, RC4以及RC5。OpenSSL 0.9.7還新增了AES的支持。很多對(duì)稱密碼支持不同的模式,包括CBC, CFB, ECB以及OFB。對(duì)于每一種密碼,默認(rèn)的模式總是CBC。需要特別指出的是,盡量避免使用ECB模式,要想安全地使用它難以置信地困難。
enc命令用來訪問對(duì)稱密碼,此外還可以用密碼的名字作為命令來訪問。除了加解密,base64可作為命令或者enc命令選項(xiàng)對(duì)數(shù)據(jù)進(jìn)行base64編碼/解碼。
當(dāng)你指定口令后,命令行工具會(huì)把口令和一個(gè)8字節(jié)的salt(隨機(jī)生成的)進(jìn)行組合,然后計(jì)算MD5 hash值。這個(gè)hash值被切分成兩部分:加密鑰匙(key)和初始化向量(initialization vector)。當(dāng)然加密鑰匙和初始化向量也可以手工指定,但是不推薦那樣,因?yàn)槿菀壮鲥e(cuò)。
#############################################################
# 對(duì)稱加密應(yīng)用例子
# 用DES3算法的CBC模式加密文件plaintext.doc,
# 加密結(jié)果輸出到文件ciphertext.bin
$ openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin
# 用DES3算法的OFB模式解密文件ciphertext.bin,
# 提供的口令為trousers,輸出到文件plaintext.doc
# 注意:因?yàn)槟J讲煌撁畈荒軐?duì)以上的文件進(jìn)行解密
$ openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers
# 用Blowfish的CFB模式加密plaintext.doc,口令從環(huán)境變量PASSWORD中取
# 輸出到文件ciphertext.bin
$ openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD
# 給文件ciphertext.bin用base64編碼,輸出到文件base64.txt
$ openssl base64 -in ciphertext.bin -out base64.txt
# 用RC5算法的CBC模式加密文件plaintext.doc
# 輸出到文件ciphertext.bin,
# salt、key和初始化向量(iv)在命令行指定
$ openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K
89D4B1678D604FAA3DBFFD030A314B29
(4)公匙密碼
4.1 Diffie-Hellman
被用來做鑰匙協(xié)商(key agreement),具有保密(secrecy)功能,但是不具有加密(encryption)或者認(rèn)證(authentication)功能,因此在進(jìn)行協(xié)商前需用別的方式對(duì)另一方進(jìn)行認(rèn)證。
首先,Diffie-Hellman創(chuàng)建一套雙方都認(rèn)可的參數(shù)集,包括一個(gè)隨機(jī)的素?cái)?shù)和生成因子(generator value,通常是2或者5)。基于這個(gè)參數(shù)集,雙方都計(jì)算出一個(gè)公鑰匙和私鑰匙,公鑰匙交給對(duì)方,對(duì)方的公鑰匙和自己的私鑰匙用來計(jì)算共享的鑰匙。
OpenSSL 0.9.5 提供了dhparam命令用來生成參數(shù)集,但是生成公鑰匙和私鑰匙的命令dh和gendh已不推薦使用。未來版本可能會(huì)加上這個(gè)功能。
#############################################################
# Diffie-Hellman應(yīng)用例子
# 使用生成因子2和隨機(jī)的1024-bit的素?cái)?shù)產(chǎn)生D0ffie-Hellman參數(shù)
# 輸出保存到文件dhparam.pem
$ openssl dhparam -out dhparam.pem -2 1024
# 從dhparam.pem中讀取Diffie-Hell參數(shù),以C代碼的形式
# 輸出到stdout
$ openssl dhparam -in dhparam.pem -noout -C
4.2 數(shù)字簽名算法(Digital Signature Algorithm, DSA)
主要用來做認(rèn)證,不能用來加密(encryption)或者保密(secrecy),因此它通常和Diffie-Hellman配合使用。在進(jìn)行鑰匙協(xié)商前先用DSA進(jìn)行認(rèn)證(authentication)。
有三個(gè)命令可用來完成DSA算法提供的功能。
dsaparam命令生成和檢查DSA參數(shù),還可生成DSA私鑰匙。
gendsa命令用來為一套DSA參數(shù)生成私鑰匙,這把私鑰匙可明文保存,也可指定加密選項(xiàng)加密保存。可采用DES,3DES,或者IDEA進(jìn)行加密。
dsa命令用來從DSA的私鑰匙中生成公鑰匙,還可以為私鑰匙加解密,或者改變私鑰匙加密的口令。
#############################################################
# DSA應(yīng)用例子
# 生成1024位DSA參數(shù)集,并輸出到文件dsaparam.pem
$ openssl dsaparam -out dsaparam.pem 1024
# 使用參數(shù)文件dsaparam.pem生成DSA私鑰匙,
# 采用3DES加密后輸出到文件dsaprivatekey.pem
$ openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem
# 使用私鑰匙dsaprivatekey.pem生成公鑰匙,
# 輸出到dsapublickey.pem
$ openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem
# 從dsaprivatekey.pem中讀取私鑰匙,解密并輸入新口令進(jìn)行加密,
# 然后寫回文件dsaprivatekey.pem
$ openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin
4.3 RSA
RSA得名于它的三位創(chuàng)建者:Ron Rivest, Adi Shamir, Leonard Adleman。
目前之所以如此流行,是因?yàn)樗C堋⒄J(rèn)證、加密的功能于一體。
不像Diffie-Hellman和DSA,RSA算法不需要生成參數(shù)文件,這在很大程度上簡(jiǎn)化了操作。
有三個(gè)命令可用來完成RSA提供的功能。
genrsa命令生成新的RSA私匙,推薦的私匙長(zhǎng)度為1024位,不建議低于該值或者高于2048位。
缺省情況下私匙不被加密,但是可用DES、3DES或者IDEA加密。
rsa命令可用來添加、修改、刪除私匙的加密保護(hù),也可用來從私匙中生成RSA公匙,或者用來顯示私匙或公匙信息。
rsautl命令提供RSA加密和簽名功能。但是不推薦用它來加密大塊數(shù)據(jù),或者給大塊數(shù)據(jù)簽名,因?yàn)檫@種算法的速度較來慢。通常用它給對(duì)稱密
匙加密,然后通過enc命令用對(duì)稱密匙對(duì)大塊數(shù)據(jù)加密。
#############################################################
# RSA應(yīng)用例子
# 產(chǎn)生1024位RSA私匙,用3DES加密它,口令為trousers,
# 輸出到文件rsaprivatekey.pem
$ openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024
# 從文件rsaprivatekey.pem讀取私匙,用口令trousers解密,
# 生成的公鑰匙輸出到文件rsapublickey.pem
$ openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem
# 用公鑰匙rsapublickey.pem加密文件plain.txt,
# 輸出到文件cipher.txt
$ openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt
# 使用私鑰匙rsaprivatekey.pem解密密文cipher.txt,
# 輸出到文件plain.txt
$ openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt
# 用私鑰匙rsaprivatekey.pem給文件plain.txt簽名,
# 輸出到文件signature.bin
$ openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin
# 用公鑰匙rsapublickey.pem驗(yàn)證簽名signature.bin,
# 輸出到文件plain.txt
$ openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain.txt
(5) S/MIME[Secure Multipurpose Internet Mail Exchange]
S/MIME應(yīng)用于安全郵件交換,可用來認(rèn)證和加密,是PGP的競(jìng)爭(zhēng)對(duì)手。與PGP不同的是,它需要一套公匙體系建立信任關(guān)系,而PGP只需直接從 某個(gè)地方獲取對(duì)方的公匙就可以。然而正因?yàn)檫@樣,它的擴(kuò)展性比PGP要好。另一方面,S/MIME可以對(duì)多人群發(fā)安全消息,而PGP則不能。
命令smime可用來加解密、簽名、驗(yàn)證S/MIME v2消息(對(duì)S/MIME v3的支持有限而且很可能不工作)。對(duì)于沒有內(nèi)置S/MIME支持的應(yīng)用來說,可通過smime來處理進(jìn)來(incoming)和出去(outgoing)的消息。
#############################################################
# RSA應(yīng)用例子
# 從X.509證書文件cert.pem中獲取公鑰匙,
# 用3DES加密mail.txt
# 輸出到文件mail.enc
$ openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem
# 從X.509證書文件cert.pem中獲取接收人的公鑰匙,
# 用私鑰匙key.pem解密S/MIME消息mail.enc,
# 結(jié)果輸出到文件mail.txt
$ openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt
# cert.pem為X.509證書文件,用私匙key,pem為mail.txt簽名,
# 證書被包含在S/MIME消息中,輸出到文件mail.sgn
$ openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn
# 驗(yàn)證S/MIME消息mail.sgn,輸出到文件mail.txt
# 簽名者的證書應(yīng)該作為S/MIME消息的一部分包含在mail.sgn中
$ openssl smime -verify -in mail.sgn -out mail.txt
(6) 口令和口令輸入(passphase)
OpenSSL口令選項(xiàng)名稱不是很一致,通常為passin和passout。可以指定各種各樣的口令輸入來源,不同的來源所承擔(dān)的風(fēng)險(xiǎn)取決于你的接受能力。
stdin
這種方式不同于缺省方式,它允許重定向標(biāo)準(zhǔn)輸入,而缺省方式下是直接從真實(shí)的終端設(shè)備(TTY)讀入口令的。
pass:
直接在命令行指定口令為password。不推薦這樣使用。
env:
從環(huán)境變量中獲取口令,比pass方式安全了些,但是進(jìn)程環(huán)境仍可能被別有用心的進(jìn)程讀到。
file:
從文件中獲取,注意保護(hù)好文件的安全性。
fd:
從文件描述符中讀取。通常情況是父進(jìn)程啟動(dòng)OpenSSL命令行工具,由于OpenSSL繼承了父進(jìn)程的文件描述符,因此可以從文件描述符中讀取口令。
(7) 重置偽隨機(jī)數(shù)生成器(Seeding the Pseudorandom Number Generator)
對(duì)于OpenSSL,正確地重置PRNG(Pseudo Random Number Generator)很重要。
命令行工具會(huì)試圖重置PRNG,當(dāng)然這不是萬無一失的。如果錯(cuò)誤發(fā)生,命令行工具會(huì)生成一條警告,這意味著生成的隨機(jī)數(shù)是可預(yù)料的,這時(shí)就應(yīng)該采用一種更可靠的重置機(jī)制而不能是默認(rèn)的。
在Windows系統(tǒng),重置PRNG的來源很多,比如屏幕內(nèi)容。在Unix系統(tǒng),通常通過設(shè)備/dev/urandom來重置PRNG。從0.9.7開始,OpenSSL還試圖通過連接EGD套接字來重置PRNG。
除了基本的重置來源,命令行工具還會(huì)查找包含隨機(jī)數(shù)據(jù)的文件。假如環(huán)境變量RANDFILE被設(shè)置,它的值就可以用來重置PRNG。如果沒有設(shè)置,則HOME目錄下的.rnd文件將會(huì)使用。
OpenSSL還提供了一個(gè)命令rand用來指定重置來源文件。來源文件之間以操作系統(tǒng)的文件分割字符隔開。對(duì)于Unix系統(tǒng),如果來源文件是EGD套接字,則會(huì)從EGD服務(wù)器獲取隨機(jī)數(shù)。
EGD服務(wù)器是用Perl寫成的收集重置來源的daemon,可運(yùn)行在裝了Perl的基于Unix的系統(tǒng),見http://egd.sourceforge.net。如果沒有/dev/random或者/dev/urandom,EGD是一個(gè)不錯(cuò)的候選。
EGD不能運(yùn)行在Windows系統(tǒng)中。對(duì)于Windows環(huán)境,推薦使用EGADS(Entropy Gathering And Distribution System)。它可運(yùn)行在Unix和Windows系統(tǒng)中,見http://www.securesw.com/egads。
(本文參考O’Reilly-Network Security with OpenSSL)
OPENSSL SUPPORTED CIPHERS:
base64 Base 64
bf-cbc Blowfish in CBC mode
bf Alias for bf-cbc
bf-cfb Blowfish in CFB mode
bf-ecb Blowfish in ECB mode
bf-ofb Blowfish in OFB mode
cast-cbc CAST in CBC mode
cast Alias for cast-cbc
cast5-cbc CAST5 in CBC mode
cast5-cfb CAST5 in CFB mode
cast5-ecb CAST5 in ECB mode
cast5-ofb CAST5 in OFB mode
des-cbc DES in CBC mode
des Alias for des-cbc
des-cfb DES in CBC mode
des-ofb DES in OFB mode
des-ecb DES in ECB mode
des-ede-cbc Two key triple DES EDE in CBC mode
des-ede Two key triple DES EDE in ECB mode
des-ede-cfb Two key triple DES EDE in CFB mode
des-ede-ofb Two key triple DES EDE in OFB mode
des-ede3-cbc Three key triple DES EDE in CBC mode
des-ede3 Three key triple DES EDE in ECB mode
des3 Alias for des-ede3-cbc
des-ede3-cfb Three key triple DES EDE CFB mode
des-ede3-ofb Three key triple DES EDE in OFB mode
desx DESX algorithm.
gost89 GOST 28147-89 in CFB mode (provided by ccgost engine)
gost89-cnt `GOST 28147-89 in CNT mode (provided by ccgost engine)
idea-cbc IDEA algorithm in CBC mode
idea same as idea-cbc
idea-cfb IDEA in CFB mode
idea-ecb IDEA in ECB mode
idea-ofb IDEA in OFB mode
rc2-cbc 128 bit RC2 in CBC mode
rc2 Alias for rc2-cbc
rc2-cfb 128 bit RC2 in CFB mode
rc2-ecb 128 bit RC2 in ECB mode
rc2-ofb 128 bit RC2 in OFB mode
rc2-64-cbc 64 bit RC2 in CBC mode
rc2-40-cbc 40 bit RC2 in CBC mode
rc4 128 bit RC4
rc4-64 64 bit RC4
rc4-40 40 bit RC4
rc5-cbc RC5 cipher in CBC mode
rc5 Alias for rc5-cbc
rc5-cfb RC5 cipher in CFB mode
rc5-ecb RC5 cipher in ECB mode
rc5-ofb RC5 cipher in OFB mode
aes-[128|192|256]-cbc 128/192/256 bit AES in CBC mode
aes-[128|192|256] Alias for aes-[128|192|256]-cbc
aes-[128|192|256]-cfb 128/192/256 bit AES in 128 bit CFB mode
aes-[128|192|256]-cfb1 128/192/256 bit AES in 1 bit CFB mode
aes-[128|192|256]-cfb8 128/192/256 bit AES in 8 bit CFB mode
aes-[128|192|256]-ecb 128/192/256 bit AES in ECB mode
aes-[128|192|256]-ofb 128/192/256 bit AES in OFB mode
posted on 2011-02-12 10:28 蜂鳥 閱讀(1068) 評(píng)論(0) 編輯 收藏 所屬分類: Security