HTTPS 已成現代 Web 基線。本文從 OpenSSL 自簽/CA 簽發證書生成 → Nginx 虛擬主機 SSL 配置 → 協議/加密套件安全優化 → HSTS/OCSP Stapling/證書鏈部署 → 自動化續期 全鏈路講解,附生產級配置模板與測試驗證命令,助你快速落地企業級 TLS 終結。
# 帶密碼保護(生產環境建議)
openssl genrsa -aes256 -out server.key 2048
# 無密碼(自動化部署需配合權限控制 400)
openssl genrsa -out server.key 2048
chmod 400 server.key
建議:2048 位最低,4096 位長期安全;ECDSA (prime256v1/secp384r1) 效能更優、體積更小,現代瀏覽器全支援。
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/OU=IT/CN=www.example.com"
-subj 非交互式指定主體資訊,CN 必須匹配域名(支援通配符 *.example.com)。server.csr 給 CA (Let's Encrypt、DigiCert、GlobalSign 等) 簽發。# 有效期 3 年 (1095 天)
openssl req -new -x509 -key server.key -out server.crt -days 1095 -subj "/CN=dev.example.com"
# 或從 CSR 自簽
openssl x509 -req -in server.csr -signkey server.key -out server.crt -days 1095
注意:自簽證書瀏覽器會警告,僅用於受控環境。
# 順序:服務端證書 → 中間 CA 證書 → 根 CA 證書 (根證書可選,瀏覽器內建)
cat server.crt intermediate.ca.crt root.ca.crt > server.fullchain.crt
# Nginx 使用 fullchain 作為 ssl_certificate
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.example.com example.com;
# 證書與私鑰
ssl_certificate /etc/nginx/ssl/server.fullchain.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# 安全參數 (見下節)
include /etc/nginx/conf.d/ssl-params.conf;
# 業務配置
root /var/www/example.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
Nginx 1.3+ 原生支援 SNI,只需建立多個 server 區塊,各自指定 server_name 與對應證書路徑即可,無需多 IP。
/etc/nginx/conf.d/ssl-params.conf# 協議版本:僅啟用 TLS 1.2/1.3
ssl_protocols TLSv1.2 TLSv1.3;
# 加密套件:現代相容性配置 (Mozilla Intermediate/Modern)
# 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 on;
# 會話復用:提升握手效能
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off; # 禁用票據,啟用前向保密
# OCSP Stapling:減少客戶端驗證延遲
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;
# HSTS:強制 HTTPS (謹慎啟用,確保全站可用)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 安全標頭
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "strict-origin-when-cross-origin";
# DH 參數 (TLS 1.2 DHE 套件需要)
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
server {
listen 80;
listen [::]:80;
server_name www.example.com example.com;
# ACME 挑戰路徑放行 (Let's Encrypt 續期)
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt;
}
# 其餘全部 301 跳轉 HTTPS
location / {
return 301 https://$host$request_uri;
}
}
| 檢查項目 | 命令/工具 |
|---|---|
| 配置語法 | nginx -t |
| 證書詳情 | openssl x509 -in server.crt -text -noout |
| TLS 握手模擬 | openssl s_client -connect www.example.com:443 -servername www.example.com -tls1_2 |
| 完整鏈驗證 | openssl verify -CAfile root.ca.crt -untrusted intermediate.ca.crt server.crt |
| SSL Labs 評分 | https://www.ssllabs.com/ssltest/ (目標 A+) |
| 掃描弱套件 | nmap --script ssl-enum-ciphers -p 443 www.example.com |
| HSTS 預載清單 | https://hstspreload.org/ |
# 安裝
apt-get update && apt-get install certbot python3-certbot-nginx
# 申請/續期 (自動修改 Nginx 配置)
certbot --nginx -d www.example.com -d example.com
# 僅獲取證書 (手動配置 Nginx)
certbot certonly --webroot -w /var/www/letsencrypt -d www.example.com -d example.com
# 定時續期 (systemd timer 已內建)
systemctl status certbot.timer
| 坑點 | 現象 | 解決 |
|---|---|---|
| 證書鏈不完整 | SSL Labs 提示 Chain issues、移動端信任失敗 | 使用 fullchain.crt (server + intermediate),根證書勿包含 |
| ssl_dhparam 缺失 | DHE 套件無法使用、評分降級 | openssl dhparam -out dhparam.pem 2048 (耗時數分鐘) |
| HSTS 過早啟用 | 子域名/測試環境無法訪問 HTTP | 先驗證全站 HTTPS 可用,再啟用;預載需提交 hstspreload.org |
| OCSP Stapling 不生效 | 錯誤 "OCSP response not sent" | 確保 resolver 可達、證書含 OCSP URI、ssl_stapling_verify on |
| TLS 1.3 不生效 | OpenSSL < 1.1.1 或 Nginx 編譯無 TLS 1.3 支援 | 升級 OpenSSL ≥ 1.1.1、重編 Nginx 或使用官方主線版 |
將 SSL 配置模組化 (include ssl-params.conf)、證書路徑標準化 (/etc/nginx/ssl/)、自動化續期納入 CI/CD,即可實現「配置一次、長期合規、零人工介入」的企業級 TLS 終結體系。