Nginx SSL TLS部署最佳实践

本文介绍nginx在提供HTTPS时使用的一些其他配置选项。 虽然这些功能有助于优化nginx的SSL和TLS,但这不是一个完整对加固nginx的介绍。 确保您的服务器安全的最佳方法是不仅需要正确的配置,而且需要始终遵循最佳安全的设置实践。

关闭nginx版本显示

<br\>
默认情况下,nginx与任何连接到服务器的客户端共享其版本号。 例如,如果没有找到目录,nginx将返回包含其版本号的404错误。 关闭nginx版本显示使得攻击者无法清楚的得到具体版本,因此可以阻止他进行特定于版本的漏洞攻击。
1.要禁用server_tokens,请打开/etc/nginx/nginx.conf文件。 在http块中,附加或取消注释以下行:

  1. server_tokens       off;

2.保存更改并重启nginx

  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:

  1. listen       443 ssl http2;

2.保存修改并重启nginx

  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.保存更改并重启nginx

  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。

posted @ 2017-01-13 18:47  大数据从业者FelixZh  阅读(5107)  评论(1编辑  收藏  举报