Nginx 的 HTTPS (SSL) 設定在此篇文章已經有寫:Nginx 的 SSL 設定檔範例
但是遇到某些瀏覽器、某些 Android 手機還是出現憑證不安全的訊息,把HTTPS網址資訊送去檢驗,得到的憑證分數是B,所以來把這個憑證分數調成A。
註:調整成A後,目前確實暫時沒有出現不安全的訊息了。
Nginx SSL 憑證加分的設定調整
憑證的檢驗網站:SSL Server Test (Powered by Qualys SSL Labs)
此篇文章並沒有把所有問題都解決掉,而且也不是說分數B就會有問題,例如下述公司分數是B,但是也都跑得好好的。
- Google 的分數也都是B:SSL Server Test: google.com (Powered by Qualys SSL Labs)
Nginx SSL 憑證設定加強部份
設定排除 SSLv2、SSLv3
這個部份之前這篇寫過,在此就不詳述,請參考此篇即可:Apache2 與 Nginx 移除 SSLv2、SSLv3 支援
Chain issues
憑證如果有 Chain issues,在前面 bundle 的步驟,可能漏掉,所以記得把抓下來的憑證整合成一張(Apache 不用整合,而是有 SSLCertificateChainFile 設定。Nginx 只有 CA 和 Key 兩個參數可以設定,所以要記得整合)
- 憑證合併:
- $ cat www.example.com.crt bundle.crt > www.example.com.chained.crt
- 範例:$ sudo cat ssl.feebee.com.tw.crt ssl.feebee.com.tw.ca-bundle > ssl.feebee.com.tw.chained.crt
- 註:crt 和 bundle 會從 SSL 廠商取得(抓到)
- Chain 設定:
- 設定參考:Configuring HTTPS servers
- sslcertificate www.example.com.chained.crt;
- sslcertificate_key www.example.com.key;
- sslcertificate www.example.com.chained.crt;
- 設定參考:Configuring HTTPS servers
Weak Diffie-Hellman and the Logjam Attack
說明可見:
解法:(取其一即可)
- $ sudo openssl dhparam -out dhparams.pem 2048
- $ sudo openssl dhparam -out dhparams.pem 4096
- 產生出 dhparams.pem 跟憑證放在一起即可。
- Nginx 寫憑證的設定檔,加入此行即可:ssl_dhparam /etc/nginx/ssl.crt/dhparams.pem; (此路徑請自行更換成檔案放的位置)
HSTS (HTTP Strict Transport Security)
說明可見:(這步驟非必要,我只有上部份機器)
- HTTP Strict Transport Security
- HTTP強制安全傳輸技術
- 這會強制 Domain 下面的所有內容都走 HTTPS,但是這個請自行評估是否有其它問題。
作法:
Nginx 在設定檔內加入下述:
add_header Strict-Transport-Security max-age=31536000;
Apache2 需要下述步驟:
- sudo a2enmod headers
- 編輯 VirtualHost 的設定檔,加入下述:
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
- 再來重新啟動 Web server 即可。
上述加完後,Nginx 的設定檔會長這樣子:
server { listen 443; server_name example.com.tw root /var/www/; index index.html index.htm; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log crit; #add_header Strict-Transport-Security max-age=31536000; ssl on; ssl_certificate /etc/nginx/ssl.crt/ssl.example.com.chained.crt; ssl_certificate_key /etc/nginx/ssl.crt/ssl.example.com-nopass.key; ssl_session_timeout 5m; ssl_session_cache shared:SSL:5m; #ssl_protocols SSLv2 SSLv3; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA; ssl_prefer_server_ciphers on; ssl_dhparam /etc/nginx/ssl.crt/dhparams.pem; }