https
协议的诞生,是为了解决http
传输信息不安全的问题。https
不是一个独立于http
的协议,而是基于http
协议,套了一层TLS
协议的外壳,TLS
的前身是更为人熟知的SSL
协议,与1999年被推出1.0版本并正式替代当时的SSL3.0
。
我们平时使用的大部分网站都已经升级为https
了,大家都知道https
更安全(网站前面会出现一把小锁),但是他为什么安全呢,他的安全是绝对安全吗,有没有可能仍然存在信息泄露?
下面,让我们一起走进HTTPS
的内心世界。对网站的请求进行抓包,这里看到的是TLS1.2
,有时也叫作SSL3.2
:
可以发现,访问https
服务器时,客户端会发送Client Hello报文开始与服务器通信(TCP连接之后),打开报文详情,可以知道本地发送的内容主要是客户端自身所支持的加密算法以及一个随机数。
服务器在收到客户端发送的消息后,会返回一个Server Hello报文,其中包含了一个随机数以及服务器选择的通信加密组件(这个组件肯定在客户端支持的组件中),注意Cipher Suite这个字段,密钥交换算法,他选择了ECDHE
,加密算法选择AES
,创建报文摘要的算法选择了SHA256
。
紧接着,服务器端会向客户端发送证书,如下图所示:第一个证书是网站的证书,第二个证书,则是网站证书颁发机构的证书。
此时服务器端发送给客户端的还有一个Server key exchange
,值得注意的是,因为之前已经收到了证书,如果使用RSA
来进行握手,是可以证明服务端是否有证书对应的私钥的,客户端只需要发送公钥加密的密钥即可,与使用RSA
实现握手不同,ECDHE
方式,证书对应的私钥并不会参与密钥的协商,所以,为了证明服务器拥有证书,需要进行签名操作。由此也可以得出使用RSA
实现握手,是不需要发送Server key exchange报文的。
通过上图可知,使用EC Diffie-Hellman
密钥交换算法,并且发送了DH算法的协商公钥给到客户端,随后发送Server Hello Done报文。
来而不往非礼也。客户端通过签名验证了服务端身份后,会发送EC Diffie-Hellman
算法的协商公钥给服务器,紧接着客户端发送Change Cipher Spec报文,表示后面传送的数据将采用新的加解密参数,然后发送发送加密了的握手信息让服务器验证,此时服务器收到信息后,如果能够正确解析客户端发送的握手信息,就表明客户端是之前自己联系的那台机器,信任危机解除。
服务端确认了客户端身份后,同样发送Change Cipher Spec报文,要求采用新的加解密参数,同样发送加密的握手信息给客户端,客户端收到信息后,如果能够正常解析加密的握手信息,此时就表明客户端和服务端之间已经建立了安全的连接。
此时,客户端和服务端就可以正常发送消息了。由下图可以看出,双方发送的消息已经进行了对称加密,此时的数据无论是被截获还是窃听,也完全不用担心信息的安全了。
值得注意的是,上述请求中,Certificate, Server Key Exchange, Server Hello Done
是被封装到一条报文里面的,有些网站(比如百度)将Certificate
单独列为报文,如果之前建立过连接并获取过Certificate
,短期内他是不会重新发给你的,这也是目前比较流行的做法(只能说找到一个这么容器捕捉https
全过程的网站还是很困难的)。
上述内容看似行云流水,但是在客户端与服务端最初交互时就存在一个问题!客户端如何知道第一次向他返回server hello的是他想要通信的服务器呢?因为证书是可以自行制作的,只不过自己制作的证书是没有公信力的。我们来看一下契约锁网站的证书:
通常一个证书会包含他覆盖的域名,证书的用途,签发的起止时间,域名方的公钥等信息。细心地小伙伴会发现,上述服务器返回Cercificate
是返回了两个,域名方需要一个具有公信力的机构来验明正身。那么此时又有一个问题,契约锁证书的颁发者GeoTrust
,难道就因为你叫Trust
就代表你可信吗?好问题,当然不是!
当我们尝试去验证GeoTrust
是否可信时,我们会去当前客户端中查找是否已经安装了该证书,如果已安装,表示可信任。
如果本机没有安装呢?浏览器会继续寻找该证书的签发方,然后递归检查签发方的证书是否本机安装,直到找到根证书。根证书的提供方在全球屈指可数,他不需要其他机构为他签名,可以理解为信任的来源。这样一来就形成了信任链。
说到这里,一个https
网站现阶段可信度还是非常高的,他的可信任特性,由操作系统的供应商(Windows, MacOS)、中间证书的颁发机构以及根证书机构一同担保,值得信赖。通过上述的学习,这里也有一个问题希望大家可以思考一下,如果不法分子在我们的个人电脑中安装了他的根证书,会有什么后果?
上面说到,根证书是不需要其他机构签名的,如此一来,不法分子可以冒充任何网站来和你通信交互,风险极大。由此可知,在我们安装盗版系统的时候,是不是要慎之又慎呢?
以上。