HTTPS建立过程相当复杂,下图为示意图,可以有整体认识,一般我们编程知道这些已足够。
准备工作(对应图中prepare1234) 可以看到,在客户端向服务器发起请求前,还有一些准备工作要做,或者说是有一些工作已经做好了。
发起链接 https使用的是443端口,而http使用的是80端口 TCP端口号是一个2字节的整型,处于TCP报文段的前四个字节(2字节源端口号,2字节目的端口号)。 很明显范围是0~65535。其中0~1023具有特殊意义,已经被绑定,比如上面说的443,80,还有ftp的21端口。从1024~49151也具有特殊含义,但是还没有被用完,比如8080端口重定向。剩下的我们就可以随便使用,自定义了。
下面的过程为具体详细一点的过程,如果不想看,可以完全只看示意图即可,对我们平时开发用处并不大。或者你在用wireshark类似的抓包工具时看的抓狂不认识,可以看看(反正我用Charles抓包): 1 、客户端发起请求(对应图中1) 同样需要三次握手,建立TCP连接(毫无疑问HTTPS也是基于TCP的) 2 、客户端发送Client Hello包(对应图中2)
里面有1970年1月1日到现在的秒数,后面还有一个客户端发来的随机数Client.random
如果客户端与服务器费尽周折建立了一个HTTPS链接,刚建完就断了,也太可惜,所以用Session ID将其保存,如果下次再来可以直接使用之前的链接进行对话(对称密钥)。
告诉服务器,自己支持的加密算法种类
3、 Server Hello(对应图中2)
4、 Certificate(对应图中2) 服务器终于发来我们想要的数字证书,包含了:签发机构、过期时间、主题名称、公共密钥信息、指纹信息等等
5、 Server Hello Done(对应图中2) 服务器发送结束 6、 客户端验证(对应图中3) 客户端从内置的CA根证书获取C.pub,对服务器发送来的数字证书进行验签,如果一致,说明证书是CA颁发的(前提是C.pub是真实的,确实是CA机构的公钥)。然后看看证书是否过期,域名是否匹配 7、 生成对称密钥(对应图中4、5、6) 客户端根据之前的:Client.random + sever.random + pre-master生成对称密钥 经过S.pub加密发送给服务器,之后即可通过对称密钥进行通讯。(就是之前我们熟悉的http) 最后 在整个过程中,一共涉及2对公私密钥对,一对由服务器产生,主要用于加密,一对由CA产生,主要用于签名。 为什么要多一个CA呢? 假设没有CA,那么如果服务器返回的包含公钥的包被hack截取,然后hack也生成一对公私钥,他将自己的公钥发给客户端。hack得到客户端数据后,解密,然后再通过服务器的公钥加密发给服务器,这样数据就被hack获取。 有了CA后,客户端根据内置的CA根证书,很容易识别出hack的公钥不合法,或者说hack的证书不合法。 |
| 本文出处: http://www.toutiao.com/a6428218984839381249/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|