证书的信任
坏人太多,我们不得不防。如果出现下面这种中间人攻击,怎么处理?
我们即使通过https连接,但是我们可能连接的是坏人的服务器,他们也开启了https,作为客户端如何区分是不是坏人的服务器。这个时候就看客户端对服务端的证书的是否信任了。
产生证书的途径有两种,自签名证书和CA机构颁发。我们的电脑里面,会保存一份受信任的CA机构的根证书,浏览器就信任电脑这份CA列表颁发的证书,Firefox信任自带的CA列表。
下面问题来了?
如何区分是不是CA机构颁发的证书呢?
证书里面含有很多信息,比如使用者是谁,使用的域名,有效期等。最重要的还有一个数字签名。
先创建一个证书请求,然后上传到CA结构。
CA机构会检查上传者的信息以及域名等信息,如果通过进行下一步。
CA机构,把证书请求的信息,进行哈希,得出一个值,然后通过他的私钥计算出来数字签名。
最后产生数字证书给请求者。
网站管理员会把证书部署到服务器上面,用户访问的时候,服务端会发送到浏览器。
浏览器根据证书信息,哈希出来一个值,我们称为A。
浏览器使用CA机构根证书,里面有公钥。然后解密数字签名,得出一个值,我们称为B。
对比A和B,是否一致,如果一致的话,那就代表是CA机构颁发的。
如果CA机构的私钥泄露的话,其他人都可以伪造证书颁发了。
仅仅检查是不是CA机构颁发的就可以了吗?
肯定不是的呀,还得检查有效期,域名信息是否一致等。
服务端使用https,用户一定是安全的吗?
左图是正常的连接。右图也是一个中间人攻击,你可能使用http连接方式连接坏人的网站,没有任何的警告,所以说,如果重要的信息,非HTTPS页面不要乱填。
页面是HTTPS,域名也正确,一定是安全的吗?
答案也是否定的,有可能坏人在你的电脑里面安装了一个根证书,导致即使是自签名证书,浏览器也信任这个证书,没有任何的报警。
我们为什么要上https
我说为了保护用户隐私,你们相信吗?我们就是这么一个目的,电商网站里面有不少页面,涉及到用户电话,地址的信息。
上线前的疑问
我们的业务是在很多国家下面都有的,每一个国家的基础设施不一样,导致访问网站的速度还是不一样的。
所以问题来了?
所有的国家都上,还是部分国家上?
全站上?还是部分页面上?
所有的终端上,还是PC端,M站,APP分别上?
这些问题如果不解决,是不能随便上线的,所以我们进行了数据调研。
数据调研
我们买了一些基调数据以及页面埋点(幸亏用户前端性能检测是我负责的),可以得知不同国家的网络速度。一些国家或者地区网速太慢,就暂时不上https。
另外调研了国内以及国际的一些主流的网站,全站上的有,部分页面上的也有,最后我们对不涉及用户隐私信息的页面,暂时不上https。
上线前的目标
除了开发还做了什么
这里面最困难的是静态资源梳理。Https页面,要求静态资源以及Ajax请求也都必须走https,对于http资源是拒绝加载的。部分的移动浏览器是没有这个限制的,但是最好我们都是https。
静态资源来源很多地方,常见的有:
开发需要的JS,CSS,图片
运营通过CMS上传的图片
其他服务的图片
我们对于静态资源资源做了很多,总结了一下常用的
协议自适应。平常的资源是http://开头,我们现在变成了//,浏览器可以根据当前的协议,自动的加载相同协议的资源。
保存转化。修改一些相应系统,保存图片的时候,协议地址更改成为//
动态转化。一些其他系统,不太愿意或者改动的地方比较麻烦,我们需要在后端转化完成给前端。
做了这些,总有可能失误,想不到的地方,所以我们防止万一这种情况的出现,就添加了一个header头部。
保全之策-CSP
Content-Security-Policy:upgrade-insecure-requests |