https原理
为什么要用https?
因为传统的http协议在互联网上明文传送数据,你向网站提交的信息和网站回复给你的信息,比如银行卡密码,可以被中间人窃取,这个中间人可以是黑客、ISP、政府……,黑客可以黑你,ISP可以卖你的数据,政府当然是为了关心你。这些当然都是不愿意接受的。
https干什么?
所以我们需要一个加密的网络,你和网站约定好一个加密算法和一个密钥用于加解密,你向网站提交的数据和网站给你回复的数据都是只有你俩才能解密的密文,比如你在google搜索“我的猫三天不拉屎了,这正常么?”在互联网上传送的数据是“sdkjlfjweihsdjkvsdhuiy8oiudsf98dsf*@&”,ok谁截获了这段信息也不知道你说的是什么,但是网站能根据约好的加密算法和密钥解出你说的原文。这就是https干的事情。
https如何工作?
https在http和tcp/ip层中间加了一层TSL/SSL层提供加密机制。
浏览器(b)向服务器(s)发送访问请求,告诉s自己支持什么版本的ssl协议和哪些加密算法,s选择一种b支持的ss协议和加密算法(比如a1、a2、a3)并生成一套非对称加密的密钥对(publicKey和privateKey,publicKey加的密只有privateKey能解,反之亦然),把公钥(publicKey)和选择好的ssl协议版本以及加密算法(比如a2)发给b,b就用a2加密算法生成一个对称加密的密钥(symmetricKey),注意这个symmetricKey就是后续双方交换信息时加解密用的密钥,b用s的publicKey对symmetricKey进行加密后发送给s,s用自己的privateKey解出symmtricKey,这样双方都拥有了symmtricKey,传递这个symmetricKey的过程也是加密的,也就是说不会被人窃取,从此以后双方可以放心愉快的聊天了。
但是有个问题,s将publicKey发送给b的过程是未加密的,publicKey可以被中间人窃取和掉包,后续的安全性就全都跟着不复存在了。需要一个机制让b能确认这个publicKey就是s本人发给他的才行。这就引出了证书颁发机构(Certificate Authorities——CAs)
证书颁发机构(CAs)
如何判断s就是你要访问的那个s呢,通过权威机构颁发的证书。s向一些可信的权威的证书颁发机构比如赛门铁克申请证书,这个通常需要付费。s把publicKey发给b的时候也发给他自己证书来证明身份,如何鉴别证书呢?
数字签名
CAs在证书上签个名,就证明了这个证书的可信性。如何签名呢,CAs用自己的privateKey给证书的内容加密,密文作为数字签名附在证书上,任何人收到带签名的证书以后可以用CAs的publicKey解密数字签名然后和证书正文核对是否一致,privateKey只有CAs有,所以如果你可以用CAs的publicKey解开密文并且核对正文一致就证明证书是真的。你又是哪儿来的CAs的publicKey呢?终于倒到根儿了,你的浏览器内置了CAs的根证书,根证书里放着CAs的公钥。
信任链
现在梳理一下https的信任链条。浏览器里内置的CAs的证书里面的公钥证明s发给b的证书是真的不是伪造的,证书的内容证明s是本尊,然后b用s给它的公钥加密一个symmetricKey,双方用这个key加密交换信息。所以归根结底网络是不可信的,https的根本信任来自于你的操作系统安装的浏览器。
最后说说https不能干什么
- 隐藏你访问的网站,域名是用DNS发送的,不包括在https隧道里面。
- 防止你访问恶意网站,CAs只能保证你访问的真的是你要访问的网站,你要访问的就是个毒站的话https管不了。
- 匿名,你的IP地址不在密文里。
- 保证你不被黑,https只保证你在网络上传输的数据加过密,但是如果你的操作系统已经中了毒,病毒程序可以在你加密前和解密后获得真实信息。