From: 掃盲 HTTPS 和 SSL/TLS 協議[0]:引子html
須要瞭解的背景知識:node
SSL(Secure Sockets Layer, 安全套接字),由於原先互聯網上使用的 HTTP 協議是明文的,存在不少缺點——好比傳輸內容會被偷窺(嗅探)和篡改。發明 SSL 協議,就是爲了解決這些問題。git
到了1999年,SSL 由於應用普遍,已經成爲互聯網上的事實標準。IETF 就在那年把 SSL 標準化。標準化以後的名稱改成 TLS(是「Transport Layer Security」的縮寫),中文叫作「傳輸層安全協議」。github
不少相關的文章都把這二者並列稱呼(SSL/TLS),由於這二者能夠視做同一個東西的不一樣階段。算法
HTTPS = HTTP + SSL/TLS, 也就是 HTTP over SSL 或 HTTP over TLS.這是後面加 S
的由來 瀏覽器
相對於HTTP:安全
HTTP對TCP的鏈接使用分爲:服務器
若是是短鏈接的話,針對每一個HTML資源,就會針對每個外部資源,分別發起一個個 TCP 鏈接。相反,若是是「長鏈接」的方式,瀏覽器也會先發起一個 TCP 鏈接去抓取頁面。可是抓取頁面以後,該 TCP 鏈接並不會當即關閉,而是暫時先保持着(所謂的「Keep-Alive」)。而後瀏覽器分析 HTML 源碼以後,發現有不少外部資源,就用剛纔那個 TCP 鏈接去抓取此頁面的外部資源。網絡
注意:session
HTTPS的設計要兼容HTTP
關於HTTPS的性能,爲了確保性能,SSL 的設計者至少要考慮以下幾點:
SSL/TLS協議的基本思路是採用公鑰加密法,也就是說,客戶端先向服務器端索要公鑰,而後用公鑰加密信息,服務器收到密文後,用本身的私鑰解密。
問題:
所以,SSL/TLS協議的基本過程是這樣的:
以下圖解:
以下圖示:
注意的是,」握手階段」的全部通訊都是明文的
C向S提供信息以下:
服務器收到客戶端請求後,向客戶端發出迴應,這叫作SeverHello。服務器的迴應包含如下內容。
除了上面這些信息,若是服務器須要確認客戶端的身份,就會再包含一項請求,要求客戶端提供」客戶端證書」。
客戶端收到服務器迴應之後,首先驗證服務器證書。若是證書不是可信機構頒佈、或者證書中的域名與實際域名不一致、或者證書已通過期,就會向訪問者顯示一個警告,由其選擇是否還要繼續通訊。
若是證書沒有問題,客戶端就會從證書中取出服務器的公鑰。而後,向服務器發送下面三項信息。
如今總共有3個隨機數,第三個又稱」pre-master key」,有了它之後,客戶端和服務器就同時有了三個隨機數,接着雙方就用事先商定的加密方法,各自 生成 本次會話 所用的 同一把 「會話密鑰」。
服務器收到客戶端的第三個隨機數pre-master key以後,計算生成本次會話所用的」會話密鑰」。而後,向客戶端最後發送下面信息。
至此,整個握手階段所有結束。接下來,客戶端與服務器進入加密通訊,就徹底是使用普通的HTTP協議,只不過用」會話密鑰」加密內容。
不完整總結以下:
首先建立證書
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem
實例代碼在: ssl_demo