SSL/TLS協議詳解

孤劍發表於2014-04-19

原文地址:http://www.cnblogs.com/adforce/archive/2012/11/27/2790937.html

SSL(Secure Sockets Layer,安全套接層),及其繼任者 TLS(Transport Layer Security,傳輸層安全)是為網路通訊提供安全及資料完整性的一種安全協議。TLS與SSL在傳輸層對網路連線進行加密。

為Netscape所研發,用以保障在Internet上資料傳輸之安全,利用資料加密(Encryption)技術,可確保資料在網路上之傳輸過程中不會被擷取及竊聽。

SSL協議位於TCP/IP協議與各種應用層協議之間,為資料通訊提供安全支援。SSL協議可分為兩層: 
      SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,為高層協議提供資料封裝、壓縮、加密等基本功能的支援。 
      SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的資料傳輸開始前,通訊雙方進行身份認證、協商加密演算法、交換加密金鑰等。

SSL協議提供的服務主要有:
  1)認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器;
  2)加密資料以防止資料中途被竊取;
  3)維護資料的完整性,確保資料在傳輸過程中不被改變。

 

一、什麼是SSL?

      SSL或者Secure Socket Layer,是一種允許web瀏覽器和web伺服器通過一個安全的連線進行交流的技術。這意味著將被髮送的資料在一端被翻譯成密碼,傳送出去,然後在另一端解開密碼,再進行處理。這是一個雙向的過程,也就是瀏覽器和伺服器都需要在傳送資料之前對它們進行加密。

      SSL協定的另一個重要方面是認證(Authentication)。這就是說,在你開始試圖通過一個安全連線與一個Web伺服器交流的時候,這個伺服器會要求你的瀏覽器出示一組證件,通過“鑑定”的方式來證明這就是你所宣告的網站。在某些情況下,伺服器還會要求你的web瀏覽器的認證書,證明你就是你所說的那個人。這就是所知的“客戶認證”,儘管實際情況中,更多地用在商務-對-商務(B2B)交易,而不是對個人使用者。大多數有SSL功能的web伺服器不要求客戶認證(Client Authentication)。

 

 二、證書:Certificate

     為了能實施SSL,一個web伺服器對每個接受安全連線的外部介面(IP地址)必須要有相應的認證書(Certificate)。關於這個設計的理論是一個伺服器必須提供某種合理的保證以證明這個伺服器的主人就是你所認為的那個人,特別是在接收任何敏感資訊之前要這樣做。關於Certificates的更廣泛的解釋超過了這個文件資料的範圍,就把一個認證書當作一個英特網地址的“數碼駕駛執照”。這個認證書要陳述與這個網站相關聯的公司,以及這個網站的所有者或系統管理員的一些基本聯絡資訊。

     這個”駕駛執照”由所有人以密碼方式簽字,其他人非常難偽造。對於進行電子商務 (e-commerce)的網站,或其他身份認證至關重要的任何商業交易,認證書要向大家所熟知的認證權威 (Certificate Authority (CA))如VeriSign或Thawte來購買。這樣的認證書可用電子技術證明屬實——實際上,認證權威單位會擔保它發出的認證書的真實性,如果你信任發出認證書的認證權威單位的話,你就可以相信這個認證書是有效的。

     從技術上說,SSL 證書(也稱為數字證書)將身份與一對可用於加密和簽名數字資訊的電子金鑰繫結。SSL 證書能夠實現對某人自稱有權使用特定金鑰的宣告的驗證,有助於防止有人使用欺騙性金鑰來模擬其他使用者。當與加密配合使用時,SSL 證書可提供完整的安全解決方案,可以保證參與事務的一方或各方的身份。

     SSL 證書是由受信任的第三方(稱為證書頒發機構 (CA))發放的。CA 的作用有些像護照辦理處。CA 必須採取一些措施來確定要向其發放 ID 的人或組織的身份。一旦 CA 建立某個組織的身份後,就可以發出一個包含該組織的公鑰的證書,並用 CA 的私鑰對其簽名。

     通過使用 SSL 證書,您就能在自己的站點上開展驗證身份的、加密的線上商務活動。訪問您站點的使用者將可以向站點提交信用卡號或其他個人資訊,從而保證他們真心實意與您進行業務交易(並非是騙子),並且他們傳送給您的資訊不會被目標接收者以外的任何人擷取或解密。您的 SSL 證書將包含下列資訊:

     您的組織的公用名稱(如 www.bea.com)

  •     其它標識性資訊(如 IP 和實體地址)
  •     您的公鑰
  •     公鑰的到期日期
  •     發出此 ID 的 CA 的名稱(如 VeriSign)
  •     一個唯一的序列號
  •     VeriSign 的數字簽名

 

 三、證書格式

主要的證書型別有:
    PEM
    DER
    PKCS#12

PEM
    可以包括所有私鑰(RSA 和 DSA)、公鑰(RSA 和 DSA)和 (x509) 證書。它儲存用 Base64 編碼的 DER 格式資料,用 ascii 報頭包圍,因此適合系統之間的文字模式傳輸。

—–BEGIN CERTIFICATE—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xFTAT
BgNVBAoTDEJFQSBXZWJMb2dpYzERMA8GA1UECxMIU2VjdXJpdHkxIzAhBgNVBAMT
GkRlbW8gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9zdXBw
b3J0QGJlYS5jb20wHhcNMDAwNTMwMjEzODAxWhcNMDQwNTEzMjEzODAxWjCBjDEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFTATBgNVBAoTDEJFQSBXZWJMb2dpYzEZMBcGA1UEAxMQd2VibG9n
aWMuYmVhLmNvbTEeMBwGCSqGSIb3DQEJARYPc3VwcG9ydEBiZWEuY29tMFwwDQYJ
KoZIhvcNAQEBBQADSwAwSAJBALdsXEHqKHgs6zj0hU5sXMAUHzoT8kgWXmNkKHXH
79qbPh6EfdlriW9G/AbRF/pKrCQu7hhllAxREbqTuSlf2EMCAwEAATANBgkqhkiG
9w0BAQQFAANBACgmqflL5m5LNeJGpWx9aIoABCiuDcpw1fFyegsqGX7CBhffcruS
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE—–

DER
    辨別編碼規則 (DER) 可包含所有私鑰、公鑰和證書。它是大多數瀏覽器的預設格式,並按 ASN1 DER 格式儲存。它是無報頭的 - PEM 是用文字報頭包圍的 DER。

PKCS#12
    公鑰加密標準 #12 (PKCS#12) 可包含所有私鑰、公鑰和證書。其以二進位制格式儲存,也稱為 PFX 檔案。

 

四、加密演算法

加密演算法有倆大類,第一種是不基於KEY的,另一種是不基於KEY的。

    基於KEY的,舉個簡單的例子,我要加密”fordesign”這麼一串字元,就把每個字元都變成它的後一個字元,那麼就是”gpseftjhm”了,這樣的東西人家當然看不明白,接收方用相反的方法就可以得到原文。當然這只是個例子,現在應該沒人用這麼搞笑的加密演算法了吧。

    不基於KEY,好象一直用到了計算機出現。我記得古中國軍事機密都是用這種方式加密的。打戰的時候好象軍隊那些電報員也要帶著密碼本,也應該是用這種方式加密的。這種演算法的安全性以保持演算法的保密為前提。
    這種加密演算法的缺點太明顯了,就是一旦你的加密演算法給人家知道,就肯定掛。日本中途島慘敗好象就是密碼給老米破了。設計一種演算法是很麻煩的,一旦給人破了就沒用了,這也忑浪費。

    我們現在使用的加密演算法一般是基於key的,也就是說在加密過程中需要一個key,用這個key來對明文進行加密。這樣的演算法即使一次被破,下次改個key,還可以繼續用。key是一個什麼東西呢?隨便你,可以是一個隨機產生的數字,或者一個單詞,啥都行,只要你用的演算法認為你選來做key的那玩意合法就行。

    這樣的演算法最重要的是:其安全性取決於key,一般來說取決於key的長度。也就是說應該保證人家在知道這個演算法而不知道key的情況下,破解也相當困難。其實現在常用的基於KEY的加密演算法在網路上都可以找到。

基於key的加密演算法又包括倆類:對稱加密和不對稱加密。

    對稱加密指的是雙方使用完全相同的key, 最常見的是DES. DES3, RC4等。對稱加密演算法的原理很容易理解,通訊一方用KEK加密明文,另一方收到之後用同樣的KEY來解密就可以得到明文。

    不對稱加密指雙方用不同的KEY加密和解密明文,通訊雙方都要有自己的公共金鑰和私有金鑰。 
    舉個例子比較容易理解, 我們們假設通訊雙方分別是A、B。
    A 擁有 KEY_A1、KEY_A2, 其中KEY_A1是A的私有金鑰,KEY_A2是A的公共金鑰。
    B 擁有 KEY_B1、KEY_B2, 其中KEY_B1是B的私有金鑰,KEY_B2是B的公共金鑰。
    公共金鑰和私有金鑰的特點是,經過其中任何一把加密過的明文,只能用另外一把才能夠解開。也就是說經過KEY_A1加密過的明文,只有KEY_A2才能夠解密,反之亦然。

通訊過程如下:

    A——–>KEY_A2————>B
    A<——–KEY_B2<————A
    
    這個過程叫做公共金鑰交換,老外管這叫key exchange。
    之後A和B就分別用對方的公共金鑰加密,用自己的私有金鑰解密。
    一般公共金鑰是要釋出出去的,然後你通過自己的私有金鑰加密明文,人家用你的公共金鑰解密,如果能解開,那麼說明你是加密人,這就是SSL使用的驗證機制。

我如果要發給你,我就用你的公鑰加密,這讓只有你能用自己的私鑰解密。如果我用自己的私鑰加密,然後釋出出去,這就不屬於保密,而是屬於認證,證明這條資訊是我發的,而且我不能賴帳,因為私鑰只有我自己知道。

常用的不對稱加密一般有RSA、 DSA、 DH等。我們一般使用RSA。

 

五、數字簽名

     數字簽名也是不對稱加密演算法的一個重要應用,理解它對於理解SSL很重要的,放在這裡一起介紹一下。

     簽名是什麼大家都很熟悉吧?證明該東西是你寫的,是你釋出的,你就用簽名搞定。看看那些重要檔案都要頭頭簽名。數字簽名就是數字化的簽名了。記得公用金鑰和私有金鑰的特徵嗎?只有你一個人有你自己的私有金鑰。而你的公用金鑰是其他人都知道的 了。那麼你在寫完一封郵件之後,用自己的私有金鑰加密自己的名字,接收人用你的公共金鑰解開一看,哦,是你發的。這就是你的數字簽名過程了。

     上面的解釋是很簡化的了,其實數字簽名比這個複雜多了,但我們沒有了解的必要,知道數字簽名是這麼一回事就可以了。

      還有一種我們需要知道的加密演算法,其實我不覺得那是加密演算法 ,應該叫雜湊演算法,英文是message digest, 是用來把任何長度的一串明文以一定規則變成固定長度的一串字串。它在SSL中的作用也很重要,以後會慢慢提及的。一般使用的是MD5、SHA、base64不是加密演算法,但也是SSL經常使用的一種演算法,它是編碼方式,用來把asc碼和二進位制碼轉來轉去的。

     具體的加密解密過程我們不需要了解,因為SSL根本不關心。但瞭解加密演算法的一些基本原理是必要的,否則很難理解SSL。

 

 

參考:http://baike.baidu.com/view/16147.htm
        http://blog.csdn.net/xxf634/article/details/2713311
        http://blog.csdn.net/hj5182001/article/details/1767380


相關文章