本文介紹nginx在提供HTTPS時使用的一些其他配置選項。 雖然這些功能有助於優化nginx的SSL和TLS,但這不是一個完整對加固nginx的介紹。 確保您的服務器安全的最佳方法是不僅需要正確的配置,而且需要始終遵循最佳安全的設置實踐。
關閉nginx版本顯示
<br\>
默認情況下,nginx與任何連接到服務器的客戶端共享其版本號。 例如,如果沒有找到目錄,nginx將返回包含其版本號的404錯誤。 關閉nginx版本顯示使得攻擊者無法清楚的得到具體版本,因此可以阻止他進行特定於版本的漏洞攻擊。
1.要禁用server_tokens,請打開/etc/nginx/nginx.conf文件。 在http塊中,附加或取消注釋以下行:
- server_tokens off;
2.保存更改並重啟nginx
- systemctl restart nginx
啟用HTTP/2支持
<br\>
2010年9月,Google發布了適用於Chrome 6所有版本的的SPDY協議.SPDY目前正在逐步淘汰,以支持HTTP/2。 nginx在2016年5月刪除了對Chrome中SPDY的支持。僅在nginx 1.8.x或更早版本中支持SPDY,而從1.9.5開始的版本開始支持HTTP/2。 檢查你的nginx版本:
nginx -v
HTTP/2是HTTP標准的新版本,替代HTTP/1.1以減少頁面加載時間。 傳統上,當用戶訪問網頁時,需要建立單獨的HTTP連接以加載每個資源(例如HTML,CSS,JavaScript或圖像)。 HTTP/2允許在單個連接上並發請求資源。 服務器還會在將資源發送到客戶端之前對其進行壓縮,這有利用減少的傳輸帶寬。
1.要啟用HTTP/2,請打開nginx SSL虛擬主機配置文件。 根據你安裝nginx方式,這可能位於/etc/nginx/sites-enabled/default或/etc/nginx/conf.d/example_ssl.conf。 在“SSL配置”中查找listen行。 如果需要,取消注釋以下行,並將http2添加到分號前的結尾。
/etc/nginx/conf.d/example_ssl.conf:
- listen 443 ssl http2;
2.保存修改並重啟nginx
- systemctl restart nginx
3.打開https://tools.keycdn.com/http2-test網站,輸入域名測試是否正確支持HTTP/2。
重定向HTTP到HTTPS
<br\>
Google現在對搜索結果中使用HTTPS加密連接的網站進行優先排名,因此將HTTP請求重定向到HTTPS是提高網頁排名的一種可能方法。 然而,在遵循這些步驟之前,請務必研究舊版瀏覽器可能出現的兼容性問題。
1.打開您的HTTP nginx虛擬主機配置文件,可能位於/etc/nginx/conf.d/default.conf,/etc/nginx/nginx.conf或/etc/nginx/sites-enabled/default,具體取決於您安裝nginx的方式。 更改example.com以匹配您的服務器的域名或主機名:
/etc/nginx/conf.d/default.conf:
- server_name example.com
2.在server_name行下面附加以下行。
/etc/nginx/conf.d/default.conf:
- rewrite ^ https://$server_name$request_uri? permanent;
3.注釋掉(放置#在前面)所有其他行,所以你的配置看起來像這樣:
/etc/nginx/conf.d/default.conf:
- server {
- listen 80;
- server_name example.com;
- rewrite ^ https://$server_name$request_uri? permanent;
- }
4.保存更改並重啟nginx
- systemctl restart nginx
OCSP Stapling
<br\>
創建在線證書狀態協議(OCSP)是為了加速操作系統和瀏覽器用於檢查證書吊銷的過程。 例如,當您在Windows計算機上使用Internet Explorer或Google Chrome時,Windows默認配置為檢查證書吊銷。 在OCSP之前,您的操作系統或瀏覽器將下載證書吊銷列表(CRL)。 CRL已經變得非常大,以至於瀏覽器廠商正在創建自己的CRL並將其分發給用戶。
OCSP的問題是,用戶在使用由同一供應商或證書頒發機構提供的證書的網站跳轉時,證書頒發機構可以跟蹤用戶這種行為。 為了防止這種情況,可以啟用OCSP stapling。
當啟用OCSP stapling時,服務器上的nginx將向客戶端發出OCSP請求。 從OCSP服務器收到的響應被添加到nginx對用戶的響應中。 這消除了用戶連接到OCSP服務器以檢查服務器證書的撤銷狀態的需要。
1.打開您的HTTPS nginx虛擬主機配置文件,可能位於/etc/nginx/conf.d/example_ssl.conf或/etc/nginx/sites-enabled/default,具體取決於您如何安裝和配置nginx。 在server塊中添加以下行:
/etc/nginx/conf.d/example_ssl.conf:
- ssl_stapling on;
- ssl_stapling_verify on;
- ssl_trusted_certificate /etc/ssl/nginx/ca.pem;
2.保存更改並重啟nginx
- systemctl restart nginx
3.打開https://www.ssllabs.com/ssltest/,檢查OCSP stapling是否正確開啟。
強制HTTP使用HTTPS(HSTS)
<br\>
Google Chrome,Mozilla Firefox,Opera和Safari目前支持HSTS標頭。 HSTS用於強制瀏覽器僅使用安全加密連接進行連接。 這意味着您的網站將無法再通過HTTP訪問。 當HSTS啟用並且有效的HSTS頭存儲在用戶瀏覽器緩存中時,如果顯示由不受信任的證書頒發機構頒發的自簽名,過期或SSL證書,則用戶將無法訪問您的網站。 用戶也將無法繞過任何證書警告,除非您的HSTS標頭過期或瀏覽器緩存已清除。
將所有流量從HTTP重定向到HTTPS后,您可能需要允許用戶僅使用HTTPS進行連接。 在啟用HSTS之前,請確保您了解與舊版瀏覽器的兼容性的潛在影響。
如果您希望用戶能夠通過HTTP訪問您的網站,請不要按照這些步驟操作!
1.打開您的nginx HTTPS虛擬主機配置文件。 這可能位於/etc/nginx/sites-enabled/default或/etc/nginx/conf.d/example_ssl.conf。 在您的server塊中附加以下行:
/etc/nginx/conf.d/example_ssl.conf:
- add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
max-age屬性以秒為單位設置此標頭的到期日期; 在上述配置中,報頭將在1年后過期。 您可以將其配置為更長或更短,但對Qualys測試,少於180天的時間被認為太短了。 includeSubdomains參數在所有子域上強制執行HSTS。
2.保存更改並重啟nginx
- systemctl restart nginx
3.打開https://www.ssllabs.com/ssltest/,測試配置是否生效。
禁用內容嗅探
<br\>
內容嗅探允許瀏覽器檢查字節流以便“猜測”其內容的文件格式。 它通常用於幫助不能正確識別其Web內容的MIME類型的網站,但它也導致出現了跨站點腳本和其他攻擊的漏洞。 要禁用內容嗅探,請在server塊中的nginx SSL配置文件中添加以下行:
/etc/nginx/conf.d/example_ssl.conf:
- add_header X-Content-Type-Options nosniff;
禁用或限制嵌入
<br\>
HTTPS響應頭X-Frame-Options可以指定頁面是否能夠在框架,iframe或對象中呈現。 如果未設置,您的網站的內容可能會在clickjacking攻擊中嵌入到其他網站的HTML代碼中。 要禁用嵌入內容,請將以下行添加到server塊中的SSL配置文件中:
/etc/nginx/conf.d/example_ssl.conf:
- add_header X-Frame-Options DENY;
如果您希望限制嵌入而不是完全禁用它,則可以用SAMEORIGIN替換DENY。 這將允許您在框架中使用您的頁面,只要是在同一網站中。
創建自定義Diffie-Hellman密鑰交換
<br\>
我們使用4096位RSA私鑰來簽署Diffie-Hellman密鑰交換,但是Diffie-Hellman的默認參數只指定1024位,通常使其成為SSL密碼套件中最弱的鏈路。 我們應該為密鑰交換生成自己的自定義參數,以提供更高的安全性。
1.切換到certs目錄
- cd /etc/ssl/certs
2.為TLS握手創建自定義參數。 這里我們將使用4096位密鑰來實現高安全性:
- openssl dhparam -out dhparam.pem 4096
3.通過將以下行添加到server塊中的nginx SSL配置文件中來指定新參數:
/etc/nginx/conf.d/example_ssl.conf:
- ssl_dhparam /etc/ssl/certs/dhparam.pem;
4.保存更改並重啟nginx
- systemctl restart nginx
測試配置
<br\>
你的/etc/nginx/conf.d/example_ssl.conf現在應該看起來類似於:
/etc/nginx/conf.d/example_ssl.conf:
- # HTTPS server
- #
- server {
- listen 443 ssl http2;
- add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
- add_header X-Content-Type-Options nosniff;
- add_header X-Frame-Options DENY;
- server_name example.com;
- ssl_certificate /etc/ssl/nginx/nginx.crt;
- ssl_certificate_key /etc/ssl/nginx/server.key;
- ssl_session_cache shared:SSL:10m;
- ssl_session_timeout 5m;
- ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH !RC4";
- ssl_prefer_server_ciphers on;
- ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
- ssl_stapling on;
- ssl_stapling_verify on;
- ssl_trusted_certificate /etc/nginx/ca.pem;
- ssl_dhparam /etc/ssl/certs/dhparam.pem;
- location / {
- root /usr/share/nginx/html;
- index index.html index.htm;
- }
- }
打開https://www.ssllabs.com/ssltest/,測試SSL。