引言:
之前我们学习过http(超文本传输协议),只要在搜索框中输入http://:,我们就能在网上冲浪,了解各种信息,但是我们经常遇到过此站点不安全,无法连接此站点等情况,这时它需要我们信任此网络才能访问,为什么会出现这种情况呢,这就需要我们来聊一聊HTTPS协议了。
更安全的HTTPS
HTTP+S,这里的S代表secure,显而易见,他比https协议更加安全。
HTTP协议在传输数据时要经过多次路由转发,很有可能数据受到截留篡改,就好像你发了一个快递给朋友,经过多次物流转发,里面的东西是否丢失或被替换。这是因为HTTP并未涉及安全问题,直接以明文方式发送,攻击者不用花太大力气就可以截取篡改。
于是为了保证数据的安全性,网景公司首先于1994年 在自己的浏览器中支持HTTPS,服务器将数据使用密钥加密,用户使用密钥解密,但是这个密钥线上传输也不安全,线下传递消耗成本,于是非对称加密成为必选。
非对称加密,使用一对私钥和公钥,公钥加密的数据只能私钥解密,公钥自身无法解密,同样私钥加密的数据私钥也无法自己解密,加解密的过程并不对称。
加密过程:SSL握手
1. 服务器生成一对私钥和公钥,将自己的公钥发给浏览器。
2.浏览器生成一个随机数据,用服务器给的公钥进行加密,发给服务器。
3.服务器用自己的私钥进行解密,解密得到同样的随机数据,随机数据便作为对称加密的密钥,对真正需要传递的数据进行加密。
这时就算拦截者得到公钥也无济于事,无法对传递的数据进行解密,以上便是HTTPS中S实现的大致原理。这个流程独立于HTTP协议,也被称为安全套接字层(Secure Sokect Layer),简称SSL,因此这个密钥协商的过程也被称为SSL握手。
此后SSL经过1.0 2.0 3.0 三个版本升级,在3.0的版本上互联网工程事务组(IETF)决定将其标准化,最后在1999年以TLS这个新的称呼被发布。这就是为什么SSL与TLS为什么经常混用的原因。使用了SSL/TLS协议之后,传送的应用层数据会被加密,保证了通信安全 。
SSL协议也并不安全
网络上没有绝对的安全。
当有一个中间人截获服务器发送的公钥,自己生成一对公钥私钥,将自己的公钥与服务器发送的公钥替换,浏览器无法识别出公钥已经被替换,仍然按照原来的过程,生成随机数加密发送,中间人用自己的私钥解密,再用服务器发送的公钥包装发送给服务器,神不知鬼不觉窃听数据,或者加以修改,无法察觉。
签名与证书的作用
公钥没有发言权,他不能说我是谁的公钥,如果给他加一个标签表明身份会不会解决问题呢。
这时引入一个第三方认证机构(CA),服务器将自己的信息(公钥,端口,认证机构,有效日期等等)传给CA,第三方机构也有一对公钥私钥,将传来的数据用私钥进行加密,得到一个密文,被称为签名,然后把签名数据和原始明文放在一起。发送给服务器,这就是TLS证书,之后服务器发送给浏览器的不再是公钥,而是这个证书,浏览器拿CA证书中的密钥进行解密,解密结果与里面的明文一致,即通过验证,然后从证书中提取出公钥在进行加密,双方协商出传递数据使用的密钥,如果不一致则证书不合法,将提示风险无法进入网页。
没有绝对的安全
这句话再次重复。
尽管有了第三方认证机构和签名证书的加入,仍然存在风险。
如果攻击者拦截到目标服务器的证书之后,把其中的公钥改成自己的,那么浏览器解密签名结果中的公钥部分和篡改的对不上,可能会发现风险。但是攻击者如果也去申请一个CA证书,这样签名的结果和明文部分对的上,但是显然证书中的域名和浏览器正在访问的地址又对不上,其中也有风险,尽管证书机制能够应对攻击者偷天换日的手法,但是最重要的第三方机构也可能存在风险,如果第三方机构错误的给第三方发送了一张域名和机构信息是被攻击站点,但是公钥是攻击者的证书,攻击者便再次达到了目的。这些错误可能是无意的,比如因为辨别员的失误,证书发给了错误的人。或者攻击者运用社会工程学欺骗,非法获取证书。
著名的CA机构
谷歌,微软,中国互联网网络信息中心(CNNIC), 中国金融认证中心(CFCA),
赛门铁克(Symantec),GlobalSign
内置CA认证
Windows 中的Internet属性-内容选项卡-证书
火狐浏览器的设置-隐私与安全-证书
这样就可以通过浏览器的验证
话外
当CA机构成立那一刻,就面临着被黑客攻击伪造证书的风险。当然这并不是技术问题,非技术问题才是最致命的。说到这里大家可能就猜到了,人性是最大的弱点。CA证书颁发需要机构的人来辨别,这其中必然存在风险。最著名的当属棱镜门事件了。因此不能无条件信任CA机构。
有人提出了证书透明(CT),要求CA每颁发一个证书就向一个叫日志服务的角色提交信息详情,日志服务将其记录,向CA返回一个SCT数据,CA将SCT加入证书的扩展中,将这个证书发给站点服务器,SCT也有公钥私钥再次加密,这看似是无意义的套娃操作,但是他借鉴了了区块链中的去中心化,任何中心化都是不能完全信任的,只有将其分配到每个利益体中,相互监督制约才能实现真正的安全,日志服务中采用区块链中的默克尔树来防止篡改。
底层ABCDEFGH是证书颁发的记录,篡改任何一个都会导致根哈希值的变动。所有只要保证树根不变就ok。
带有CT机制的TLS证书接近完美,但是完美就行极限,永远接近,无法到达。
第一次发稿,多多指正。