深入理解SSL協定:從理論到實踐

2024.03.28

前言

這是一篇關於SSL協議的技術文章,有理論知識,但又兼具一定的實戰性,文章的主要內容分享了SSL協議的核心概念、工作原理、常見的應用場景,以及就https這種實際應用場景,又著重分享具體的工作原理以及如何實現https訪問網站。無論你是資訊安全科技的初學者,或是專業人士,相信這篇文章都能為你帶來一些幫助或啟示。如果有失誤之處,煩請在留言區指出,以便共同成長和進步。

什麼是SSL

SSL(Secure Sockets Layer)是一種用於在網路上保護資訊安全的標準安全技術。它透過對網路連接進行加密來確保資料在客戶端和伺服器之間的安全傳輸。 SSL協定使用了非對稱加密和對稱加密技術,可防止資料在傳輸過程中被竊取或篡改。 SSL主要用於保護網站上的敏感資訊,如個人資訊、信用卡資訊等。在現代網路通訊中,SSL已經被其後繼標準TLS(Transport Layer Security)所取代,但是通常情況下人們仍然稱之為SSL。

SSL的工作原理

上述的概念描述中提到了兩個關鍵:第一個:SSL是一種保護資訊安全的技術標準;第二個:SSL使用了對稱加密技術和非對稱加密的技術;具體來講SSL的工作原理涉及下面三個關鍵步驟:

  1. 握手階段:客戶端發起與伺服器的連線請求,伺服器會傳回其SSL憑證。客戶端驗證憑證的有效性,並產生一個預主金鑰,再用伺服器的公鑰加密後傳送給伺服器。
  2. 金鑰協商階段:伺服器接收到客戶端傳送的預主金鑰後,使用自己的私鑰解密得到預主金鑰,然後雙方基於預主金鑰產生會話金鑰(對稱金鑰),用於加密通信數據。
  3. 資料傳輸階段:客戶端和伺服器使用會話金鑰進行加密和解密通訊數據,確保資料在傳輸過程中的機密性和完整性。

透過上述步驟,SSL協定實現了對資料的加密傳輸,防止了中間人攻擊和竊聽等安全威脅,從而保障了網路通訊的安全性。

關於SSL運作原理的幾個疑問

客戶端是如何驗證伺服器傳回的SSL憑證的有效性的?

通常客戶端具體是指瀏覽器,客戶端瀏覽器從從以下幾個方面來驗證伺服器傳回的SSL憑證的有效性:

  1. 憑證鏈驗證

用戶端首先會檢查伺服器傳回的SSL憑證是否由受信任的憑證授權單位(CA)簽發,即驗證憑證的核發者是否在客戶端的信任清單中。這個過程稱為憑證鏈驗證,確保伺服器憑證的可信任性。

  1. 證書有效期限檢查

用戶端會驗證憑證的有效期,確保憑證尚未過期。如果憑證已經過期,用戶端將不予信任。

  1. 主機名稱匹配

用戶端會檢查憑證中的主機名稱與用戶端正在連線的伺服器主機名稱是否相符。這一步可以防止針對惡意偽造憑證的中間人攻擊。

  1. 憑證吊銷檢查

客戶端也會檢查憑證授權單位是否已經撤銷了伺服器憑證。這可以透過查詢憑證授權單位的憑證撤銷清單(CRL)或線上憑證狀態協定(OCSP)來進行檢查。

  1. 可選的附加驗證

某些情況下,用戶端也可能進行其他附加的驗證,例如檢查憑證中的擴充欄位等。

透過以上多個方面的驗證,客戶端就可以確保伺服器回傳的SSL憑證的有效性和可信任性,從而建立起安全的通訊連線。如果證書驗證失敗,用戶端將會發出警告或拒絕連接,以保護資料通訊的安全性。

預主密鑰是什麼?會話密鑰是什麼?

預主金鑰(Pre-Master Secret):

預主金鑰是在SSL 握手的初始階段由客戶端產生的隨機值,用於協商後續通訊中使用的對稱加密演算法的金鑰。客戶端在握手開始時產生預主金鑰,並將其傳送給伺服器。預主金鑰不會直接用於加密數據,而是透過協商產生最終的會話金鑰。

會話密鑰(Session Key):

會話金鑰是在SSL 握手過程中雙方根據預主金鑰和其他資訊協商產生的對稱金鑰,用於加密和解密通訊資料。會話金鑰只在目前會話期間有效,通常保存在客戶端和伺服器端,用於加密資料傳輸。一旦會話結束,會話金鑰通常會被丟棄,以確保下次通訊時使用新的會話金鑰。

總體來說,預主金鑰用於安全地協商產生會話金鑰,而會話金鑰則用於實際的資料加密和解密過程。透過這種方式,SSL 協定確保了通訊雙方之間的資料傳輸是加密的、安全的。

非對稱加密技術和對稱加密技術的特點

非對稱加密技術有以下幾個主要特點:

  • 公鑰和私鑰

非對稱加密使用一對金鑰,即公鑰和私鑰。公鑰用於加密數據,私鑰用於解密資料。公鑰可以公開給他人使用,私鑰則保密。

  • 加密與解密

公鑰加密的資料只能用對應的私鑰解密,私鑰加密的資料只能用對應的公鑰解密。這種特性確保了資料在傳輸過程中的安全性。

  • 數位簽名

非對稱加密也可用於產生和驗證數位簽章。發送者可以使用自己的私鑰對訊息進行簽名,接收者可以使用發送者的公鑰驗證簽名,從而確保訊息的完整性和真實性。

  • 安全性

非對稱加密演算法的安全性是基於數學難題,如大數分解問題或橢圓曲線離散對數問題等。合適的金鑰長度可以提高加密演算法的安全性。

  • 密鑰交換

非對稱加密也用於安全地交換對稱加密演算法所需的金鑰,如在TLS握手過程中使用非對稱加密來交換對稱金鑰。

  • 效率

相較對稱加密演算法,非對稱加密演算法通常計算量較大,因此在傳輸大量資料時效率可能較低。因此,通常會結合對稱加密和非對稱加密來達到安全和效率的平衡。

對稱加密技術有以下幾個特點:

  • 高效率

對稱加密演算法通常比非對稱加密演算法更快速,因為在加密和解密過程中使用的是相同的金鑰,不需要複雜的數學運算。

  • 簡單性

相對於非對稱加密演算法,對稱加密演算法的實作更為簡單,計算量小,適合對大量資料進行加密。

  • 密鑰管理:

對稱加密演算法需要確保金鑰的安全傳輸和存儲,否則金鑰可能被竊取導致資料外洩。這對密鑰管理提出了挑戰。

  • 適用性

對稱加密演算法適用於大部分資料加密場景,如資料傳輸、檔案加密等。然而,在金鑰協商和分發方面存在一些限制,尤其在對資料進行安全傳輸時可能需要結合其他技術來解決金鑰交換的問題。

  • 對稱性

對稱加密演算法中加密和解密所使用的金鑰是相同的,這種對稱性也是其命名的來源。因此,雙方在通訊前需要協商並共享同一個金鑰。

整體來說,對稱加密技術在速度和效率上具有優勢,而非對稱加密技術在金鑰管理和金鑰交換方面更具有優勢,所以在許多場景下,是兩種技術結合在一起使用,以達到取長補短的效果。

Md5屬於非對稱加密技術實現的一種嗎

答案是否。 MD5和非對稱加密是兩種不同的加密技術,它們之間是有一些聯繫,但也有區別:

  • 作用和用途

MD5(Message Digest Algorithm 5)是一種雜湊演算法,主要用於產生資料的摘要(digest),以確保資料的完整性和驗證資料的一致性。

非對稱加密演算法(如RSA、ECC等)則是一種加密演算法,使用一對金鑰(公鑰和私鑰)來實現加密和解密,同時也可以用於數位簽章和金鑰交換等功能。

  • 單向性

MD5是單向雜湊演算法,也就是可以將資料產生摘要,但無法從摘要還原出原始資料。

非對稱加密演算法是雙向的,可以使用公鑰加密數據,私鑰解密數據,或使用私鑰簽署數據,公鑰驗證簽署。

  • 安全性

MD5演算法存在一些安全性缺陷,例如易受碰撞攻擊等,不適合用於安全性要求較高的場景。

非對稱加密演算法基於數學難題,相對更安全可靠,常用於加密通訊、數位簽章等場景。

  • 聯合使用

在實際應用中,MD5摘要通常會與非對稱加密演算法結合使用。例如,在數位簽名中,可以使用非對稱加密演算法產生數位簽名,然後再使用MD5對簽名進行摘要,以確保簽名的完整性和真實性。

SSL的應用場景

SSL協定的常見應用場景還挺多的,例如下面這些。當然,除了下面這些,還有其他很多場景,這裡就不過多贅述了。

  • 網站加密通訊:透過HTTPS協定來保護網站上的資料傳輸,確保使用者和網站之間的通訊安全。
  • 電子郵件加密:例如使用SMTPS、IMAPS和POP3S等協定來保護電子郵件的傳輸過程,確保郵件內容的機密性。
  • 虛擬私人網路(VPN):透過SSL VPN技術建立安全的遠端存取連接,使遠端使用者可以安全地存取公司內部網路資源。
  • 遠端管理和存取:例如透過SSH(Secure Shell)來進行遠端伺服器管理,以及透過HTTPS存取遠端管理介面等。
  • 安全聊天與即時通訊:許多即時通訊應用程式使用SSL/TLS來加密使用者之間的通訊內容,確保聊天內容的機密性。

實現https訪問的一般步驟

在SSL協定的應用場景中,有一項是使用https協定來實現網站的加密通訊。可能有的朋友會有疑問,https與ssl都是協議,有什麼差別或連結嗎?可以這麼理解:HTTPS其實就是HTTP協定的安全版本,它在HTTP的基礎上加入了SSL/TLS協定的加密機制,透過在傳輸層加密資料來保護通訊的安全。

目前大多數網站都使用了HTTPS,想要在網站上實現HTTPS,通常需要以下步驟:

  1. 取得SSL憑證

一般取得SSL 憑證的途徑也就那麼幾個,以下是一些常見的途徑:

  • 商業憑證授權單位(CA):你可以選擇購買商業CA(如Comodo、DigiCert、GlobalSign、Symantec 等)所頒發的SSL 憑證。這些證書通常提供更多的功能和保障,適用於各種企業級需求。
  • 託管服務供應商:如果你使用雲端託管服務(國外如AWS、Azure、Google Cloud 等,國內,如阿里雲、騰訊雲等),這些平台通常提供整合的SSL 憑證管理服務,可以方便地取得和配置SSL 憑證。
  • Let's Encrypt:Let's Encrypt 是一個免費的證書頒發機構,透過他們的服務可以獲得免費的SSL 證書,支援自動化簽發和更新。
  • 第三方憑證市場:有一些第三方的憑證市場(如SSLs.com、Namecheap 等)也提供各種類型的SSL 憑證選擇,你可以在這些市場上購買並取得憑證。
  • 自簽名憑證:如果你只是在內部環境或測試目的下使用SSL 加密,你也可以產生自簽名憑證來使用。不過要注意的是,自簽名憑證在公共網路中可能會受到不信任。
  1. 安裝SSL憑證

一旦獲得SSL證書,就需要將其安裝到Web伺服器上。這通常涉及將憑證檔案和金鑰檔案配置到伺服器軟體(如Apache、Nginx等)的相應位置。這個在後面會以nginx為例,安裝一個自簽署的憑證。

  1. 設定伺服器

需修改Web伺服器的配置,啟用SSL/TLS協議,並配置加密套件、協定版本等安全參數。

  1. 更新網站連結

將網站上的所有連結改為使用https:// 開頭,確保網站上所有資源都透過加密連線進行存取。

  1. 強制重定向

為了確保所有存取都通過HTTPS,通常要對HTTP存取進行強制重定向到HTTPS。

  1. 測試和驗證

最後,需要進行測試和驗證,確保HTTPS的配置生效,並且網站在瀏覽器中顯示安全的鎖定標誌。

至此,就可以以相對安全地存取目標網站了。

HTTPS的工作原理

對於如何實現普通網站的HTTPS的步驟,相信你已經了然。但是整個過程是如何運作的,你了解嗎?且往下看。 HTTPS(Hypertext Transfer Protocol Secure)的工作原理主要基於SSL/TLS協議,其關鍵步驟包括:

  1. 握手階段

用戶端發起與伺服器的連線請求,伺服器會傳回其SSL證書,證書包含公鑰等資訊。客戶端驗證憑證的有效性,並產生一個隨機的對稱金鑰,用伺服器的公鑰加密後傳送給伺服器。

  1. 密鑰協商階段

伺服器接收到客戶端發送的加密後的對稱金鑰後,使用自己的私鑰解密得到對稱金鑰,然後雙方基於該對稱金鑰產生會話金鑰,用於加密通訊資料。

  1. 資料傳輸階段

用戶端和伺服器之間使用會話金鑰進行對稱加密和解密通訊數據,確保資料在傳輸過程中的機密性和完整性。

透過上述步驟,HTTPS實現了對資料的加密傳輸,從而確保了資料在傳輸過程中的安全性。此外,HTTPS還使用數位憑證來驗證伺服器的身份,防止中間人攻擊,確保客戶端和伺服器之間通訊的安全性和可靠性。

在Nginx中配置SSL證書,實現https訪問網站

在Nginx中設定SSL證書,即可實現客戶端的HTTPS 訪問,設定過程並不複雜,但前提是得有證書。

1、取得SSL憑證:

在上面已經提到,可以從信任的憑證授權單位(CA),或是使用Let's Encrypt 等免費憑證服務,來取得SSL 憑證。要注意的是自簽署的證書,最好只用在內網中,在網路中自簽名的證書可能不被信任。

2、設定SSL憑證

在Nginx 的設定中,指定SSL 憑證的位置、私鑰以及其他相關設定。下面nginx.conf中的一段關鍵配置範例:

server {
        listen       443 ssl;
        server_name  192.168.35.106;
        root         /usr/share/nginx/html;
        ssl_certificate /etc/nginx/ssl/cert.crt;
        ssl_certificate_key /etc/nginx/ssl/key.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
        ssl_prefer_server_ciphers on;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;


        error_page 404 /404.html;
        location = /404.html {
        }


        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
   server {
        listen 80;
      server_name 192.168.35.106;
    return 301 https://$host$request_uri;
   }
上面的配置示例内容中,需要重点关注几个地方:
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.


  • ssl_certificate:指定SSL 憑證檔案的路徑,這裡是/etc/nginx/ssl/cert.crt,該憑證檔案包含了公鑰、憑證鍊和其他必要資訊。
  • ssl_certificate_key :指定SSL 憑證的私鑰檔案路徑,這裡是/etc/nginx/ssl/key.pem,該私鑰用於解密用戶端發送的加密資料。
  • ssl_protocols TLSv1.2 TLSv1.3;:指定Nginx 支援的SSL/TLS 協定版本,這裡配置了支援TLS 1.2 和TLS 1.3 版本。
  • ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';:設定加密套件的優先順序,這裡指定了兩個加密套件,分別為ECDHE-ECDSA-AES256-GCM-SHA384和ECDHE-RSA-AES256-GCM-SHA384。
  • ssl_prefer_server_ciphers on;:啟用伺服器端的加密套件優先設置,表示伺服器會優先選擇自己支援的加密套件與客戶端協商加密方式。
  • listen 443 ssl;:當使用HTTPS 協定時,通常會使用443 連接埠來提供加密的網站訪問,因此需要確保443可以透過防火牆,並且啟用SSL 加密。
  • 第二個server中listen 80;:這個設定的作用是將所有透過HTTP(連接埠80)存取伺服器的請求重新導向到HTTPS(連接埠443)上,以確保網站存取是透過加密的安全連線進行;
  • return 301 https://$host$request_uri;:這是重定向指令,當收到HTTP 請求時,會傳回一個HTTP 301 永久重定向回應,將請求重定向到相同的請求URL,但使用HTTPS 協定。其中$host 表示原始請求的主機名,$request_uri 表示原始請求的URI。

3、重啟Nginx

完成SSL 設定後,需要重新載入或重新啟動Nginx 以使變更生效。可以使用指令nginx -s reload 或systemctl restart nginx來重新載入設定。

nginx -s reload
 systemctl restart nginx
  • 1.
  • 2.

4、驗證

使用瀏覽器訪問你的網站,由原來http訪問,改成https訪問,如果可以透過HTTPS 訪問並且瀏覽器地址欄中顯示安全連接的標識,那就說明配置已經成功。

寫在最後

非常感謝你能耐心看完我的這篇文章,希望我的分享對你有幫助。當然,如果你覺得這篇文章對你有幫助,不妨點擊按讚按鈕,讓更多的人看到這篇優質的技術分享。同時,別忘了將這篇文章收藏起來,也方便日後再查閱。