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。

相关文章
相关标签/搜索