概述
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握手操作,使得握手時間變短、網站效能得以提升、改善了使用者體驗,另外支援的密碼套件更安全和簡單。
密碼套件
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"。
為什麼選擇GCM
AES (Advanced Encryption Standard) 對稱加密,它是高階加密標準。早期的加密標準DES(Data Encryption Standard) 已被棄用。
AES選擇合適的加密模式很重要,應用比較多的兩種模式 CBC 和 GCM。
CBC 密碼分組連結模式
明文分塊,第一個塊使用初始化向量,後面的每個明文塊在加密前與前一個密文塊進行異或運算。
這種模式存在的問題:
- 如果一個明文塊的出現錯誤將影響後面的所有塊。
- 不能並行處理,限制了吞吐量。
- 缺乏內建身份驗證,會受到一些攻擊,如:選擇明文攻擊 (CPA),選擇密文攻擊 (CCA) 等。
CTR 計數模式
明文分塊按順序編號,通過加密"計數器"的連續值來生成下一個金鑰流塊。CTR 模式非常適合在多核處理器上執行,明文塊可以並行加密。
GCM 伽羅瓦/計數器模式
GCM = CTR + Authentication。其加密過程,明文塊是按順序編號的,然後這個塊號與初始向量 組合並使用塊密碼E加密,然後將此加密的結果與明文進行異或以生成密文。
簡單來說,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/