为什么要禁用 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+。