完整的 SSL 證書分為四個部分:
- CA 根證書 (root CA)
- 中級證書 (Intermediate Certificate)
- 域名證書
- 證書密鑰 (僅由您持有)
以 COMODO PositiveSSL 證書為例,您將收到四份文件:
- 根證書 –
AddTrustExternalCARoot.crt
- 中級證書 –
COMODORSAAddTrustCA.crt
- 中級證書 –
COMODORSADomainValidationSecureServerCA.crt
- 您的域名證書 –
example_com.crt
您要依照 域名證書 -> 中間證書 -> 根證書 的順序串聯為證書鏈,才能被絕大多數瀏覽器信任。使用 cat
命令串聯證書:
cat example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > example_com.bundle.crt
得到 example_com.bundle.crt
后,和密鑰文件 example_com.key
一同上傳至服務器並保存在安全的位置,例如/etc/ssl/private
目錄下(沒有此目錄請創建)。
修改 NGINX 站點配置
下面是一份針對較新版本的 NGINX 的 SSL 部分配置,請將其添加到站點配置文件中 server
的部分,並根據注釋和您的需求修改。
listen 443 ssl; # 偵聽端口 # listen [::]:443 ssl ipv6only=on; # 如果您希望同時偵聽 IPv6,請取消此行注釋 server_name example.com; # 請改為您的域名 ssl_certificate /etc/ssl/private/example_com.bundle.crt; # 證書鏈 ssl_certificate_key /etc/ssl/private/example_com.key; # 密鑰 ssl_protocols TLSv1.2 TLSv1.1 TLSv1; # 支持的協議,Windows XP 不支持 ssl_prefer_server_ciphers on; # 啟用 Forward Secrecy ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; keepalive_timeout 70; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
如果您希望至少支持一些老式瀏覽器,並且在能夠使用 ECDHE 時盡可能使用此算法,您可以使用下面的配置:
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4";
或者使用最簡單的方案:
ssl_ciphers "EECDH+aRSA+AES";
生成 DHE 參數
為了避免使用 OpenSSL 默認的 1024bit DHE 參數,我們需要生成一份更強的參數文件:
cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 4096
建議您使用性能強勁的平台生成此文件,例如最新版的至強物理機。如果您只有一台小型 VPS,請使用 openssl dhparam -out dhparam.pem 2048
命令生成 2048bit 的參數文件。
完成后,在 SSL 配置下添加一行:
ssl_dhparam /etc/ssl/certs/dhparam.pem;
啟用 HSTS
HTTP Strict Transport Security (HSTS) 可以使瀏覽器第一次訪問您的站點后即記住僅通過 HTTPS 與您的站點通信,可以大大提升安全性。
在 SSL 配置下添加:
add_header Strict-Transport-Security max-age=63072000; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff;
強制定向到 HTTPS
您需要一個單獨 server
配置用於偵聽 HTTP 80 端口,然后所有發送到這里的請求定向到 HTTPS 協議。
server { listen 80; # listen [::]:80 ipv6only=on; # 如果您需要同時偵聽 IPv6,請取消此行注釋 server_name example.com; # 您的域名 location / { return 301 https://example.com$request_uri; # 要重定向的地址,請將 example.com 改為您的域名 } }
或者使用 rewrite
:
rewrite ^ https://example.com$request_uri? permanent; # 請將 example.com 改為您的域名
一份完整樣例
這里是基於 NGINX 1.4.6 的一份完整配置樣例。請根據您的需求修改使用。
server { listen 80; # listen [::]:80 ipv6only=on; server_name www.example.com; rewrite ^ https://www.example.com$request_uri? permanent; } server { listen 443 ssl; # listen [::]:443 ssl ipv6only=on; server_name www.example.com; ssl on; ssl_certificate /etc/ssl/private/www_example_com.crt; ssl_certificate_key /etc/ssl/private/www_example_com.key; ssl_prefer_server_ciphers on; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; keepalive_timeout 70; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security max-age=63072000; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; root /var/www/example.com; index index.html; location / { try_files $uri $uri/ /index.html; } }