昨天一早,客户联系到我,说他们源站https支持tlsv1.0 tlsv1.1 tlsv1.2,因为安全扫描的时候显示tlsv1.0和tlsv1.1存在安全风险,所以源站将tlsv1.0和tlsv1.1关闭了,但再后续扫描发现还是存在tlsv1.0开启的问题,所以联系到我问是不是cdn侧的问题。作为cdn厂商,为了兼容老的浏览器,cdn侧默认是开启了tlsv1.0等低版本的支持。确认问题后,客户要求关闭tlsv1.0。
大家都知道,nginx配置中有关于ssl_protocol的配置,所以开始我以为关闭tlsv1.0非常容易,只需要改一行配置即可。
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_protocols TLSv1.2;
改完后通过curl测试发现,使用tlsv1.0还是可以正常访问的,感觉比较奇怪。
curl -vo /dev/null "https://www.example.com/client.css" --resolve www.example.com:443:203.0.113.1 --tlsv1.0 #linux
curl -vo /dev/null "https://www.example.com/client.css" --resolve www.example.com:443:203.0.113.1 --tlsv1.0 --tls-max 1.0 #mac
经过进一步分析发现,nginx配置项中的ssl_ciphers
项中,如果允许了低版本的加密套件,哪怕ssl_protocols
中没有允许低版本的ssl协议,nginx也会开启对低版本的支持,这就是问题所在。
通过更改ssl_ciphers
,重新验证,问题修复。
ssl_ciphers 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;
这里推荐一个工具,大家在配置ssl_ciphers
的时候,可能不知道如何配置,可以到SSL Configuration Generator上面根据自己软件类型、版本,openssl版本,以及自己期望的安全等级在线生成建议的配置。