SSL是Secure SocketLayer(安全套接層協(xié)議)的縮寫,可以在Internet上提供秘密性傳輸。Netscape公司在推出第一個Web瀏覽器的同時,提出了SSL協(xié)議標準,目前已有3.0版本。SSL采用公開密鑰技術。其目標是保證兩個應用間通信的保密性和可靠性,可在服務器端和用戶端同時實現(xiàn)支持。目前,利用公開密鑰技術的SSL協(xié)議,已成為Internet上保密通訊的工業(yè)標準。安全套接層協(xié)議能使用戶/服務器應用之間的通信不被攻擊者竊聽,并且始終對服務器進行認證,還可選擇對用戶進行認證。SSL協(xié)議要求建立在可靠的傳輸層協(xié)議(TCP)之上。SSL協(xié)議的優(yōu)勢在于它是與應用層協(xié)議獨立無關的,高層的應用層協(xié)議(例如:HTTP,F(xiàn)TP,TELNET等)能透明地建立于SSL協(xié)議之上。SSL協(xié)議在應用層協(xié)議通信之前就已經完成加密算法、通信密鑰的協(xié)商及服務器認證工作。在此之后應用層協(xié)議所傳送的數據都會被加密,從而保證通信的私密性。通過以上敘述,SSL協(xié)議提供的安全信道有以下三個特性:1.數據的保密性信息加密就是把明碼的輸入文件用加密算法轉換成加密的文件以實現(xiàn)數據的保密。加密的過程需要用到密匙來加密數據然后再解密。沒有了密鑰,就無法解開加密的數據。數據加密之后,只有密匙要用一個安全的方法傳送。加密過的數據可以公開地傳送。2.數據的一致性加密也能保證數據的一致性。例如:消息驗證碼(MAC),能夠校驗用戶提供的加密信息,接收者可以用MAC來校驗加密數據,保證數據在傳輸過程中沒有被篡改過。3.安全驗證加密的另外一個用途是用來作為個人的標識,用戶的密匙可以作為他的安全驗證的標識。SSL是利用公開密鑰的加密技術(RSA)來作為用戶端與服務器端在傳送機密資料時的加密通訊協(xié)定。
什么是OpenSSL
OpenSSL采用C語言作為開發(fā)語言,這使得OpenSSL具有優(yōu)秀的跨平臺性能,這對于廣大技術人員來說是一件非常美妙的事情,可以在不同的平臺使用同樣熟悉的東西。OpenSSL支持Linux、Windows、BSD、Mac、VMS等平臺,這使得OpenSSL具有廣泛的適用性。不過,對于目前新成長起來的C++程序員,可能對于C語言的代碼不是很習慣,但習慣C語言總比使用C++重新寫一個跟OpenSSL相同功能的軟件包輕松不少。
OpenSSL整個軟件包大概可以分成三個主要的功能部分:密碼算法庫、SSL協(xié)議庫以及應用程序。OpenSSL的目錄結構自然也是圍繞這三個功能部分進行規(guī)劃的。
1.對稱加密算法
OpenSSL一共提供了8種對稱加密算法,其中7種是分組加密算法,僅有的一種流加密算法是RC4。這7種分組加密算法分別是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持電子密碼本模式(ECB)、加密分組鏈接模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種常用的分組密碼加密模式。其中,AES使用的加密反饋模式(CFB)和輸出反饋模式(OFB)分組長度是128位,其它算法使用的則是64位。事實上,DES算法里面不僅僅是常用的DES算法,還支持三個密鑰和兩個密鑰3DES算法。
2.非對稱加密算法
OpenSSL一共實現(xiàn)了4種非對稱加密算法,包括DH算法、RSA算法、DSA算法和橢圓曲線算法(EC)。DH算法一般用戶密鑰交換。RSA算法既可以用于密鑰交換,也可以用于數字簽名,當然,如果你能夠忍受其緩慢的速度,那么也可以用于數據加密。DSA算法則一般只用于數字簽名。
3.信息摘要算法
OpenSSL實現(xiàn)了5種信息摘要算法,分別是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事實上包括了SHA和SHA1兩種信息摘要算法,此外,OpenSSL還實現(xiàn)了DSS標準中規(guī)定的兩種信息摘要算法DSS和DSS1。
4.密鑰和證書管理
密鑰和證書管理是PKI的一個重要組成部分,OpenSSL為之提供了豐富的功能,支持多種標準。
首先,OpenSSL實現(xiàn)了ASN.1的證書和密鑰相關標準,提供了對證書、公鑰、私鑰、證書請求以及CRL等數據對象的DER、PEM和BASE64的編解碼功能。OpenSSL提供了產生各種公開密鑰對和對稱密鑰的方法、函數和應用程序,同時提供了對公鑰和私鑰的DER編解碼功能。并實現(xiàn)了私鑰的PKCS#12和PKCS#8的編解碼功能。OpenSSL在標準中提供了對私鑰的加密保護功能,使得密鑰可以安全地進行存儲和分發(fā)。
在此基礎上,OpenSSL實現(xiàn)了對證書的X.509標準編解碼、PKCS#12格式的編解碼以及PKCS#7的編解碼功能。并提供了一種文本數據庫,支持證書的管理功能,包括證書密鑰產生、請求產生、證書簽發(fā)、吊銷和驗證等功能。
事實上,OpenSSL提供的CA應用程序就是一個小型的證書管理中心(CA),實現(xiàn)了證書簽發(fā)的整個流程和證書管理的大部分機制。
5.SSL和TLS協(xié)議
OpenSSL實現(xiàn)了SSL協(xié)議的SSLv2和SSLv3,支持了其中絕大部分算法協(xié)議。OpenSSL也實現(xiàn)了TLSv1.0,TLS是SSLv3的標準化版,雖然區(qū)別不大,但畢竟有很多細節(jié)不盡相同。
雖然已經有眾多的軟件實現(xiàn)了OpenSSL的功能,但是OpenSSL里面實現(xiàn)的SSL協(xié)議能夠讓我們對SSL協(xié)議有一個更加清楚的認識,因為至少存在兩點:一是OpenSSL實現(xiàn)的SSL協(xié)議是開放源代碼的,我們可以追究SSL協(xié)議實現(xiàn)的每一個細節(jié);二是OpenSSL實現(xiàn)的SSL協(xié)議是純粹的SSL協(xié)議,沒有跟其它協(xié)議(如HTTP)協(xié)議結合在一起,澄清了SSL協(xié)議的本來面目。
6.應用程序
OpenSSL的應用程序已經成為了OpenSSL重要的一個組成部分,其重要性恐怕是OpenSSL的開發(fā)者開始沒有想到的。現(xiàn)在OpenSSL的應用中,很多都是基于OpenSSL的應用程序而不是其API的,如OpenCA,就是完全使用OpenSSL的應用程序實現(xiàn)的。OpenSSL的應用程序是基于OpenSSL的密碼算法庫和SSL協(xié)議庫寫成的,所以也是一些非常好的OpenSSL的API使用范例,讀懂所有這些范例,你對OpenSSL的API使用了解就比較全面了,當然,這也是一項鍛煉你的意志力的工作。
OpenSSL的應用程序提供了相對全面的功能,在相當多的人看來,OpenSSL已經為自己做好了一切,不需要再做更多的開發(fā)工作了,所以,他們也把這些應用程序成為OpenSSL的指令。OpenSSL的應用程序主要包括密鑰生成、證書管理、格式轉換、數據加密和簽名、SSL測試以及其它輔助配置功能。
7.Engine機制
Engine機制的出現(xiàn)是在OpenSSL的0.9.6版的事情,開始的時候是將普通版本跟支持Engine的版本分開的,到了OpenSSL的0.9.7版,Engine機制集成到了OpenSSL的內核中,成為了OpenSSL不可缺少的一部分。Engine機制目的是為了使OpenSSL能夠透明地使用第三方提供的軟件加密庫或者硬件加密設備進行加密。OpenSSL的Engine機制成功地達到了這個目的,這使得OpenSSL已經不僅僅使一個加密庫,而是提供了一個通用地加密接口,能夠與絕大部分加密庫或者加密設備協(xié)調工作。當然,要使特定加密庫或加密設備更OpenSSL協(xié)調工作,需要寫少量的接口代碼,但是這樣的工作量并不大,雖然還是需要一點密碼學的知識。Engine機制的功能跟Windows提供的CSP功能目標是基本相同的。目前,OpenSSL的0.9.7版本支持的內嵌第三方加密設備有8種,包括:CryptoSwift、nCipher、Atalla、Nuron、UBSEC、Aep、SureWare以及IBM 4758CCA的硬件加密設備?,F(xiàn)在還出現(xiàn)了支持PKCS#11接口的Engine接口,支持微軟CryptoAPI的接口也有人進行開發(fā)。當然,所有上述Engine接口支持不一定很全面,比如,可能支持其中一兩種公開密鑰算法。
8.輔助功能
BIO機制是OpenSSL提供的一種高層IO接口,該接口封裝了幾乎所有類型的IO接口,如內存訪問、文件訪問以及Socket等。這使得代碼的重用性大幅度提高,OpenSSL提供API的復雜性也降低了很多。
OpenSSL對于隨機數的生成和管理也提供了一整套的解決方法和支持API函數。隨機數的好壞是決定一個密鑰是否安全的重要前提。
OpenSSL還提供了其它的一些輔助功能,如從口令生成密鑰的API,證書簽發(fā)和管理中的配置文件機制等等。如果你有足夠的耐心,將會在深入使用OpenSSL的過程慢慢發(fā)現(xiàn)很多這樣的小功能,讓你不斷有新的驚喜。
安裝OpenSSL
$./config --prefix=/prog/openssl-0.9.8d
$ make
$ make test
$ make install
$ ln -s /prog/openssl-0.9.8d /usr/local/openssl
$ ln -s /usr/local/openssl/bin/openssl/usr/bin/openssl
$ ln -s /usr/local/openssl/include/openssl/usr/include/openssl
$ ln -s /usr/local/openssl/ssl/openssl.cnf/etc/openssl.cnf
$ cp /usr/local/openssl/lib/libssl.a /usr/lib
證書管理
建立根證書
(Root Certification AuthorityCertificate)根證書是一個為CA自己頒發(fā)的證書簽名,這個證書可從其他CA獲取,或者是自簽名(selfsign)的根證書。
方案一:進入openssl安裝目錄,在ssl目錄下的misc目錄中有一個CA.sh和CA.pl的初始化安裝文件。運行./CA.sh-newca可以建立一個根證書。
方案二:首先,需要準備一個目錄放置CA文件,包括頒發(fā)的證書和CRL(CertificateRevokeList),例如,/home/certadm/demoCA。(注:certadm是Linux上的一個用戶,是認證證書管理員)在/home/certadm/demoCA下建立幾個目錄,certs用來保存我們的CA頒發(fā)的所有的證書的副本;private用來保存CA證書的私鑰匙;crl用于保存回收證書列表信息。
運行openssl需要指定openssl.cnf配置文件的路徑。我們可以在命令行中使用config命令選項指定配置文件的位置,或者通過環(huán)境變量OPENSSL_CONF來聲明。
$ openssl req -nodes -new -keyout demo_key.pem -out demo_req.pem-day 3650 -config /etc/openssl.cnf
$ OPENSSL_CONF="/opt/myca/openssl.cnf"
$ export OPENSSL_CONF
openssl.cnf配置文件需要添加一些信息。
[ req ]
default_bits = 2048
default_keyfile = /opt/myca/private/cakey.pem
default_md = md5
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
[ root_ca_distinguished_name ]
commonName = My Test
CA stateOrProvinceName = Beijing
countryName = CN
emailAddress = yingyuan@staff.sina.com.cn
organizationName = Root Certification Authority
[ root_ca_extensions ]
basicConstraints = CA:true
創(chuàng)建根證書。
$ openssl req -x509 -newkey rsa -out cacert.pem -outformPEM
驗證根證書文件。
$ openssl x509 -in cacert.pem -text -noout
CA的私鑰匙很重要,至少需要2048位長度。建議保存在硬件里,或者至少不要放在網絡中。除了生成鑰匙,在CA體系中還需要創(chuàng)建三個文件。第一個文件用來跟蹤最后一次頒發(fā)的證書的序列號,它命名為serial,初始化為01。第二個文件是一個排序數據庫,用來跟蹤已經頒發(fā)的證書,命名為index.txt,文件內容為空。
$ chmod g-rwx,o-rwx private
$ echo "01" > serial
$ touch index.txt
頒發(fā)客戶證書
在給客戶頒發(fā)證書之前,需要客戶提供證書的基本信息。創(chuàng)建證書時應使用默認的OpenSSL配置文件,不要使用創(chuàng)建根證書時所用的配置文件或環(huán)境變量。
$ openssl req -newkey rsa:1024 -keyout demo_key.pem -keyform PEM-out demo_req.pem -outform PEM
或
$ openssl req -nodes -new -keyout islab_key.pem -out demo_req.pem-days 3650 -config ~/openssl/ssl/openssl.cnf
生成用戶CSR(Certificate Signing Request)文件
$ openssl ca -config ~/openssl/ssl/openssl.cnf -policypolicy_anything -out demo_cert.pem -infilesislab_req.pem
生成用戶證書文件
命令運行過程中有兩次提示用戶輸入口令,第一次的口令用來加密私鑰匙demo_key.pem,第二次口令一般被OpenSSL忽略。結果生成兩個文件:私鑰demo_key.pem;demo_req.pem,請求信息,其中包括公鑰。
可以通過batch選項取消命令提示,可通過notext選項取消證書的輸出顯示。此外,還可以一次給多個客戶頒發(fā)證書,方法是用infiles選項替換in選項,不過這個選項必須放在最后,因為此后的任何字符均被處理為文件名稱列表。
吊銷用戶證書
將待吊銷的證書從證書的保存位置拷貝到另外一個目錄,然后運行ca命令就可以。關鍵操作是設置好OPENSSL_CONF環(huán)境變量。

$ cp certs/01.pem testcert.pem
$ openssl ca -revoke testcert.pem
命令行運行過程中需要輸入CA私鑰匙的密碼。
為了使證書吊銷操作讓用戶知道,可以生成CRL(Certificate RevokeList),然后公布到網上去。由于每個頒發(fā)的證書都有一個過期時間,一旦證書過期了,就可以把該證書從CRL中刪除。
1.生成CRL列表
$ openssl ca -gencrl -out exampleca.crl
2.查看CRL列表信息
$ openssl crl -in exampleca.crl -text -noout
3.驗證CRL列表簽名信息
$ openssl crl -in exampleca.crl -noout -CAfilecacert.pem
可以看到CRL的版本號為1,這是OpenSSL默認的,除非crl_extensions被指定在配置文件ca一節(jié)中。
案例分析
因特網協(xié)議保護
[舉例]大部分的Web服務器及瀏覽器都廣泛支持SSL技術。當瀏覽器試圖連接一個具有SSL認證加密的服務器時,就會喚醒一個SSL會話,瀏覽器檢查認證,必須具備下面三個條件: 1)有一個權威機構發(fā)放證書,當然可以創(chuàng)建自我簽訂的證書(x509結構)。 2)證書不能過期?! ?)證書是屬于它所連接的服務器的。 只有全部具備了這三個條件,瀏覽器才能成功完成認證。通過這三個條件,用戶能確認其瀏覽器連接到正確的服務器,而不是連接到一些想盜取用戶密碼等重要信息的虛假的服務器上。
在當今的電子商務中還有一項被廣泛使用的安全協(xié)議是SET協(xié)議。SET(SecureElectronicTransaction,安全電子交易)協(xié)議是由VISA和MasterCard兩大信用卡公司于1997年5月聯(lián)合推出的規(guī)范。SET能在電子交易環(huán)節(jié)上提供更大的信任度、更完整的交易信息、更高的安全性和更少受欺詐的可能性。SET交易分三個階段進行:用戶向商家購物并確定支付;商家與銀行核實;銀行向商家支付貨款。每個階段都涉及到RSA對數據加密,以及RSA數字簽名。使用SET協(xié)議,在一次交易中,要完成多次加密與解密操作,故有很高的安全性,但SET協(xié)議比SSL協(xié)議復雜,商家和銀行都需要改造系統(tǒng)以實現(xiàn)互操作。
Email保護
加密保護
(本文參考 O'Reilly - Network Securitywith OpenSSL)
1. 以cacert驗證產生出來的使用者cert~/openssl/bin/openssl verify -CApath . -CAfile cacert.pemislab_cert.pem
2. 檢查產生的序號 ~/openssl/bin/opensslx509 -noout -serial -in islab_cert.pem serial=01
3. 檢查發(fā)行者資訊 ~/openssl/bin/opensslx509 -noout -issuer -in islab_cert.pem issuer=/C=TW/ST=TAIWAN/L=Taichung/O=THU/OU=ISLAB/CN=www.tekgate.idv.tw/emailAddress=blave@mail.tekgate.idv.tw
4. 檢查憑證起始及終止日期時間~/openssl/bin/openssl x509 -noout -in islab_cert.pem -datesnotBefore=Feb 24 07:54:16 2005 GMT notAfter=Feb 22 07:54:16 2015GMT
5. 檢查個人憑證資訊subject~/openssl/bin/openssl x509 -noout -in islab_cert.pem -subjectsubject=/C=TW/ST=TAIWAN/L=Taichung/O=THU/OU=CSIE/CN=blave@mail.tekgate.idv.tw/emailAddress=blave@mail.tekgate.idv.tw
6. 檢查MD5 fingerprint~/openssl/bin/openssl x509 -noout -in islab_cert.pem -fingerprintMD5Fingerprint=A4:A1:95:41:CC:26:18:00:AA:16:07:25:A8:5F:65:6E
7. 檢查SHA-1 fingerprint~/openssl/bin/openssl x509 -noout -in islab_cert.pem -fingerprint-sha1 SHA1Fingerprint=B2:D7:CF:DF:DA:B7:A6:3B:4C:99:3A:94:52:64:B8:28:0B:3A:24:9D
8. 由PEM轉至PKCS12。Microsoft OutlookExpress使用PKCS12格式,因此欲使用Microsoft OutlookExpress寄出簽章信件,只要將產生出來的.p12檔安裝在Windows即可使用。 ~/openssl/bin/opensslpkcs12 -export -in islab_cert.pem -out islab_cert.p12 -name"Blave's Certificate" -inkey islab_key.pem Enter Export Password:Verifying - Enter Export Password:
9. 由PKCS12轉至PEM
(1) 由PKCS12產生Private Key~/openssl/bin/openssl pkcs12 -in islab_cert.p12 -out islab_key2.pemEnter Import Password: MAC verified OK Enter PEM pass phrase:Verifying - Enter PEM pass phrase:
(2) 再由Private Key產生憑證~/openssl/bin/openssl x509 -in islab_key2.pem -text -outislab_cert2.pem
10.文件加密「islab_cert.pem」為個人憑證,可以公開給大家,因此某人欲加密傳送一文件給我,便可以依下列方式加密。編輯一純文字檔,在此我們預設檔名為「document.txt」,而經加密碼之檔名為「document.enc」。echo "This is a text file." > document.txt catdocument.txt This is a text file. ~/openssl/bin/openssl smime-encrypt -in document.txt -out document.enc islab_cert.pem catdocument.enc MIME-Version: 1.0 Content-Disposition: attachment;filename="smime.p7m" Content-Type: application/x-pkcs7-mime;name="smime.p7m" Content-Transfer-Encoding: base64
MIICFgYJKoZIhvcNAQcDoIICBzCCAgMCAQAxggG5MIIBtQIBADCBnDCBljELMAkGA1UEBhMCVFcxDzANBgNVBAgTBlRBSVdBTjERMA8GA1UEBxMIVGFpY2h1bmcxDDAK …(略) …DQEHATAaBggqhkiG9w0DAjAOAgIAoAQIIyXl/VHcSASAGOtS9efsvXwqks1LmBp6irSgxerAE6TShw==
11.文件解密倘若我們收到了某人傳送的「document.enc」,我們便能使用Private Key來進行解密。~/openssl/bin/openssl smime -decrypt -in document.enc -recipislab_cert.pem -inkey islab_key.pem This is a textfile.
12.文件簽章為文件簽章可證明文件的來源為本人無誤,並且可以驗證文件是否被篡改。我們依前例,為一純文字檔「document.txt」簽章,簽章後檔名為「document.sig」。~/openssl/bin/openssl smime -sign -inkey islab_key.pem -signerislab_cert.pem -in document.txt -out document.sig cat document.sigMIME-Version: 1.0 Content-Type: multipart/signed;protocol="application/x-pkcs7-signature"; micalg=sha1;boundary="----F565CC3F7AEE7ACC3F74CA855D8EC920"
This is an S/MIME signedmessage
F565CC3F7AEE7ACC3F74CA855D8EC920
This is a text file.
F565CC3F7AEE7ACC3F74CA855D8EC920
Content-Type:application/x-pkcs7-signature; name="smime.p7s"Content-Transfer-Encoding: base64 Content-Disposition: attachment;filename="smime.p7s"
MIIHBgYJKoZIhvcNAQcCoIIG9zCCBvMCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCCBFYwggRSMIIDu6ADAgECAgEBMA0GCSqGSIb3DQEBBAUAMIGWMQswCQYD …(略) …
F565CC3F7AEE7ACC3F74CA855D8EC920--
13.文件簽章驗證當某人收到這份文件時,可利用我們的憑證(islab_cert.pem)以及CA憑證(cacert.pem)來驗證文件。~/openssl/bin/openssl smime -verify -in document.sig -signerislab_cert.pem -out document.txt -CAfile cacert.pem Verificationsuccessful ■因此我們可以知道,驗證方必須事先取得CA憑證(cacert.pem)方可驗證文件。
參考資料
http://www.chinaunix.net/jh/4/479635.htmlOpenSSL學習紀要 命令行常用功能 使用OpenSSL實現(xiàn)證書的管理 OpenSSL.cn OpenSSL開發(fā)指南中國OPENSSL API安全編程
取自"http://demo.itedu.info/mediawiki/index.php?title=OpenSSL"
愛華網



