SSL Labs 憑證安全評估與優化

SSL Labs Certificate Security Assessment and Optimization

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 的評分基於以下四個面向:

  1. 憑證(Certificate):30%

    • 憑證是否有效且未過期
    • 憑證鏈是否完整
    • 金鑰長度是否足夠
  2. 協定支援(Protocol Support):30%

    • 支援的 TLS 版本
    • 是否停用不安全的協定
  3. 金鑰交換(Key Exchange):30%

    • 金鑰交換演算法的強度
    • Forward Secrecy 支援
  4. 加密強度(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 運作原理

  1. 伺服器在回應中發送 HSTS 標頭
  2. 瀏覽器記錄此設定
  3. 在有效期內,瀏覽器自動將 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 清單,需要:

  1. 設定 includeSubDomainspreload 指令
  2. https://hstspreload.org/ 提交申請
  3. 確保所有子網域都支援 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 測試

  1. 前往 https://www.ssllabs.com/ssltest/
  2. 輸入您的網域名稱
  3. 等待測試完成(通常需要 1-2 分鐘)
  4. 檢視詳細報告並根據建議進行優化

使用命令列工具測試

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 "=== 檢查完成 ==="

參考資料

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy