2014年7月5日 星期六

四樓的守衛 - SSL/TLS

這將是極為簡略的概念介紹,只為了完整性的緣故,才寫這篇文章。因為詳細介紹必須連同 block cipher, stream cipher, RSA, DSA, Diffie-Hellman, ECC, HMAC, PKI, X.509 等主題一併介紹,我真是沒那麼有耐心。不過你也可以知道,SSL/TLS 是一套相當完善的規格,破解它相當困難,但是也並非不可能。

SSL 是 Secure Socket Layer 的簡稱,TLS 則是 Transport Layer Security 的簡稱。TLS 1.0 相當於 SSL 3.1 版本,原因在於 SSL 於 3.0 版本以前,並沒有一個 IETF RFC 的協定規格,TLS 1.0 只是將 SSL 3.0 的作法規格化,並加諸了一些調整,因此許多時候我們都一起提到它們。SSL 是 NetScape 這家公司所發明,這家公司已經被微軟以惡性競爭的手法給鬥倒了,如今不復存在,但是它的發明仍然造福許多人,其中還包括了 JavaScript。而 NetScape 也是 Mozilla 機構的創始者,它在被鬥倒前將 NetScape 瀏覽器的程式碼公開,並成立 Mozilla 機構以非營利組織的方式繼續開發瀏覽器軟體。如果沒有許多像 Mozilla 這樣秉持著無私精神開放原始碼的機構或程式設計師,網際網路不會這麼興盛。有著這樣高道德標準以及高超技術的程式設計師,我們稱呼他們為駭客 (Hacker)。

駭客這個詞彙是具有歷史意義,且代表高度評價的。

在普遍使用電話數據機撥接的年代,這個稱謂不是這麼簡單就能配得的。那時候當駭客的基本條件是要會至少五種不同的程式語言、熟稔作業系統與網路技術、經營網站以協助網際網路發展、參與開原碼的程式開發計畫等等。這些都還不是必然條件,只是門檻條件而已。只有當世界級的高手們認同你,社群裡普遍承認你的貢獻,大家以此稱謂稱呼你,你才算是駭客。

現在,這個詞彙已經被濫用了。但仍有少數人抱持著無愧的良心繼續努力。請參考 Raymond 的文章

回到 SSL/TLS,目前 (2014/7) 最新版是 TLS 1.2,以下簡稱 TLS。

TLS 通常建立於 TCP 之上,因為它假設 Process-to-Process Communication 以及 Reliable Data Transport 這兩項服務是存在的。也有些將 TLS 運用在不同的場合中,但大多假設剛剛提到的那兩項服務存在。

TLS 在 TCP 的三方握手通訊建立後,分成幾個步驟。

第一,雙方確認加密協定、憑證協定、金鑰交換協定、HMAC 的雜湊協定等等,首先是 Client 會丟出它所支援的協定組合清單,外加隨機變數 (Nounce),再來是 Server 會選擇清單中它所支援或偏好的項目,並且也產生 Nounce,丟回給 Client,雙方確認之後的通訊會用某一組特定的協定組合來建立安全通訊。

常見的協定組合舉例如下:
  • TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256
  • TLS-ECDH-RSA-WITH-AES-128-CBC-SHA256
  • TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256

大概可以這樣解讀:
  • TLS-金鑰交換協定-憑證協定-WITH-加密協定-加密金鑰長度-加密模式-HMAC雜湊協定
所以以 TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256 來說:
  • 金鑰交換協定:ECDHE,代表橢圓曲線演算法搭配 Ephemeral Diffie-Hellman 金鑰交換機制。
  • 憑證協定:RSA
  • 加密協定:AES
  • 加密金鑰長度:128
  • 加密模式:CBC,代表 Cipher Block Chaining 模式
  • HMAC雜湊協定:SHA256
常見的金鑰交換模式又可分為幾種:
1. 直接 RSA 公開金鑰交換
2. 透過 Diffie-Hellman (DH) 做金鑰交換,並配搭以 RSA 簽章
3. 透過橢圓曲線加解密演算法 (ECC) 使用 DH 機制做金鑰交換,並搭配 RSA 簽章

以上 2 和 3,又可將 RSA 簽章換成 DSS (Digital Signature Standard) 以 DSA (Digital Signature Algorithm) 來簽章。

而 2 和 3 又可分為直接交換,以及 Ephemeral 模式交換。Ephemeral 模式代表每次都會產生出新的公開金鑰 (DH 或 ECC 的公開金鑰,非 RSA 憑證內的公開金鑰),以此達到 Perfect Forward Secrecy (PFS) 的功能,也就是每次交談的 session 都是新的金鑰,破解之前的任何金鑰對當前新的金鑰沒有任何影響,字面上來說,就是未來的 (Forward) 的祕密 (Secrecy) 是完美的 (Perfect)。

這只是 TLS 的第一步,也就是雙方先橋好之後要用哪些協定。你可以想像 TLS 是一個複雜且完善的機制。

第二步,隨著 Server 選用的金鑰交換機制,Client 可以用不同的機制來選擇性認證 Server。通常都是使用 RSA 的機制來認證。實作方法就是透過 PKI 機制,在 Client 端預先安裝一些受信任的根憑證 (Root Certificate),這些根憑證是屬於某些第三方認證機構 (Certificate Authority, CA) 的。而 Server 所傳來的公開金鑰或者數位簽章則是被這些 CA 所簽署。因此可以認證 Server 真的是 Server。這樣的認證機制是建立在根憑證、CA,以及 RSA 演算法的安全性之上,只要以上三者是安全的,則 Client 就可以相信 Server 真的是它所說的 Server。

憑證的格式採用規格 X.509。

隨著 Server 選用的金鑰交換機制不同,這裡驗證完 Server 的身份之後,便使用 Server 的公開金鑰,或者 Server 所簽署過的公開金鑰,來進行下一步動作。

下一步,Client 產生 Pre-Master Secret 數值,根據 Server 的要求,選擇性的是否也認證 Client,多半的實務情況是不用,除非是連上公司的 VPN。Client 將 Pre-Master Secret 在金鑰交換規定下丟給 Server。Client 與 Server 可透過 Pre-Master Secret 來運算出四把金鑰,分別是 Client 的加密金鑰以及認證金鑰 (HMAC 金鑰),以及 Server 的加密金鑰和認證金鑰。

最後一步,除非雙方有提出修改安全機制協定的請求,否則將透過 HMAC 來將剛剛所傳送過的資料做認證。

TLS 也定義了 Alert 機制,當通訊過程中發生問題,例如偵測到有中間人攻擊,或者任何的加密或認證資料被竄改,則透過 Alert 機制來通知對方,或者中止連線。

TLS 將應用層所傳輸過來的訊息,放在規格定義的 Record 中,以 Record 為單位進行加密。

每一次的 TLS 通訊可以看作是一個 Session,根據通訊雙方協定的金鑰交換協定,可決定每次 Session 選用相同的非對稱金鑰或者產生出新的一組。原則上每次 Session 使用不同的非對稱式金鑰的方式,我們會稱呼它為 Perfect Forward Secrecy。

總之,TLS 有點複雜,且相當全備,所以安全性很高,常被拿來在商業通訊上使用,例如網路商店或銀行。常用的通訊軟體 LINE 也是走 TLS。

沒有留言:

張貼留言