有朋自远方来,不亦乐乎。
分享一个HTTPS安全评级升到A+的nginx配置
发布于 2个月前 ( 03-10 ) 阅读: 592 次 评论: 6 条 A+

部署从而给小网站加一个小绿锁,相信已经不是什么新奇的事物了。

但如何把网站https的安全评级提升到A+,那么就该好好折腾一番。

直奔主题吧,以下我会详细分解一个实用nginx标配的各个配置,简单实现A+。(至于如何操作,需要怎么操作,我就不赘述了)

预警:本篇文章操作的基础前提,需要懂一些SSH命令,以及知道什么是SSH等常识。

口感:工作快餐

前提

本篇的前提是基于站点已经部署了SSL,知道如何打开网站nginx配置文件(如文件位置)。

配置证书路径

#配置证书路径
ssl_certificate /公钥路径;
ssl_certificate_key /私钥路径;

自行填写正确的证书路径。

算法秘钥

我们得到的证书一般都需要加入一些密钥算法,加强其安全性。

如何操作呢?

打开SSH链接服务器,运作以下命令生成dhparam.pem 文件(生成所需的时间长短因服务器而异,生成过程中SSH会显示类似的…….+….+

openssl dhparam -out /www/ssl/dhparam.pem 2048

以上命令是加入2048位的迪菲、赫尔曼算法秘钥,需要预先手动生成(如果使用的是军哥lnmp,且自动续费证书的话,请无视这个步骤,因为在新建网站虚拟机的时候已经生成了)。

Ps:注意文件生成的路径,同时算法密钥也可以加入4096位,方法只需将上面的2048改为4096。

#加入2048位的迪菲、赫尔曼算法秘钥
ssl_dhparam /www/ssl/dhparam.pem;

协议

#允许的协议,针对降级攻击,禁用SSLv2 SSLv3
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

 加密套件

#优先使用服务端设定的加密套件,而不是浏览器的
ssl_prefer_server_ciphers on;
#禁用不安全的加密套件
ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384: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: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";

ciphers 的选择很关键,配置中的 ciphers 支持大多数浏览器,但不支持 XP/IE6 。

不安全加密套件可以根据需求来禁用,这也是为什么有些站长的ciphers很长、有些站长禁用的ciphers很短。

#禁用不安全的加密套件(备用,相对上面的禁用套件,较少)
ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4';

ssl session 配置

#优化TLS握手,缓存链接凭据
ssl_session_timeout 1h;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;

可以因需修改握手、缓存时间,比如改1h为10m、改50m为10m。

OCSP封套

#OCSP封套
ssl_stapling on;
ssl_stapling_verify on;
resolver 114.114.114.114 valid=300s;
resolver_timeout 10s;

上面的114.114.114.114可以因需修改,具体如何修改请自行百度。

配置

# 开启 HSTS
add_header Strict-Transport-Security "max-age=15552000; includeSubdomains; preload";

ps:max-age的值只要不低于18周就可以了,所以哪怕是填写到63072000都可以。

开启HSTS,需要全站。而且它对安全评级的影响很大,许多人卡在A无法升到顶级A+,一般都跟HSTS有关系,所以可以考虑一下是否开启。

但是开启HSTS需谨慎,因为开启容易停用难

如果我们的网站中途放弃了使用 HTTPS ,用户又没有清除缓存,则会导致网站无限重定向

同时 HSTS 也存在需要填补的安全漏洞。

为了使 HSTS 生效,客户端必须先访问一次站点以获取响应头,所以首次连接依然给 HTTP 明文传输留下了机会。

解决办法是申请加入HSTS Preload List

这是一份由 Google Chrome 维护,Chrome、Firefox、Safari、IE 11 和 Microsoft Edge 同在使用,包含了支持 HSTS 的站点域名,并定期更新的名单。

——本段落摘自互联网

如何加入呢?下面是入门门槛:

  1. 拥有合法的证书(如果使用 SHA-1 证书,过期时间必须早于 2016 年);
  2. 将所有 HTTP 流量重定向到 HTTPS;
  3. 确保所有子域名都启用了 HTTPS;
  4. HSTS 响应头要求:max-age 不能低于 18 周(10886400 秒),必须指定 includeSubdomains 参数,必须指定 preload 参数。

HSTS Preload List官网(这是一个国外网站,正确的打开姿势是什么,不需要我点明了吧):

申请生效需要时间审核,一个月或半年都有可能。

查询方式很简单,只需要使用谷歌浏览器输入 chrome://net-internals/#hsts ,就能在 Query domain 项中查询。

重启nginx

配置好之后,需要重启一下nginx。

lnmp nginx restart

Ps:任何事物都容易贪多不嚼、过犹不及,所以按需配置、恰到好处才是理智的做法。

——END

最后贴一下完整的nginx配置,懒癌发作的站长童鞋们可以直接复制粘贴,然后修改里面的一些路径即可:

server
{
listen 443 ssl;
server_name 贵站域名;
root /网站目录;
 
#配置证书路径
ssl_certificate /公钥路径;
ssl_certificate_key /私钥路径;
 
#加入2048位的迪菲、赫尔曼算法秘钥(注意真实的路径,注意预先手动生成文件)
ssl_dhparam /www/ssl/dhparam.pem;
 
#允许的协议,针对降级攻击,禁用SSLv2 SSLv3
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 
#优先使用服务端设定的加密套件,而不是浏览器
ssl_prefer_server_ciphers on;
 
#禁用不安全的加密套件
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384: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: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';
 
#优化TLS握手,缓存链接凭据
ssl_session_timeout 1h;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;
 
#OCSP封套
ssl_stapling on;
ssl_stapling_verify on;
resolver 114.114.114.114 valid=300s;
resolver_timeout 10s;
 
#开启HSTS
add_header Strict-Transport-Security "max-age=15552000; includeSubdomains; preload";

location / {
                # 其他配置省略
        }
}
boke112官方群
萌新站长悄悄潜水的DALAO云集群
187+人已关注

目前评论:6   其中:访客  3   博主  3

发表评论

请稍候,正在加载新评论...
  1. 明月登楼
    明月登楼3 ( 2018.03.13 15:45:26 )  地板

    呵呵,不错,很详细地的HTTPS配置!

  2. 品牌馆
    品牌馆1 ( 2018.03.12 10:11:02 )  板凳

    这日复一日,写这么长的技术文档,然后没有挂任何的AD,真心靠的是强大的兴趣啊!终于看到一个2345的AD了,对了2345也有其他的样式的AD啊

    • 龙砚庭
      龙砚庭博主 ( 2018.03.12 10:19:55 )

      @品牌馆 以前有想过挂挂广告,但后来觉得还是算了。搭建个人博客,更多是在无拘束写写文字、记录折腾的点滴。
      Ps:2345的广告样式我没去注意,挂它单纯只是因为不用访客花费一毛钱,只需点开关闭即可。

  3. 西枫里博客
    西枫里博客2 ( 2018.03.11 14:26:24 )  沙发

    无需加入google的HSTS列表。只要将add_header Strict-Transport-Security 设置在半年以上即可达到A+

    • 龙砚庭
      龙砚庭博主 ( 2018.03.11 14:54:35 )

      @西枫里博客 我自己也没加入google的HSTS列表,然后昨天仔细看了一下自己的nginx配置,才发现原来几年前我就已经将你说的这个办法用到配置里面了。 :lol: