天天看點

淺談SSL/TLS工作原理淺談SSL/TLS工作原理

淺談SSL/TLS工作原理

淺談SSL/TLS工作原理淺談SSL/TLS工作原理

肖宏輝

網絡/OpenStack/SDN/NFV搬運工

695 人贊同了該文章

(PS:說好的OpenStack Neutron VXLAN實作下一次再說)

為了保證網絡通信的安全性,需要對網絡上傳遞的資料進行加密。現在主流的加密方法就是SSL (Secure Socket Layer),TLS (Transport Layer Security)。後者比前者要新一些,不過在很多場合還是用SSL指代SSL和TLS。

先來回顧一下網絡通信加密的發展過程,假設A和B之間要網絡通信。

遠古時代

--

遠古時代自然是民風淳樸,路不拾遺,夜不閉戶。A要發資料給B,根本不用擔心竊聽和篡改,直接發就好了。

淺談SSL/TLS工作原理淺談SSL/TLS工作原理

上古時代

--

随着時代的發展,漸漸的有了一類人---C。C不僅會監聽A和B之間的網絡資料,還會攔截A和B之間的資料,僞造之後再發給A或者B,進而欺騙A和B。C就是中間人攻擊(Man In The Middle Attack)。

為了應對C的攻擊,A和B開始對自己的資料進行加密。A和B會使用一個共享的密鑰,A在發送資料之前,用這個密鑰對資料加密。B在收到資料之後,用這個密鑰對資料解密。因為加密解密用的是同一個密鑰,是以這裡的加密算法稱為對稱加密算法。

淺談SSL/TLS工作原理淺談SSL/TLS工作原理

在1981年,DES(Data Encryption Standard)被提出,這是一種對稱加密算法。DES使用一個56bit的密鑰,來完成資料的加解密。盡管56bit看起來有點短,但時間畢竟是在上古時代,56bit已經夠用了。就這樣,網絡資料的加密開始了。

因為采用了DES,A和B現在不用擔心資料被C攔截了。因為就算C攔截了,也隻能擷取加密之後的資料, 沒有密鑰就沒有辦法擷取原始資料。

但是A和B之間又有了一個新的問題,他們需要一個共享的56bit密鑰,并且這個密鑰一定要保持私密,否則被C拿到了,就沒有加密的意義了。首先AB不能通過網絡來傳遞密鑰,因為密鑰确定以前,所有的網絡通信都是不安全。如果通過網絡傳遞密鑰,密鑰有可能被攔截。攔截了就沒有加密的意義了。為了安全,A和B隻能先見一面,私下商量好密鑰,這樣C就沒辦法擷取密鑰。如果因為任何原因,之前的密鑰洩露了,那麼AB還得再見一面,重新商量一個密鑰。

現在A和B之間,最私密的資訊就是這個密鑰了,隻要保證密鑰的安全,那麼AB之間整個網絡通信都是安全的。

中古時代

--

A和B小心的保護着密鑰,不讓C知道。但是道高一尺,魔高一丈。随着技術的發展,計算機速度變得很快,快到可以通過暴力破解的方法來解密經過DES加密的資訊。不就是56bit的密鑰嗎?C找了一個好點的計算機,嘗試每一個可能的值,這樣總能找到一個密鑰破解A和B之間的加密資訊。倒不是說DES在提出時沒有考慮過這種情況,隻是在上古時代,計算機沒這麼快,破解56bit的密鑰需要的時間非常長。但是現在是中古時代,可能隻需要幾天就可以破解56bit的密鑰。

為了應對這個情況,新的協定被提出,例如triple-DES(最長168bit的密鑰),AES(最高256bit的密鑰)。經過這些改進,至少在可以預見的未來,計算機是沒有辦法在有限的時間内,暴力破解這個長度的密鑰。是以,在中古時代,将對稱加密算法的密鑰長度變長,來應對中間人攻擊。但是A和B還是需要見面商量一個密鑰。

現代

--

非對稱加密

時間到了現代。網絡通信變得十分發達,A不隻與B通信,還同時還跟其他10000個人進行網絡通信。A不可能每個人都跑去跟他們見個面,商量一個密鑰。

是以一種新的加密算法被提出,這就是非對稱加密算法。非對稱加密使用兩個密鑰,一個是public key,一個是private key。通過一個特殊的數學算法,使得資料的加密和解密使用不同的密鑰。因為用的是不同的密鑰,是以稱為非對稱加密。非對稱加密最著名的是RSA算法,這是以其發明者Rivest, Shamir 和Adleman命名。非對稱加密算法裡面的public key和private key在數學上是相關的,這樣才能用一個加密,用另一個解密。不過,盡管是相關的,但以現有的數學算法,又沒有辦法從一個密鑰,算出另一個密鑰。

非對稱加密的好處在于,現在A可以保留private key,通過網絡傳遞public key。這樣,就算public key被C攔截了,因為沒有private key,C還是沒有辦法完成資訊的破解。既然不怕C知道public key,那現在A和B不用再見面商量密鑰,直接通過網絡傳遞public key就行。

具體在使用中,A和B都各有一個public key和一個private key,這些key根據相應的算法已經生成好了。private key隻保留在各自的本地,public key傳給對方。A要給B發送網絡資料,那麼A先使用自己的private key(隻有A知道)加密資料的hash值(感謝 

@靈劍

 指正,評論區有說明),之後再用B的public key加密資料。之後,A将加密的hash值和加密的資料再加一些其他的資訊,發送給B。B收到了之後,先用自己的private key(隻有B知道)解密資料,本地運算一個hash值,之後用A的public key解密hash值,對比兩個hash值,以檢驗資料的完整性。

淺談SSL/TLS工作原理淺談SSL/TLS工作原理

在這個過程中,總共有4個密鑰,分别是A的public/private key,和B的public/private key。

如果B的解密結果符合預期,那麼至少可以證明,這個資訊隻有B能擷取,因為B的private key參與了解密,而B的private key其他人都不知道。并且,這個資訊是來自A,而不是C僞造的,因為A的public key參與了解密。一切看起來似乎很美好。

非對稱加密的安全隐患

但是在一切的最開始,A和B要通過網絡交換public key。如果C在中間攔截了呢?假設有這種情況,C攔截了A和B的public key,又分别用自己的public key發給A和B。A和B并不知道,他們還以為這個public key來自對方。當A給B發消息時,A先用自己的private key加密資料的hash值,之後用C傳來的假的public key加密資料,再發出去。C攔截到之後,先用C自己的private key解密資料,C就擷取了A的原始資訊!之後,C可以篡改資料内容,再用自己的private key加密資料的hash值,用之前攔截的B的public key加密資料,再發給B。B收到以後,先用自己的private key解密資料,再用C傳來的假public key解密hash值,發現比對。這樣,B收到了一條來自C的假的資訊,但是B還以為資訊來自于A。中間人攻擊仍然可能存在!

完了,一切都崩了,加密搞的這麼複雜,居然還不能保證網絡資料的安全。回顧一下,問題出就出在最開始通過網絡交換public key。看起來為了保證public key不被攔截,A和B似乎還是要見一面,交換一下public key。這一下就回到了上古時代。

不過,雖然A和B現在還是要見一面,但見面的實質已經變了。在上古時代,見面是為了商量一個密鑰,密鑰的内容很重要,不能讓别人知道密鑰的内容。而在現代,見面是為了确認public key的真實性,public key的内容是可以公開的。

那如果有其他辦法能保證public key的真實性,A和B是可以不用見面交換public key的。

CA

現實中,通過CA(Certificate Authority)來保證public key的真實性。CA也是基于非對稱加密算法來工作。有了CA,B會先把自己的public key(和一些其他資訊)交給CA。CA用自己的private key加密這些資料,加密完的資料稱為B的數字證書。現在B要向A傳遞public key,B傳遞的是CA加密之後的數字證書。A收到以後,會通過CA釋出的CA憑證(包含了CA的public key),來解密B的數字證書,進而獲得B的public key。

但是等等,A怎麼確定CA憑證不被劫持。C完全可以把一個假的CA憑證發給A,進而欺騙A。CA的大殺器就是,CA把自己的CA憑證內建在了浏覽器和作業系統裡面。A拿到浏覽器或者作業系統的時候,已經有了CA憑證,沒有必要通過網絡擷取,那自然也不存在劫持的問題。

淺談SSL/TLS工作原理淺談SSL/TLS工作原理

現在A和B都有了CA認證的數字證書。在交換public key的階段,直接交換彼此的數字證書就行。而中間人C,還是可以攔截A和B的public key,也可以用CA憑證解密獲得A和B的public key。但是,C沒有辦法僞造public key了。因為C不在CA體系裡面,C沒有CA的private key,是以C是沒有辦法僞造出一個可以通過CA認證的數字證書。如果不能通過CA認證,A和B自然也不會相信這個僞造的證書。是以,采用CA認證以後,A和B的public key的真實性得到了保證,A和B可以通過網絡交換public key(實際是被CA加密之後的數字證書)。

除非有種情況,A内置的CA憑證被篡改了,例如A使用了盜版的系統,“優化”了的非官方浏覽器,或者被病毒攻擊了,那這個時候,A有可能會認可非CA認證的數字證書,C就有機會發起中間人攻擊。是以,用正版至少是安全的。

實際使用

非對稱加密算法比對稱加密算法要複雜的多,處理起來也要慢得多。如果所有的網絡資料都用非對稱加密算法來加密,那效率會很低。是以在實際中,非對稱加密隻會用來傳遞一條資訊,那就是用于對稱加密的密鑰。當用于對稱加密的密鑰确定了,A和B還是通過對稱加密算法進行網絡通信。這樣,既保證了網絡通信的安全性,又不影響效率,A和B也不用見面商量密鑰了。

是以,在現代,A和B之間要進行安全,省心的網絡通信,需要經過以下幾個步驟

  • 通過CA體系交換public key
  • 通過非對稱加密算法,交換用于對稱加密的密鑰
  • 通過對稱加密算法,加密正常的網絡通信

這基本就是SSL/TLS的工作過程了。

HTTPS

HTTPS全稱是HTTP over SSL,也就是通過SSL/TLS加密HTTP資料,這或許是SSL最廣泛的應用。

前面提到了CA作為一個公證機構,能確定數字證書的真實性。但是在實際使用中,CA認證一般是要收費的,普通人不會去做CA認證,進而獲得屬于自己的數字證書。更多的是,一些大的機構,例如銀行,網店,金融機構,它們去獲得自己的數字證書。那這種情況如何保證網絡通信的安全呢?

這些機構擷取到CA授予的數字證書之後,将數字證書加到自己的web伺服器上。當使用者要去通路它們的網頁,例如https://domain.com,會經過下圖所示的步驟。

淺談SSL/TLS工作原理淺談SSL/TLS工作原理
  • 使用者向web伺服器發起一個安全連接配接的請求
  • 伺服器傳回經過CA認證的數字證書,證書裡面包含了伺服器的public key
  • 使用者拿到數字證書,用自己浏覽器内置的CA憑證解密得到伺服器的public key
  • 使用者用伺服器的public key加密一個用于接下來的對稱加密算法的密鑰,傳給web伺服器
    • 因為隻有伺服器有private key可以解密,是以不用擔心中間人攔截這個加密的密鑰
  • 伺服器拿到這個加密的密鑰,解密擷取密鑰,再使用對稱加密算法,和使用者完成接下來的網絡通信

現在使用者知道自己通路的網站是正規的網站,否則使用者浏覽器會報錯說不能用CA憑證解析。伺服器通過CA授予的數字證書自證了身份。但,這裡的安全隐患在于,伺服器怎麼知道通路者就是真使用者呢?之前介紹的雙向認證是可以通過數字證書驗明使用者的正身,現在使用者為了省錢沒有數字證書。這種情況下一般是通過使用者名密碼來确認使用者。是以,大家要保管好自己的密碼。

編輯于 2018-05-18

繼續閱讀