SSL/TLS 配置已發生重大變化。這是截至 2026 年的最佳實踐現狀——該啟用什麼、該禁用什麼,以及即將到來的變化。
協議版本
| 協議 | 狀態 | 操作 |
|---|---|---|
| SSL 2.0, 3.0 | 已破解 | 禁用 —— 存在嚴重漏洞(POODLE、DROWN) |
| TLS 1.0 | 已棄用(2021) | 禁用 —— BEAST 漏洞 |
| TLS 1.1 | 已棄用(2021) | 禁用 —— 不支援現代密碼套件 |
| TLS 1.2 | 安全 | 啟用 —— 僅使用 AEAD 密碼套件 |
| TLS 1.3 | 當前標準 | 啟用 —— 最快、最安全 |
Nginx: ssl_protocols TLSv1.2 TLSv1.3;
Apache: SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
密碼套件
TLS 1.3(無需配置)
全部 5 個密碼套件都是安全的。不要試圖自定義——你無法讓它更好。
TLS 1.2(限制為僅 AEAD)
# Nginx
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
規則:
- 僅
ECDHE-*套件 —— 確保前向保密 - 僅
*-GCM-*或*-CHACHA20-*—— 僅 AEAD 密碼 - 無 CBC 密碼 —— 易受 BEAST、Lucky13 攻擊
ssl_prefer_server_ciphers off—— 讓用戶端選擇(現代用戶端會選最佳選項)
證書管理
| 實踐 | 原因 |
|---|---|
| 使用 ECDSA P-256 金鑰 | 比 RSA 2048 更小、更快 |
| 自動續簽 | 2029 年 47 天有效期使手動續簽不可行 |
提供 fullchain.pem | 防止信任鏈錯誤 |
| 監控證書過期 | 在第 60 天設定告警(90 天有效期) |
| 使用證書透明度監控 | 捕獲未授權證書 |
| 續簽時輪換金鑰 | 不要在證書間複用私鑰 |
安全頭
# HSTS — always use HTTPS (start with short max-age, increase later)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
# Prevent MIME-type sniffing
add_header X-Content-Type-Options "nosniff" always;
# Prevent clickjacking
add_header X-Frame-Options "SAMEORIGIN" always;
# Upgrade insecure sub-resources
add_header Content-Security-Policy "upgrade-insecure-requests" always;
效能最佳化
| 設定 | 配置 | 收益 |
|---|---|---|
| HTTP/2 | listen 443 ssl http2; | 多路複用、頭部壓縮 |
| 會話快取 | ssl_session_cache shared:SSL:10m; | 避免回訪者重新握手 |
| 關閉會話票證 | ssl_session_tickets off; | 更好的前向保密 |
| OCSP Stapling | ssl_stapling on; | 更快的證書驗證、更好的隱私 |
| 早期資料(0-RTT) | TLS 1.3 預設 | 零延遲恢復(謹慎使用) |
完整 Nginx 配置(生產就緒)
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
root /var/www/html;
}
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
測試: 在 SSL Labs 輸入你的域名——此配置應得到 A+ 評分。
不要做什麼
| 錯誤實踐 | 原因 | 正確做法 |
|---|---|---|
ssl_protocols TLSv1 TLSv1.1; | 已棄用、有漏洞 | 僅 TLS 1.2 + 1.3 |
ssl_ciphers ALL; | 包含弱密碼 | 明確的 ECDHE + AEAD 列表 |
ssl_prefer_server_ciphers on;(TLS 1.3) | 不必要——TLS 1.3 密碼都安全 | off |
使用 cert.pem 而非 fullchain.pem | 缺少鏈 → 信任錯誤 | Nginx 始終用 fullchain.pem |
| 生產環境用自簽名證書 | 瀏覽器警告、無信任 | Let’s Encrypt(免費) |
| 多年使用同一私鑰 | 限制損害控制 | 每次續簽輪換 |
| 不用 HSTS | 易受降級攻擊 | 測試後啟用 |
HSTS 的 max-age=0 | 實際上禁用了 HSTS | 從 300 開始,增加到 63072000 |
常見問題
如何測試我的 SSL 配置?
SSL Labs Server Test —— 輸入域名,獲得 A-F 評級的詳細報告。檢查協議支援、密碼強度、鏈有效性和已知漏洞。
應該追求什麼評級?
生產站點追求 A+。要求:僅 TLS 1.2+、AEAD 密碼、有效鏈、長 max-age 的 HSTS。上述配置可達到 A+。
應該多久審查一次 SSL 配置?
每年一次,或在新漏洞公佈時。訂閱 Let’s Encrypt 狀態頁並關注 Mozilla SSL Configuration Generator 獲取更新建議。
有工具能為我生成正確配置嗎?
有 —— Mozilla SSL Configuration Generator。選擇你的伺服器(Nginx、Apache 等)和版本,它會生成推薦配置。“Modern”配置檔案與本文的實踐相匹配。