你瞭解HTTPS,但你可能不瞭解X.509

世上根本就沒有HTTPS協議,只有HTTP協議。——知乎某答友html

某天,收到領導指示:學習一下X.509相關原理。web

不少開發者可能和我同樣以爲X.509這個詞很陌生,但其實咱們常常和它打交道,屬於典型的「日用而不知」的東西。算法

那麼X.509是什麼呢?
X.509是一種數字證書格式標準
應用很普遍,如今HTTPS依賴的SSL證書使用的就是使用的X.509格式。這也就是說,每當咱們打開https開頭的網站都會用到它。數組

格式標準

簡單地說,格式標準就像寫HTML文件時的規範:開頭聲明文檔類型,html做爲根標籤,元信息放在head標籤中,頁面內容放在body標籤中等等。
固然這個例子不是那麼貼切,由於實際上不按照這個格式編寫的html文件瀏覽器也能解析出來。
更貼切的例子應該是JSON文件格式,規定了嵌套關係必須用大括號,數組必須用中括號,字符串必須用雙引號等等,若是違反了一條其中的規則,那麼就沒法被正確的解析。瀏覽器

這個標準的具體內容是什麼呢?
X.509規定的格式大體以下:安全

版本號
序列號
簽名算法
頒發者
證書有效期
  開始日期
  終止日期
主題
主題公鑰信息
  公鑰算法
  主體公鑰
頒發者惟一身份信息(可選)
主題惟一身份信息(可選)
擴展信息(可選)
簽名

下圖是某網站的 X.509 證書信息服務器

{% asset_img certificate.jpg %}網絡

數字證書

那麼數字證書又是什麼?
簡單的說,數字證書就是經過加密算法來製造的一個網絡「身份證」,用來證實通訊方的真實身份。
這個「身份證」的製做過程也頗有意思,並非由一個機構統一發放,而是層層頒發。
好比 A 持有了可信證書,那麼它頒發給的 B 的證書也是可信的, B 再頒發給 C 的證書也是可信的。
總體結構很像數據結構中的「樹」,其中 A 的證書爲「根證書」,B 的爲「中介證書」,C 的爲「終端證書」。
而 A、B 都被稱做認證機構,簡稱 CA(Certificate authority)。數據結構

根證書
   |
中介證書
   |
終端證書
  • 根證書:一般預先安裝在操做系統和瀏覽器中,是由大公司和政府聯合制做的(用戶也能夠本身製做,可是會有安全風險),做爲證書鏈的起點。
  • 中介證書:持有中介證書的CA主要負責給終端頒發證書,這些終端證書既有收費的也有免費的,免費終端證書通常使用期限是1年。
  • 終端證書:終端證書通常就是咱們在瀏覽器上能夠查看到的證書,一般用於具體網站服務中。這類證書不會再用做頒發新的證書。

每一個證書均可以沿着樹往上追溯到根證書,從而造成一條信任鏈。
好比下面這種圖就是某網站證書的信任鏈信息。負載均衡

{% asset_img certificate-chain.jpg %}

關於 X.509 的內容就分享完了。

可是心中的疑惑驅使着我繼續探索,這證書靠譜麼?
若是黑客僞造認證機構給木馬網站頒發證書呢?

安全機制

證書採用的是一種非對稱加密機制來保證信息不被竊取和複製。

加密技術

這裏稍稍解釋下非對稱機密,先說說密碼學。

信息加密的需求其實一直都存在,從古代開始就使用各類技術來加密重要的信息,可是古代的加密安全程度都是基於加密方式的。

也就是說,別人若是知道了加密方式,那麼就能夠解密密文信息。

而現代的加密技術安全性在於密鑰的安全,也就是說加密方式(算法)是公開的,只要密鑰不被竊取或泄露,信息就是安全的。

雖然加密算法有不少種,可是大體上能夠分爲兩類:對稱加密和非對稱加密。

對稱加密的通訊雙方都是用同一個密鑰進行加解密,而非對稱加密則要求使用不一樣的密鑰進行加密和解密。

再回到證書的頒發過程,如今不少雲服務廠商都提供了申請數字證書的功能,它會像CA發起申請,CA收到申請以後,作了下面的事情:

  1. 使用加密算法生成公私鑰對。私鑰通常是以.key爲後綴名的文件,公鑰存儲於以.csr結尾的文件中。
  2. .csr文件中補充一些信息好比有效期限等,頒發者,並用本身的私鑰對證書進行簽名。這樣就生成符合X.509格式的證書。
  3. 用戶收到證書後,在web服務器(或負載均衡等設備)上進行部署。

SSL證書

符合X.509格式的證書有多種,這裏以SSL證書爲例。

常見的場景會是下面這樣:

  1. 客戶端,好比瀏覽器會向服務端發送請求,服務端爲了證實本身的身份,會發送證書給對方。
  2. 瀏覽器讀取證書的數字簽名部分,用自身根證書列表中對應的公鑰證書對其進行解密。若是解密成功,而且證書哈希值與簽名內的哈希值匹配一致,可證實站點提供的證書確實是該CA根證書籤發的,不然給出風險提示。
  3. 驗證經過以後,使用證書中的公鑰對隨機數和對稱加密算法加密,發送給服務端,服務端用私鑰進行解密,得到密鑰和加密算法。
  4. 服務端與瀏覽器後續通訊將會使用新的對稱加密算法和隨機密鑰加密信息。

證書在整個流程起到了重要的做用,那麼能不能經過竊取和僞造的方式來獲取通訊內容呢?

  • 竊取。首先證書固然是能夠被竊取的,由於它是公開的,可是拿到了證書後也只能和服務端進行通訊,不能用來竊取其它信息,至於證書的私鑰存儲在服務端,更加不可能隨意被竊取了。
  • 僞造。若是有人僞造了一張網站證書,那麼瀏覽器在向CA查詢證書信息的時候就會驗證失敗。

那這麼說就是絕對安全了嗎?非也~

對於DNS劫持的狀況仍是無解的。好比瀏覽器訪問網站的時候給了一個假證書,而後向CA驗證證書的時候又訪問了一個假網站,證書就有可能被驗證經過。從而黑客能夠做爲中間方獲取並轉發雙方的數據。

總結

SSL證書從生成到使用涉及到了三次加解密過程:

  1. 證書生成的時候利用私鑰簽名,驗證證書的時候利用公鑰解密。
  2. 確認證書有效後,利用證書中的公鑰進行加密,服務端利用私鑰解密。
  3. 雙方使用新生成的隨機密鑰進行數據加解密。

用一張結構圖表示下HTTPS和X.509的關係:

HTTPS
  /       \
HTTP    TLS/SSL
        /      \
   通訊內容    確認身份
相關文章
相關標籤/搜索