Nginx禁用TLS1.0与1.1

2020年3月14日 11409点热度 71人点赞 1条评论

为什么要禁用 TLS1.0、TLS1.1

SSL 由于以往发现的漏洞,已经被证实不安全。而 TLS1.0 与 SSL3.0 的区别实际上并不太多,并且 TLS1.0 可以通过某些方式被强制降级为 SSL3.0。

由此,支付卡行业安全标准委员会(PCI SSC)强制取消了支付卡行业对 TLS 1.0 的支持,同时强烈建议取消对 TLS 1.1 的支持。

苹果、谷歌、微软、Mozilla 也发表了声明,将于 2020 年初放弃对 TLS 1.1 和 TLS 1.0 的支持。其原因是这两个版本使用的是过时的算法和加密系统,经发现,这些算法和系统是十分脆弱的,比如 SHA-1 和 MD5。它们也缺乏像完美的前向保密性这样的现代特征,并且容易受到降级攻击的影响。

实际我想要禁用 TLS1.0 和 TLS1.1 的一大原因是,在SSL Labs和My SSL做的 SSL 检测时,发现我的博客启用了 TLS1.0 和 TLS1.1 及配套的加密套件,导致评分直接掉到了 B 级,之前评分都是A+。

在 Nginx 上禁用 TLS1.0、TLS1.1

要禁用 TLS1.0 及 TLS1.1 的话,只需要在 Nginx 配置文件中,在指定的域名上指定支持的 TLS 的版本即可。

以OneinStack搭建的环境为例:

在目录/usr/local/nginx/conf/vhost中找到所的主机的Nginx 配置文件,打开找到ssl_protocols这行只保留TLSv1.2 TLSv1.3
我所指定的如下:

ssl_protocols TLSv1.2 TLSv1.3;

屏蔽不安全的加密套件提高安全性

nginx的ssl_ciphers决定服务器使用的加密套件,以下cipher 安全性的一些经验:

CHACHA20 是 goolge 几年前对移动设备的优化算法,速度比 AES 快,也省电,一度是 google 极力推荐的。但是自从 ARMv7 支持硬件 AES 加密之后,chacha20 就比不上了。
MD5,RC4,DES,SHA1 等都是已知不安全的选项,容易被攻击。
SHA256,SHA384 要比 SHA1 安全。但是 CBC 模式的 SHA 是不安全。GCM 模式的 SHA 是安全的。
苹果旧设备默认是 CBC_SHA256,CBC_SHA384
减少非安全 ciphers 能够提高安全性,但是对老的系统、设备兼容性下降,甚至握手失败。

推荐一个 mozilla 的站点 Security/Server Side TLS,里面有官方推荐的 tls ciphers 组合。一般情况选择 Intermediate compatibility (recommended) 就可以了。

我的 ciphers 配置如下:

ssl_ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

最后保存 Nginx 配置后,重启 Nginx,使以上配置生效。

service nginx restart

现到SSL Labs和My SSL做的 SSL 检测,显示TLS1.0与1.1不可用,评分也恢复了A+。

信仰飘扬

行尽天涯 静默山水间