TLS安全漏洞修复
PCI DSS合规标准将于2018年6月30日生效,该标准要求禁用SSL协议和低版本TLS协议,HTTPS配置应实施更安全的加密协议(TLS v1.1或更高版本,强烈建议使用TLS v1.2),以满足PCI DSS合规标准的要求,解决安全套接字层(SSL)和传输层安全(TLS)加密协议内的高风险漏洞,应对最新的客户支付信息面临的威胁。
注:PCI DSS 全称 Payment Card Industry Data Security Standard(支付卡行业数据安全标准),是由PCI安全标准委员会制定,力在使国际上采用一致的数据安全措施。
- 参考1:阿里云-TLS安全策略
- 参考2:SSL/TLS在线安全评估
- 参考2:SSLv3 POODLE漏洞在线评估扫描
背景信息
TLS(Transport Layer Security)即安全传输层协议,在两个通信应用程序之间提供保密性和数据完整性,最典型的应用就是HTTPS。HTTPS即HTTP over TLS,就是更安全的HTTP,运行在HTTP层之下,TCP层之上,为HTTP层提供数据加解密服务。
协议 | 说明 | 支持的主浏览器 |
---|---|---|
TLSv1.0 | RFC2246,1999年发布,基于SSLv3.0,易受攻击,不符合PCI DSS合规标准 | ● IE6+ ● Chrome 1+ ● Firefox 2+ |
TLSv1.1 | RFC4346,2006年发布,修复TLSv1.0若干漏洞 | ● IE 11+ ● Chrome 22+ ● Firefox 24+ ● Safri 7+ |
TLSv1.2 | RFC5246,2008年发布,目前广泛使用的版本 | ● IE 11+ ● Chrome 30+ ● Firefox 27+ ● Safri 7+ |
TLSv1.3 | RFC8446,2018年发布,最新的TLS版本,更快、更安全 | ● Chrome 70+ ● Firefox 63+ |
- TLS 1.0,使用的是弱加密算法和系统,比如SHA-1和MD5,这些算法和系统十分脆弱,存在重大安全漏洞,容易受到降级攻击的严重影响。
- TLS 1.3,支持0-RTT模式(更快),只支持完全前向安全性密钥交换算法(更安全)
涉及tls的安全漏洞
- 涉及tls的漏洞清单,主要包括如下:
漏洞名称 | 漏洞等级 | CVE编号 | 漏洞描述 | 修复建议 |
---|---|---|---|---|
启用 TLS 1.0 协议 | 高危 | CVE-2016-2183 | - | 禁用TLS 1.0并替换为TLS 1.2或更高版本 |
启用 TLS 1.1 协议 | 中危 | CVE-2016-2183 | - | 禁用TLS 1.1并替换为TLS 1.2或更高版本 |
POODLE攻击(支持SSLv3) | 高危 | CVE-2014-3566 | 该漏洞可以使攻击者获取到一段明文数据,通常是cookie数据 | 禁用SSLv3并替换为TLS 1.2或更高版本 |
POODLE攻击(SSLv3 with CBC cipher suites) | 中危 | CVE-2014-3566 | - | 禁用SSLv3并替换为TLS 1.2或更高版本 |
TLS/SSL LOGJAM attack | 中危 | CVE-2015-4000 | - | - |
TLS/SSL Sweet32 attack | 中危 | CVE-2016-2183 | 允许攻击者使用64位分组密码破坏HTTPS连接 | 升级OpenSSL版本到1.1.1 |
SSL弱密码 | 中危 | - | - | - |
确认TLS版本
如何确认某个https站点启用了哪些 TLS 加密协议?以 www.baidu.com
为例
- 第1步,安装nmap端口扫描工具,利用nmap扫描并确认服务器开启的TLS协议版本。示例扫描出来 TLSv1.0、TLSv1.1、TLSv1.2,则表示该站点启用了这3个协议(应该是为了兼容更多的客户端浏览器版本)。
[root@localhost ~]# yum -y install nmap
[root@localhost ~]# nmap -sV -p 443 --script ssl* www.baidu.com | grep TLSv
| TLSv1.0:
| TLSv1.1:
| TLSv1.2:
- 第2步,使用客户端检查
[root@localhost ~]# echo Q | openssl s_client -connect www.baidu.com:443 | egrep "(TLS|Cipher|Protocol)"
#.其他省略...
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
TLS session ticket:
- 第3步,测试服务器的协议
curl -sSL -v https://www.baidu.com:443
漏洞修复步骤
- 第1步,Nginx使用OpenSSL进行SSL处理,TLSv1.1与TLSv1.2要求OpenSSL版本 >= 1.0.1,而TLSv1.3则要求 >= 1.1.1,若OpenSSL低于1.1.1则不支持TLS1.3。可执行
nginx -V
或openssl version
查看openssl版本,若两者返回的版本不一致,则以nginx -V
为准,示例为 1.1.1
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.22.0
built with OpenSSL 1.1.1g 21 Apr 2020
[root@localhost ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
- 第2步,通过参数 ssl_protocols(没有请添加)禁用TLS 1.0、TLS 1.1(去掉即可),并将其替换为TLS 1.2或更高版本。另外,在不需要的(带 DES的) 加解密套件(默认
HIGH:!aNULL:!MD5
)前加 ! 号,以禁用之
server_name xxx.example.com;
listen 443 ssl;
#.其他省略...
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}
注:若OpenSSL版本 < 1.1.1,则不支持 TLSv1.3,则只能配置
ssl_protocols TLSv1.2;
更多配置,请参考 nginx配置https证书指南
- 第3步,执行
nginx -t
确认配置无误之后再执行 nginx 热重启
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
确认是否生效
- 第4步,关注nginx错误日志,看是否有其他报错
tail -n100 /usr/local/nginx/logs/error_nginx.log
- 第5步,最后进行测试,打开谷歌浏览器访问, 按F12,点击security,如果出现下面的提示说明开启了tlsv1.2,否则不行。
遇到的坑
- 配置tls1.2不生效,原因是 nginx/conf 目录下其他站点的ssl配置不一致。所以一定要注意:所有配置了https的站点,其ssl配置(就是第2步中ssl开头的那3个参数)必须一致,要不然不会生效。
cat *.conf | egrep -r "(ssl_protocols|ssl_ciphers|ssl_prefer_server_ciphers)"