世上根本就沒有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)。數據結構
根證書 | 中介證書 | 終端證書
每一個證書均可以沿着樹往上追溯到根證書,從而造成一條信任鏈。
好比下面這種圖就是某網站證書的信任鏈信息。負載均衡
{% asset_img certificate-chain.jpg %}
關於 X.509 的內容就分享完了。
可是心中的疑惑驅使着我繼續探索,這證書靠譜麼?
若是黑客僞造認證機構給木馬網站頒發證書呢?
證書採用的是一種非對稱加密機制來保證信息不被竊取和複製。
這裏稍稍解釋下非對稱機密,先說說密碼學。
信息加密的需求其實一直都存在,從古代開始就使用各類技術來加密重要的信息,可是古代的加密安全程度都是基於加密方式的。
也就是說,別人若是知道了加密方式,那麼就能夠解密密文信息。
而現代的加密技術安全性在於密鑰的安全,也就是說加密方式(算法)是公開的,只要密鑰不被竊取或泄露,信息就是安全的。
雖然加密算法有不少種,可是大體上能夠分爲兩類:對稱加密和非對稱加密。
對稱加密的通訊雙方都是用同一個密鑰進行加解密,而非對稱加密則要求使用不一樣的密鑰進行加密和解密。
再回到證書的頒發過程,如今不少雲服務廠商都提供了申請數字證書的功能,它會像CA發起申請,CA收到申請以後,作了下面的事情:
.key
爲後綴名的文件,公鑰存儲於以.csr
結尾的文件中。.csr
文件中補充一些信息好比有效期限等,頒發者,並用本身的私鑰對證書進行簽名。這樣就生成符合X.509格式的證書。符合X.509格式的證書有多種,這裏以SSL證書爲例。
常見的場景會是下面這樣:
證書在整個流程起到了重要的做用,那麼能不能經過竊取和僞造的方式來獲取通訊內容呢?
那這麼說就是絕對安全了嗎?非也~
對於DNS劫持的狀況仍是無解的。好比瀏覽器訪問網站的時候給了一個假證書,而後向CA驗證證書的時候又訪問了一個假網站,證書就有可能被驗證經過。從而黑客能夠做爲中間方獲取並轉發雙方的數據。
SSL證書從生成到使用涉及到了三次加解密過程:
用一張結構圖表示下HTTPS和X.509的關係:
HTTPS / \ HTTP TLS/SSL / \ 通訊內容 確認身份