SSL Labs 是由 Qualys 提供的免費線上 SSL/TLS 安全評估工具,被業界廣泛使用來檢測網站的 HTTPS 設定品質。本文將詳細說明 SSL Labs 的評級標準,並提供完整的 Nginx 優化設定,協助您達到 A+ 評級。
SSL Labs 概述
SSL Labs Server Test(https://www.ssllabs.com/ssltest/)是目前最權威的 SSL/TLS 安全評估工具之一。它會全面檢測您的伺服器設定,包括:
- 憑證的有效性與信任鏈
- 支援的協定版本
- 加密套件的安全性
- 金鑰交換機制
- 各種安全功能的啟用狀態
為什麼要使用 SSL Labs
| 優點 | 說明 |
|---|
| 全面性 | 涵蓋所有 SSL/TLS 相關的安全檢測項目 |
| 即時性 | 反映最新的安全標準與漏洞資訊 |
| 權威性 | 被企業和安全專家廣泛採用 |
| 免費使用 | 無需付費即可使用完整功能 |
評級標準說明
SSL Labs 使用 A+ 到 F 的評級系統,評級由多個因素綜合決定:
評級等級說明
| 評級 | 說明 |
|---|
| A+ | 最高評級,需要 A 級加上額外的安全功能(如 HSTS) |
| A | 優秀的設定,無重大安全問題 |
| B | 良好的設定,但存在一些可改進的項目 |
| C | 存在一些安全疑慮,需要改善 |
| D/E/F | 存在嚴重安全問題,強烈建議立即修復 |
| T | 憑證不受信任 |
評分計算方式
SSL Labs 的評分基於以下四個面向:
憑證(Certificate):30%
- 憑證是否有效且未過期
- 憑證鏈是否完整
- 金鑰長度是否足夠
協定支援(Protocol Support):30%
金鑰交換(Key Exchange):30%
- 金鑰交換演算法的強度
- Forward Secrecy 支援
加密強度(Cipher Strength):10%
協定版本優化
現代網站應該只支援 TLS 1.2 和 TLS 1.3,停用所有較舊的協定。
為什麼要停用舊版協定
| 協定 | 狀態 | 原因 |
|---|
| SSL 2.0 | 必須停用 | 嚴重安全漏洞 |
| SSL 3.0 | 必須停用 | POODLE 攻擊 |
| TLS 1.0 | 建議停用 | BEAST 攻擊、PCI DSS 不合規 |
| TLS 1.1 | 建議停用 | 已被主流瀏覽器棄用 |
| TLS 1.2 | 建議啟用 | 目前廣泛支援 |
| TLS 1.3 | 強烈建議 | 最新、最安全的版本 |
Nginx 協定設定
1
2
| # 只啟用 TLS 1.2 和 TLS 1.3
ssl_protocols TLSv1.2 TLSv1.3;
|
加密套件選擇
選擇正確的加密套件對安全性至關重要。應優先使用支援 Forward Secrecy 的加密套件。
推薦的加密套件設定
1
2
3
4
5
6
| # TLS 1.3 加密套件(由 OpenSSL 自動管理)
# TLS 1.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;
|
加密套件說明
| 組件 | 說明 |
|---|
| ECDHE | 橢圓曲線 Diffie-Hellman 金鑰交換 |
| RSA/ECDSA | 身份驗證演算法 |
| AES-GCM | 對稱加密演算法 |
| SHA256/SHA384 | 雜湊演算法 |
| CHACHA20-POLY1305 | 替代的加密方案 |
憑證鏈完整性
憑證鏈不完整是常見的扣分項目。伺服器需要發送完整的憑證鏈,包括中繼憑證。
檢查憑證鏈
1
2
3
4
5
| # 檢查憑證鏈是否完整
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text | grep -A 1 "Issuer:"
# 驗證憑證鏈
openssl verify -CAfile /path/to/ca-bundle.crt /path/to/certificate.crt
|
Nginx 憑證設定
1
2
3
4
5
6
| # 完整憑證鏈(包含伺服器憑證和中繼憑證)
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# 用於 OCSP Stapling 的信任憑證
ssl_trusted_certificate /etc/nginx/ssl/chain.pem;
|
HSTS 設定
HTTP Strict Transport Security(HSTS)強制瀏覽器只使用 HTTPS 連線,是獲得 A+ 評級的必要條件。
HSTS 運作原理
- 伺服器在回應中發送 HSTS 標頭
- 瀏覽器記錄此設定
- 在有效期內,瀏覽器自動將 HTTP 請求轉換為 HTTPS
Nginx HSTS 設定
1
2
3
4
5
6
7
8
| # 基本 HSTS 設定(有效期 1 年)
add_header Strict-Transport-Security "max-age=31536000" always;
# 包含子網域的 HSTS 設定
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 準備加入 HSTS Preload 清單
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
|
HSTS Preload
若要將網站加入瀏覽器的 HSTS Preload 清單,需要:
- 設定
includeSubDomains 和 preload 指令 - 到 https://hstspreload.org/ 提交申請
- 確保所有子網域都支援 HTTPS
OCSP Stapling
OCSP Stapling 可以加速憑證驗證過程,同時保護用戶隱私。
Nginx OCSP Stapling 設定
1
2
3
4
5
6
7
8
9
10
| # 啟用 OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
# 信任的 CA 憑證鏈
ssl_trusted_certificate /etc/nginx/ssl/chain.pem;
# DNS 解析器
resolver 8.8.8.8 8.8.4.4 1.1.1.1 valid=300s;
resolver_timeout 5s;
|
驗證 OCSP Stapling
1
2
| # 檢查 OCSP Stapling 是否啟用
echo | openssl s_client -connect example.com:443 -status -servername example.com 2>/dev/null | grep -A 5 "OCSP Response"
|
Forward Secrecy
Forward Secrecy(前向保密)確保即使伺服器私鑰被洩露,過去的通訊仍然安全。
實現 Forward Secrecy
Forward Secrecy 透過使用臨時金鑰來實現。每次連線都會產生新的金鑰,用於加密該次通訊。
1
2
3
4
5
| # 使用強健的 DH 參數
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
# 設定橢圓曲線
ssl_ecdh_curve X25519:secp384r1;
|
生成 DH 參數
1
2
3
4
5
| # 生成 4096 位元的 DH 參數(建議用於高安全性環境)
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
# 生成 2048 位元的 DH 參數(一般用途)
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
|
常見扣分項目
以下是 SSL Labs 測試中常見的扣分項目及修復方法:
1. 憑證問題
| 問題 | 解決方案 |
|---|
| 憑證過期 | 更新憑證並設定自動續期 |
| 憑證鏈不完整 | 確保發送完整的憑證鏈 |
| 憑證名稱不符 | 確保憑證包含正確的網域名稱 |
| 使用自簽憑證 | 使用受信任 CA 簽發的憑證 |
2. 協定問題
| 問題 | 解決方案 |
|---|
| 支援 SSLv3 | 停用 SSLv3 |
| 支援 TLS 1.0/1.1 | 停用舊版 TLS |
| 不支援 TLS 1.3 | 升級 OpenSSL 並啟用 TLS 1.3 |
3. 加密套件問題
| 問題 | 解決方案 |
|---|
| 使用弱加密套件 | 移除 RC4、DES、3DES 等弱加密 |
| 缺少 Forward Secrecy | 優先使用 ECDHE 加密套件 |
| 使用 CBC 模式 | 優先使用 GCM 模式 |
4. 其他問題
| 問題 | 解決方案 |
|---|
| 沒有 HSTS | 加入 HSTS 標頭 |
| 沒有 OCSP Stapling | 啟用 OCSP Stapling |
| 弱 DH 參數 | 使用 2048 位元以上的 DH 參數 |
完整 Nginx SSL 優化設定
以下是達到 SSL Labs A+ 評級的完整 Nginx 設定:
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
| # /etc/nginx/conf.d/ssl.conf
# SSL/TLS 全域設定
# 協定版本
ssl_protocols TLSv1.2 TLSv1.3;
# 加密套件
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;
# 橢圓曲線
ssl_ecdh_curve X25519:secp384r1;
# DH 參數
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
# SSL 工作階段快取
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 1.1.1.1 valid=300s;
resolver_timeout 5s;
|
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
29
30
31
32
33
| # /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com www.example.com;
# 將所有 HTTP 請求重導向到 HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# 憑證設定
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;
ssl_trusted_certificate /etc/nginx/ssl/example.com/chain.pem;
# 安全標頭
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# 網站根目錄
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
|
驗證與測試
使用 SSL Labs 測試
- 前往 https://www.ssllabs.com/ssltest/
- 輸入您的網域名稱
- 等待測試完成(通常需要 1-2 分鐘)
- 檢視詳細報告並根據建議進行優化
使用命令列工具測試
1
2
3
4
5
6
7
8
9
| # 測試 TLS 版本支援
nmap --script ssl-enum-ciphers -p 443 example.com
# 檢查憑證資訊
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
# 測試特定 TLS 版本
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3
|
自動化測試腳本
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
29
30
31
32
33
34
35
36
37
| #!/bin/bash
# ssl_check.sh - SSL 設定快速檢查腳本
DOMAIN=$1
if [ -z "$DOMAIN" ]; then
echo "Usage: $0 <domain>"
exit 1
fi
echo "=== SSL/TLS 檢查: $DOMAIN ==="
echo ""
echo "[1] 憑證有效期"
echo | openssl s_client -connect ${DOMAIN}:443 -servername ${DOMAIN} 2>/dev/null | openssl x509 -noout -dates
echo ""
echo "[2] TLS 版本支援"
for version in tls1 tls1_1 tls1_2 tls1_3; do
result=$(echo | openssl s_client -connect ${DOMAIN}:443 -servername ${DOMAIN} -${version} 2>&1)
if echo "$result" | grep -q "Protocol.*TLSv"; then
echo " ${version}: 支援"
else
echo " ${version}: 不支援"
fi
done
echo ""
echo "[3] HSTS 標頭"
curl -sI https://${DOMAIN} | grep -i "strict-transport"
echo ""
echo "[4] OCSP Stapling"
echo | openssl s_client -connect ${DOMAIN}:443 -status -servername ${DOMAIN} 2>/dev/null | grep "OCSP Response Status"
echo ""
echo "=== 檢查完成 ==="
|
參考資料