自从MySSL推出之后,很多网站HTTPS检测评分都达到了A或者A+,但在看检测结果的时候,发现类似于百度和淘宝这类大用户群的网站居然没有评级到A或者在使用的加密套件上有橙色的加密套件,这就让我们非常诧异,难道是这些个网站不注重安全么?
如果说百度评级不高,那还能说得过去,毕竟在搜索的时候没啥重要信息,牺牲一点安全性获取极致的兼容性。但是淘宝这种电商不应该不会不重视网站的安全性。那又是什么原因让这些网站造成了这种情况呢?通过仔细的观察报告结果和查询资料发现,这些网站这样做的原因是为了更好的兼容性,但各家也有不同的做法:
百度
先来看一下的百度的评分:
从图中可以看出www.baidu.com这个网站的评分是C,造成这个评分的主要原因是使用RC4加密套件,文章一开始就说了,评不到A或者更高的原因是为了兼容性,那么再看一下客户端模拟的结果:
从这里发现哪怕用户使用的是IE6这款老古董级别的浏览器也能访问百度。这样的兼容性可以说是异常良好了。但是安全性就有点欠缺,如果要适配IE6这款浏览器,那么SSL协议就必须得支持SSL2和SSL3,因为IE6支持也仅支持这两个协议,SSL2是明确说明不安全的了,SSL3上又有著名的POODLE漏洞问题,SSL3上的所有CBC加密套件都会受该漏洞影响,除去CBC加密套件,那么就只剩下RC4系列的加密套件了,这个没得选择。
淘宝
相对于百度,面对兼容性问题,淘宝又是另一种做法了。
淘宝虽然评分到了A,但是在支持的加密套件中存在橙色的选项:
从图中可以看出淘宝舍弃了SSL3协议,换句话说就是放弃了对IE6的支持,这个从客户端模拟结果上也可以体现出来:
但是那个黄色的TLS_RSA_WITH_3DES_EDE_CBC_SHA又是什么原因呢?这是为了兼容XP上的IE8这类浏览器,这些浏览器器支持加密套件基本都是不安全的,唯一比较安全的就是3DES系列的了。为了兼容这些浏览器这应该算是一种比较好的方式了。
如何达到A+
最近发现有很多blog主在他们的blog中推荐我们MySSL,这让我们非常惊喜,在这里首先感谢一下这些blog主对我们MySSL的推广。
但是在看到给启用 SSL 的站点推荐个 HTTPS 专用工具网站的评论中,有一些blog主对如何评到A以及A+不是很理解,这里简单的说明一下。
首先要是,这个评分,并不仅仅是针对于证书的部署情况而言的,这是一个多方面综合的评级。其中包括了证书、SSL协议、加密套件、漏洞、不安全的外链等等。如果您的网站的评分已经达到A,那么没有被评到A+的最大的可能性就是没有使用HSTS,使用HSTS的方法很简单,只要在添加Strict-Transport-Security这个HTTP头部信息即可。
用nginx服务器做说明:
add_header Strict-Transport-Security "max-age=31536000";
但有一点需要注意,Strict-Transport-Security中的max-age的时间不能小于15552000。
总结
如果您的服务器需要支持IE6这种古董级别的浏览器,那么就按照百度的做法,如果说对兼容性没有太大的需求,只要主流的浏览器能够访问那么就不要支持3DES系列的加密套件,如果说想要在保证安全性的同时,也要有最好的兼容性,那么就请按照淘宝的配置方式进行配置。
下面给出这三种配置情况:
类似百度
Nginx
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
类似淘宝
Nginx
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
最好的安全性
Nginx
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
但也有可能因为openssl版本的不同会导致相同的配置得到不同的检测结果。如果您的openssl处于较新的版本那么按照最好的安全性进行配置,得到一个A,应该是没有问题的。