Nginx SSL TLS部署最佳實踐

本文介紹nginx在提供HTTPS時使用的一些其餘配置選項。 雖然這些功能有助於優化nginx的SSL和TLS,但這不是一個完整對加固nginx的介紹。 確保您的服務器安全的最佳方法是不只須要正確的配置,並且須要始終遵循最佳安全的設置實踐。html

關閉nginx版本顯示

<br\>
默認狀況下,nginx與任何鏈接到服務器的客戶端共享其版本號。 例如,若是沒有找到目錄,nginx將返回包含其版本號的404錯誤。 關閉nginx版本顯示使得攻擊者沒法清楚的獲得具體版本,所以能夠阻止他進行特定於版本的漏洞攻擊。
1.要禁用server_tokens,請打開/etc/nginx/nginx.conf文件。 在http塊中,附加或取消註釋如下行:nginx

  1. server_tokens       off;

2.保存更改並重啓nginxweb

  1. 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:windows

  1. listen       443 ssl http2;

2.保存修改並重啓nginxcentos

  1. 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:緩存

  1. server_name example.com

2.在server_name行下面附加如下行。
/etc/nginx/conf.d/default.conf:安全

  1. rewrite        ^ https://$server_name$request_uri? permanent;

3.註釋掉(放置#在前面)全部其餘行,因此你的配置看起來像這樣:
/etc/nginx/conf.d/default.conf:服務器

  1. server {
  2.     listen       80;
  3.     server_name  example.com;
  4.     rewrite      ^ https://$server_name$request_uri? permanent;
  5. }

4.保存更改並重啓nginxsession

  1. 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:

  1. ssl_stapling on;
  2. ssl_stapling_verify on;
  3. ssl_trusted_certificate /etc/ssl/nginx/ca.pem;

2.保存更改並重啓nginx

  1. 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:

  1. add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

max-age屬性以秒爲單位設置此標頭的到期日期; 在上述配置中,報頭將在1年後過時。 您能夠將其配置爲更長或更短,但對Qualys測試,少於180天的時間被認爲過短了。 includeSubdomains參數在全部子域上強制執行HSTS。
2.保存更改並重啓nginx

  1. systemctl restart nginx

3.打開https://www.ssllabs.com/ssltest/,測試配置是否生效。

禁用內容嗅探

<br\>
內容嗅探容許瀏覽器檢查字節流以便「猜想」其內容的文件格式。 它一般用於幫助不能正確識別其Web內容的MIME類型的網站,但它也致使出現了跨站點腳本和其餘攻擊的漏洞。 要禁用內容嗅探,請在server塊中的nginx SSL配置文件中添加如下行:
/etc/nginx/conf.d/example_ssl.conf:

  1. add_header X-Content-Type-Options nosniff;

禁用或限制嵌入

<br\>
HTTPS響應頭X-Frame-Options能夠指定頁面是否可以在框架,iframe或對象中呈現。 若是未設置,您的網站的內容可能會在clickjacking攻擊中嵌入到其餘網站的HTML代碼中。 要禁用嵌入內容,請將如下行添加到server塊中的SSL配置文件中:
/etc/nginx/conf.d/example_ssl.conf:

  1. add_header X-Frame-Options DENY;

若是您但願限制嵌入而不是徹底禁用它,則能夠用SAMEORIGIN替換DENY。 這將容許您在框架中使用您的頁面,只要是在同一網站中。

建立自定義Diffie-Hellman密鑰交換

<br\>
咱們使用4096位RSA私鑰來簽署Diffie-Hellman密鑰交換,可是Diffie-Hellman的默認參數只指定1024位,一般使其成爲SSL密碼套件中最弱的鏈路。 咱們應該爲密鑰交換生成本身的自定義參數,以提供更高的安全性。
1.切換到certs目錄

  1. cd /etc/ssl/certs

2.爲TLS握手建立自定義參數。 這裏咱們將使用4096位密鑰來實現高安全性:

  1. openssl dhparam -out dhparam.pem 4096

3.經過將如下行添加到server塊中的nginx SSL配置文件中來指定新參數:
/etc/nginx/conf.d/example_ssl.conf:

  1. ssl_dhparam /etc/ssl/certs/dhparam.pem;

4.保存更改並重啓nginx

  1. systemctl restart nginx

測試配置

<br\>
你的/etc/nginx/conf.d/example_ssl.conf如今應該看起來相似於:
/etc/nginx/conf.d/example_ssl.conf:

  1. # HTTPS server
  2. #
  3. server {
  4.     listen       443 ssl http2;
  5.         
  6.     add_header   Strict-Transport-Security "max-age=31536000; includeSubdomains";
  7.     add_header   X-Content-Type-Options nosniff;
  8.     add_header   X-Frame-Options DENY;
  9.         
  10.     server_name  example.com;
  11.  
  12.     ssl_certificate      /etc/ssl/nginx/nginx.crt;
  13.     ssl_certificate_key  /etc/ssl/nginx/server.key;
  14.  
  15.     ssl_session_cache shared:SSL:10m;
  16.     ssl_session_timeout  5m;
  17.  
  18.     ssl_ciphers  "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH !RC4";
  19.     ssl_prefer_server_ciphers   on;
  20.  
  21.     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  22.  
  23.     ssl_stapling on;
  24.     ssl_stapling_verify on;
  25.     ssl_trusted_certificate /etc/nginx/ca.pem;
  26.  
  27.     ssl_dhparam /etc/ssl/certs/dhparam.pem;
  28.  
  29.     location / {
  30.         root   /usr/share/nginx/html;
  31.         index  index.html index.htm;
  32.     }
  33. }

打開https://www.ssllabs.com/ssltest/,測試SSL。

相關文章
相關標籤/搜索