一文看懂SSL/TLS/OPENSSL/HTTPS

2021-02-13 運維部落


SSL和TLS發展歷程

SSL/TLS的作用

OpenSSL和HTTPS分別是什麼及區別

TLS/SSL 協議通信原理

一文看懂SSL/TLS/OPENSSL/HTTPS

看了上篇文章的閱讀量,我知道算法理論對運維同學太不友好了~ 所以果斷跳過算法下篇,直接介紹本次的 SSL,TLS,OPENSSL,HTTPS~ 感興趣的同學自行研究啦

話說,這4個概念都是起源了上次內容介紹的網際網路通信安全,要幾句話介紹清楚可能就別想了,做技術還是需要板凳坐穿的耐心了。so,今天的文章又是難啃的骨頭。打好預防針,我們即刻開始本次內容。

上次內容提到,網際網路安全的最終形態是數學。數學家絞盡腦汁發明了很多加密算法,但還需要程式設計師自己去寫工具寫程序去調用這些算法,才能實現數據加密。

在WEB化應用中,每家公司都自己開發,生產力不就這樣浪費了嗎,有人的地方就有江湖,所以有人出來寫了一套供大家使用,這就是開源精神嘛。

傳輸層安全協議(英語:Transport Layer Security,縮寫:TLS),及其前身安全套接層(Secure Sockets Layer,縮寫:SSL)是一種安全協議,目的是為網際網路通信,提供安全及數據完整性保障。

SSL和TLS發展歷程

網際網路加密通信協議的歷史,幾乎與網際網路一樣長

SSL(Secure Sockets Layer) 是網景公司(Netscape)設計的主要用於Web的安全傳輸協議,這種協議在Web上獲得了廣泛的應用。

基礎算法由作為網景公司的首席科學家塔希爾·蓋莫爾(Taher Elgamal)編寫,所以他被人稱為「SSL之父」。

1994年,NetScape公司設計了SSL協議(Secure Sockets Layer)的1.0版,但是未發布。1995年,NetScape公司發布SSL 2.0版,很快發現有嚴重漏洞。1996年,SSL 3.0版問世,得到大規模應用。1999年,網際網路標準化組織ISOC接替NetScape公司,發布了SSL的升級版TLS 1.0版。2006年和2008年,TLS進行了兩次升級,分別為TLS 1.1版和TLS 1.2版。最新的變動是2011年TLS 1.2的修訂版。

目前,應用最廣泛的是TLS 1.0,接下來是SSL 3.0。但是,主流瀏覽器都已經實現了TLS 1.2的支持。

SSL/TLS的作用

SSL 是洋文「Secure Sockets Layer」的縮寫,中文叫做「安全套接層」。它是在上世紀90年代中期,由網景公司設計的。(順便插一句,網景公司不光發明了 SSL,還發明了很多 Web 的基礎設施——比如「CSS 樣式表」和「JS 腳本」)

為啥要發明 SSL 這個協議捏?因為原先網際網路上使用的 HTTP 協議是明文的,存在很多缺點——比如傳輸內容會被偷窺(嗅探)和篡改。發明 SSL 協議,就是為了解決這些問題。

到了1999年,SSL 因為應用廣泛,已經成為網際網路上的事實標準。IETF 就在那年把 SSL 標準化。標準化之後的名稱改為 TLS(是「Transport Layer Security」的縮寫),中文叫做「傳輸層安全協議」

很多相關的文章都把這兩者並列稱呼(SSL/TLS),因為這兩者可以視作同一個東西的不同階段。

OpenSSL和HTTPS分別是什麼及區別

SSL是啥?

大家知道我們訪問網站的時候,以HTTPS開頭的表示你和伺服器之間傳輸的數據經過了加密,這裡所使用的加密協議就是SSL(Secure Sockets Layer,後來又推出了它的後續版本,改名叫TLS)。也就是說,把HTTP協議經過一層SSL協議進行加密包裝,就變成了HTTPS。當然,SSL/TLS還用在很多協議中,例如VPN、加密的電子郵件協議等。

那麼OpenSSL又是啥?

在SSL協議中,我們使用了很多密碼學手段來保護數據,其中包括對稱密碼、公鑰密碼、數字籤名、證書、完整性校驗、偽隨機數生成等。由於這些算法和操作都非常複雜,於是開源社區就開發了一套庫,這個庫裡面提供了很多現成的標準方法,其他開發者只要用正確調用這些方法,就可以實現SSL協議中的各種加密/解密操作了。因此,OpenSSL是一套開源的密碼學工具包(open source cryptography toolkit)

OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及 SSL 協議,並提供豐富的應用程式供測試或其他的目的使用。

SSL層

OpenSSL由三部分組成:

這4個概念了解清楚後,大頭戲才剛剛開始。

在前面的文章中,我們介紹了數據通信原理,現在在應用層和傳輸中中間夾了一層SSL,那整個通信方式有了哪些變化呢?

TLS/SSL 協議通信原理SSL會話四個階段ssl會話握手

"握手階段"涉及四次通信,我們一個個來看。需要注意的是,"握手階段"的所有通信都是明文的

首先,客戶端(通常是瀏覽器)先向伺服器發出加密通信的請求,這被叫做ClientHello請求。在這一步,客戶端主要向伺服器提供以下信息。

一個客戶端生成的隨機數,稍後用於生成"對話密鑰"。

這裡需要注意的是,客戶端發送的信息之中不包括伺服器的域名。也就是說,理論上伺服器只能包含一個網站,否則會分不清應該向客戶端提供哪一個網站的數字證書。這就是為什麼通常一臺伺服器只能有一張數字證書的原因。

對於虛擬主機的用戶來說,這當然很不方便。2006年,TLS協議加入了一個Server Name Indication擴展,允許客戶端向伺服器提供它所請求的域名。

伺服器收到客戶端請求後,向客戶端發出回應,這叫做SeverHello。伺服器的回應包含以下內容。

確認使用的加密通信協議版本,比如TLS 1.0版本。如果瀏覽器與伺服器支持的版本不一致,伺服器關閉加密通信。一個伺服器生成的隨機數,稍後用於生成"對話密鑰"。索要客戶端證書(非必須),銀行金融系統會需要,其它很少有網點會索取

除了上面這些信息,如果伺服器需要確認客戶端的身份,就會再包含一項請求,要求客戶端提供"客戶端證書"。比如,金融機構往往只允許認證客戶連入自己的網絡,就會向正式客戶提供USB密鑰,裡面就包含了一張客戶端證書。

客戶端收到伺服器回應以後,首先驗證伺服器證書。如果證書不是可信機構頒布、或者證書中的域名與實際域名不一致、或者證書已經過期,就會向訪問者顯示一個警告,由其選擇是否還要繼續通信。如果證書沒有問題,客戶端就會從證書中取出伺服器的公鑰。然後,向伺服器發送下面三項信息。

一個隨機數。該隨機數用伺服器公鑰加密,防止被竊聽。編碼改變通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送。客戶端握手結束通知,表示客戶端的握手階段已經結束。這一項同時也是前面發送的所有內容的hash值,用來供伺服器校驗。

上面第一項的隨機數,是整個握手階段出現的第三個隨機數,又稱"pre-master key"。有了它以後,客戶端和伺服器就同時有了三個隨機數,接著雙方就用事先商定的加密方法,各自生成本次會話所用的同一把"會話密鑰"。

至於為什麼一定要用三個隨機數,來生成"會話密鑰" ,看如下解釋:

"不管是客戶端還是伺服器,都需要隨機數,這樣生成的密鑰才不會每次都一樣。由於SSL協議中證書是靜態的,因此十分有必要引入一種隨機因素來保證協商出來的密鑰的隨機性。對於RSA密鑰交換算法來說,pre-master-key本身就是一個隨機數,再加上hello消息中的隨機,三個隨機數通過一個密鑰導出器最終導出一個對稱密鑰。

Pre-master-key的存在在於SSL協議不信任每個主機都能產生完全隨機的隨機數,如果隨機數不隨機,那麼pre master secret就有可能被猜出來,那麼僅適用pre master secret作為密鑰就不合適了,因此必須引入新的隨機因素,那麼客戶端和伺服器加上pre master secret三個隨機數一同生成的密鑰就不容易被猜出了,一個偽隨機可能完全不隨機,可是是三個偽隨機就十分接近隨機了,每增加一個自由度,隨機性增加的可不是一。"

此外,如果前一步,伺服器要求客戶端證書,客戶端會在這一步發送證書及相關信息。

伺服器收到客戶端的第三個隨機數pre-master key之後,計算生成本次會話所用的"會話密鑰"。然後,向客戶端最後發送下面信息。

編碼改變通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送。伺服器握手結束通知,表示伺服器的握手階段已經結束。這一項同時也是前面發送的所有內容的hash值,用來供客戶端校驗。

至此,整個握手階段全部結束。接下來,客戶端與伺服器進入加密通信,就完全是使用普通的HTTP協議,只不過用"會話密鑰"加密內容。

引用官方非常經典的一幅圖,值得看10遍!

官方圖

相關焦點

  • 使用openssl生成https證書
    背景http在公網傳輸的時候,都是明文的,因此考慮加個ssl證書。創建ssl證書1、創建密鑰使用openssl工具生成一個RSA私鑰openssl genrsa -des3 -out server.key 2048注意:生成私鑰,需要提供一個至少
  • 聊聊 HTTPS 和 SSL/TLS 協議
    原文:http://www.techug.com/post/https-ssl-tls.html要說清楚 HTTPS 協議的實現原理
  • HTTPS 證書生成原理和部署細節
    小白用戶以為是京東有意放置的,細心的用戶會發現,這個 iframe 一層嵌一層的噁心廣告很明顯是電信/中間人通過 DNS 劫持注入進去的,十分噁心,沒有關閉按鈕。  生成密鑰、證書  第一步,為伺服器端和客戶端準備公鑰、私鑰# 生成伺服器端私鑰openssl genrsa -out server.key 1024# 生成伺服器端公鑰openssl rsa -in server.key -pubout -out server.pem # 生成客戶端私鑰openssl genrsa -out client.key
  • HTTPS連接的前幾毫秒發生了什麼?
    03https是應對中間人攻擊的唯一方式在ssl的源碼裡面就有一段注釋:/* cert is OK.數據傳輸還是用的http,加密用的tls。tls和ssl又是什麼關係?ssl是tls的前身,ssl deprecated之後,才開始有了tls 1.0、1.1、1.22.
  • Android HTTPS防抓包策略與對抗方法總結
    系統證書校驗OkHttp框架發起https請求時,默認就是使用的系統信任庫證書鏈對服務端返回的證書進行驗證,https請求實現如下: /* * https協議 * 默認證書鏈校驗,只信任系統CA(根證書) * * OKHTTP默認的https請求使用系統CA驗證服務端證書(
  • 使用ssl_exporter監控K8S集群證書
    ssl_exporter就是來做這個事情的。ssh_exporter是一個Prometheus Exporter能提供多種針對 SSL 的檢測手段,包括:https 證書生效/失效時間、文件證書生效/失效時間,OCSP 等相關指標。下面就來監聽集群證書的有效期。
  • TLS/SSL 協議-非對稱加密(RSA)原理
    openssl rsa -in private.pem -pubout -out public.pemINTEGER, -- d mod (q-1) coefficient INTEGER, -- (inverse of q) mod p otherPrimeInfos OtherPrimeInfos OPTIONAL }Tips:RFC3347 地址:https
  • MongoDB安全實戰之SSL協議加密
    本文主要講述MongoDB的SSL協議加密的使用和配置的實戰經驗,非常值得一看。2.2.1 生成ca.pem及privkey.pem文件cd /etc/sslopenssl req -out ca.pem -new -x509 -days 3650 -subj 「/C=CN/ST=/BeiJing/O=bigdata/CN=root/emailAddress=13416157913@163.com」
  • OpenSSL 入門:密碼學基礎知識 | Linux 中國
    openssl/err.h> /* errors */#include <openssl/ssl.h> /* core library */void report_and_exit(const char* msg) { ERR_print_errors_fp(stderr); SSL_load_error_strings();void cleanup(SSL_CTX* ctx,
  • HTTPS 小結
    PKI用來確定連結關係的這一角色稱為RA(Registration Authority, 註冊管理中心),RA能夠確保公開密鑰和個人身份連結,可以防抵賴,防篡改。在微軟的公鑰基礎建設下,RA又被稱為CA,目前大多數稱為CA。
  • 聊聊HTTPS和SSL/TLS協議
    因為原先網際網路上使用的 HTTP 協議是明文的,存在很多缺點——比如傳輸內容會被偷窺(嗅探)和篡改。發明 SSL 協議,就是為了解決這些問題。  到了1999年,SSL 因為應用廣泛,已經成為網際網路上的事實標準。IETF 就在那年把 SSL 標準化。標準化之後的名稱改為TLS(是「Transport Layer Security」的縮寫),中文叫做「傳輸層安全協議」。
  • python 爬蟲一招解決SSl 報錯SSLError
    摘要用python寫爬蟲的時候沒我們經常遇到https認證的網站,採用常用模塊requests模塊,我們一般在請求中將verify設置成假,免證書驗證,但是這些都是理想狀態,https請求很容易報錯,一旦報錯就難以解決。
  • Ansblie-自動化IT資源管理工具(一)
    Ansible與其他軟體對比Ansible安裝部署、運行一、Ansible安裝pythonyum install zlib zlib-devel gcc openssl openssl-devel -y1 首先確認Linux作業系統中自帶的python 版本時候與自己所需要的版本一致所有的python版本都在https://www.python.org
  • 數字證書那點事(附CP4D及VCenter7定製TLS證書部署案例參考)
    我們平常一直提及所說的HTTPS ,本質是沒有HTTPS 這個協議的,是HTTP + SSL/TLS, 也就是在TCP(負責網絡數據傳輸)和HTTP層之間,增加了一層處理加密信息的模塊。我們先看下TLS1.2版本的握手圖
  • 淺談 HTTPS 和 SSL/TLS 協議的背景與基礎
    很多介紹 HTTPS 的文章一上來就給你講實現細節。個人覺得:這是不好的做法。早在2009年開博的時候,發過一篇《學習技術的三部曲:WHAT、HOW、WHY》,其中談到「WHY 型問題」的重要性。一上來就給你講協議細節,你充其量只能知道 WHAT 和 HOW,無法理解 WHY。
  • 使用Certbot免費申請https證書
    一旦部署成功後,當用戶訪問你的網站時,瀏覽器會在顯示的網址前加一把小鎖,表明這個網站是安全的,同時你也會看到網址前的前綴變成了 https ,不再是 http 。6、校驗證書信息查看是否生成成功cd /etc/letsencrypt/live校驗生成結果openssl
  • PHP的OpenSSL加密擴展學習(二):非對稱加密
    �Lj�<�ǺfM�o7�3��������� 8ZR<Vya4����V��Wט����L�QZbv��7?�v`}��?也就是說,看似簡單的一個 HTTPS ,其實瀏覽器和服務端的 openssl 幫我們做了很多事情,遠不止你去 CA 申請一套證書然後在 Nginx 配好那麼簡單。那麼,接下來,我們將要學習的就是生成證書相關的內容了,系好安全帶,車還要繼續飆。