Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Nginx 配置 SSL/TLS 完整指南:OpenSSL 自簽證書生成、虛擬主機配置、安全優化與證書鏈部署

編輯:Linux 教學

HTTPS 已成現代 Web 基線。本文從 OpenSSL 自簽/CA 簽發證書生成 → Nginx 虛擬主機 SSL 配置 → 協議/加密套件安全優化 → HSTS/OCSP Stapling/證書鏈部署 → 自動化續期 全鏈路講解,附生產級配置模板與測試驗證命令,助你快速落地企業級 TLS 終結。

一、證書生成:OpenSSL 實戰

1. 生成 RSA 私鑰 (2048/4096 位)

# 帶密碼保護(生產環境建議)
openssl genrsa -aes256 -out server.key 2048

# 無密碼(自動化部署需配合權限控制 400)
openssl genrsa -out server.key 2048
chmod 400 server.key

建議:2048 位最低,4096 位長期安全;ECDSA (prime256v1/secp384r1) 效能更優、體積更小,現代瀏覽器全支援。

2. 生成證書簽署請求 (CSR)

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. 自簽證書 (測試/內網/開發環境)

# 有效期 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

注意:自簽證書瀏覽器會警告,僅用於受控環境。

4. 合併證書鏈 (CA 簽發時必須)

# 順序:服務端證書 → 中間 CA 證書 → 根 CA 證書 (根證書可選,瀏覽器內建)
cat server.crt intermediate.ca.crt root.ca.crt > server.fullchain.crt

# Nginx 使用 fullchain 作為 ssl_certificate

二、Nginx SSL 虛擬主機配置

基礎模板 (單站點)

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;
    }
}

多站點 SNI 支援

Nginx 1.3+ 原生支援 SNI,只需建立多個 server 區塊,各自指定 server_name 與對應證書路徑即可,無需多 IP。

三、SSL 安全參數模板 /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;

四、HTTP → HTTPS 強制跳轉

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/

六、自動化續期:Let's Encrypt + Certbot

# 安裝
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 終結體系。

Copyright © Windows教程網 All Rights Reserved