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;
- }
tsung 你好
憑證合併
A > B 會變成覆蓋。是不是這個地方應該改為 A >> B 才會把A的資料輸入到B的檔案裡面?
嗯嗯,這個是故意要蓋掉的,避免有人重複執行後,在裡面有多張憑證反而會有問題
註:有時候重複執行是因為搞不定,一直在申請新的憑證