我們應該使用 TLS1.3 嗎

程式設計碼農發表於2022-05-20

概述

SSL(Socket Layer Security)和 TLS(Transport Layer Security) 都是屬於安全協議,主要作用是保證客戶端和服務端之間能安全通訊。SSL是較早的協議,TLS 是 SSL的替代者。

SSL 版本 1.0、2.0 和 3.0,TLS 版本 1.0、1.2 和 1.3。SSL協議和TLS1.0 由於已過時被禁用,目前TLS 1.3 是網際網路上部署最多的安全協議,它是TLS最新版本 ,它增強了過時的安全性,並增加了更多的觸控性。通過下面幾點可以有個簡單認識:

  • 最新 TLS1.3 的優點
  • 什麼向前保密
  • 為什麼選擇 GCM 加密

TLS 1.3

現代瀏覽器支援 TLS 1.2 和 TLS 1.3 協議,但 1.3 版本要好得多。 TLS 1.3 對早期版本進行了多項改進,最明顯的是簡化了TLS握手操作,使得握手時間變短、網站效能得以提升、改善了使用者體驗,另外支援的密碼套件更安全和簡單。

img

密碼套件

TLS/SSL 使用一種或多種密碼套件。 密碼套件是身份驗證、加密和訊息身份驗證的演算法組合。TLS 1.2 版使用的演算法存在一些弱點和安全漏洞。在 TLS 1.3 中刪除了這些演算法:

  • SHA-1
  • RC4
  • DES
  • 3DES
  • AES-CBC
  • MD5

另外一個很重要的更新是TLS1.3 支援 perfect-forward-secrecy (PFS)演算法。

向前保密

向前保密(PFS)是特定金鑰協商協議的一項功能,如果一個長週期的會話金鑰被洩露,黑客就會截獲大量資料,我們可以為每個會話生成唯一的會話金鑰,單個會話金鑰的洩露不會影響該會話之外的任何資料。

TLS在早期版本的握手期間可以使用兩種機制之一交換金鑰:靜態 RSA金鑰和 Diffie-Hellman 金鑰。 在 TLS1.3 中,RSA 以及所有靜態(非 PFS)金鑰交換已被刪除,只保留了DHE、ECDHE

  • 臨時 Diffie-Hellman (DHE)
  • 臨時橢圓曲線 Diffie-Hellman (ECDHE)

可以檢視網站的安全詳情來確認它是否使用"ECDHE"或"DHE"。

image-20220516142354607

為什麼選擇GCM

AES (Advanced Encryption Standard) 對稱加密,它是高階加密標準。早期的加密標準DES(Data Encryption Standard) 已被棄用。

AES選擇合適的加密模式很重要,應用比較多的兩種模式 CBC 和 GCM。

CBC 密碼分組連結模式

明文分塊,第一個塊使用初始化向量,後面的每個明文塊在加密前與前一個密文塊進行異或運算。

密碼塊連結 (CBC) 模式加密

這種模式存在的問題:

  • 如果一個明文塊的出現錯誤將影響後面的所有塊。
  • 不能並行處理,限制了吞吐量。
  • 缺乏內建身份驗證,會受到一些攻擊,如:選擇明文攻擊 (CPA),選擇密文攻擊 (CCA) 等。

CTR 計數模式

明文分塊按順序編號,通過加密"計數器"的連續值來生成下一個金鑰流塊。CTR 模式非常適合在多核處理器上執行,明文塊可以並行加密。

CTR

GCM 伽羅瓦/計數器模式

GCM = CTR + Authentication。其加密過程,明文塊是按順序編號的,然後這個塊號與初始向量 組合並使用塊密碼E加密,然後將此加密的結果與明文進行異或以生成密文。

GCM加密操作

簡單來說,GCM 是 CTR 身份驗證的組合,它更快、更安全。它將接受流水線和並行化實現,並具有最小的計算延遲,所以它的應用更加廣泛。

Nginx配置

支援TLS1.2

客戶端最低版本

  • Supports Firefox 27+
  • Android 4.4.2+
  • Chrome 31+
  • Edge, IE 11 on Windows 7 or above
  • Java 8u31
  • OpenSSL 1.0.1
  • Opera 20+
  • Safari 9+
server {
    listen 443 ssl http2;
    server_name www.xxx.com xxx.biz
 
    # Path to certs
    ssl_certificate /etc/nginx/ssl/xxx.com.csr;
    ssl_certificate_key /etc/nginx/ssl/xxx.com.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MySSL:10m;
    ssl_session_tickets off;
    ssl_dhparam /etc/nginx/ssl/xxx.com.dhparam.pem;
 
    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
 
    # 嚴格傳輸安全是一種策略機制,保護網站免受協議降級攻擊和cookie 劫持等中間人攻擊。
    add_header Strict-Transport-Security "max-age=63072000" always;
 
    # 是檢查X.509 數字證照吊銷狀態的標準
    ssl_stapling on;
    ssl_stapling_verify on;
 
    # 使用根 CA 和中間證照驗證 OCSP 響應的信任鏈
    ssl_trusted_certificate /etc/nginx/ssl/fullchain.pem;
 
    # DNS
    resolver 8.8.8.8 valid=10s;;
}

支援TLS1.3

客戶端最低版本

  • Firefox 63+
  • Android 10.0+
  • Chrome 70+
  • Edge 75
  • Java 11
  • OpenSSL1.1.1
  • Opera 57
  • Safari 12.1
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server www.xxx.com;
 
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SharedNixCraftSSL:10m; 
    ssl_session_tickets off;
 
    # TLS 1.3 only
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;
 
   # 嚴格傳輸安全是一種策略機制,保護網站免受協議降級攻擊和cookie 劫持等中間人攻擊。
    add_header Strict-Transport-Security "max-age=63072000" always;
 
    # 是檢查X.509 數字證照吊銷狀態的標準
    ssl_stapling on;
    ssl_stapling_verify on;
 
    # 使用根 CA 和中間證照驗證 OCSP 響應的信任鏈
    ssl_trusted_certificate /etc/nginx/ssl/fullchain.pem;
 
    # DNS
    resolver 8.8.8.8 valid=10s;;
}

一般建議同時相容1.2和1.3

    ssl_protocols TLSv1.2 TLSv1.3;

測試

測試是否支援 TLS 1.2

curl -I -v --tlsv1.2 --tls-max 1.2 https://www.xxx.com/

測試是否支援 TLS 1.3

curl -I -v --tlsv1.3 --tls-max 1.3 https://www.xxx.com/

相關文章