闲谈HTTPS工作流程

准备工作

对应图中prepare1-4,在客户端向服务器发起请求前,还有一些准备工作要做。

  • 从CA证书颁发机构,获取数字证书。
  • 服务器:生成一对公私钥S.pub,S.pri,私钥自己保留,用于解密和签名,不能外泄。将公钥S.pub,身份信息,传给CA(Certificate Authority)机构;
  • CA机构:也有公私钥C.pub,C.pri;由S.pub,身份信息另外附加CA签名生成数字证书(签名使用C.pri进行签名)
  • 将数字证书颁发给申请者(服务器)
  • 客户端(比如我们经常使用的浏览器),为了安全性,会内置一份CA根证书,它包含C.pri,用于对数字证书验证

发起链接

https使用的是443端口,而http使用的是80端口

TCP端口号是一个2字节的整型,处于TCP报文段的前四个字节(2字节源端口号,2字节目的端口号)。

客户端发起请求(对应图中1)

同样需要三次握手,建立TCP连接(毫无疑问HTTPS也是基于TCP的)

客户端发送Client Hello包(对应图中2)

  • 随机数:里面有1970年1月1日到现在的秒数,后面还有一个客户端发来的随机数Client.random
  • Session ID:如果客户端与服务器费尽周折建立了一个HTTPS链接,刚建完就断了,也太可惜,所以用Session ID将其保存,如果下次再来可以直接使用之前的链接进行对话(对称**)。
  • 密文族:告诉服务器,自己支持的加密算法种类
  • Server_name

Server Hello(对应图中2)

  • 随机数:对应服务器时间,服务器sever.random
  • Seesion ID,如果客户端发给服务器的session ID在服务端有缓存,服务端会尝试使用这个session;否则服务器会启用新的并返回给客户端;
  • 服务器挑选一个密文族

Certificate(对应图中2)

服务器终于发来我们想要的数字证书,包含了:签发机构、过期时间、主题名称、公共**信息、指纹信息等等

Server Hello Done(对应图中2)

服务器发送结束

客户端验证(对应图中3)

客户端从内置的CA根证书获取C.pub,对服务器发送来的数字证书进行验签,如果一致,说明证书是CA颁发的(前提是C.pub是真实的,确实是CA机构的公钥)。然后看看证书是否过期,域名是否匹配

生成对称**(对应图中4、5、6)

客户端根据之前的:Client.random + sever.random + pre-master生成对称**

经过S.pub加密发送给服务器,之后即可通过对称**进行通讯。(就是之前我们熟悉的http)

最后

在整个过程中,一共涉及2对公私**对,一对由服务器产生,主要用于加密,一对由CA产生,主要用于签名。

为什么要多一个CA?

假设没有CA,那么如果服务器返回的包含公钥的包被hack截取,然后hack也生成一对公私钥,他将自己的公钥发给客户端。hack得到客户端数据后,解密,然后再通过服务器的公钥加密发给服务器,这样数据就被hack获取。

有了CA后,客户端根据内置的CA根证书,很容易识别出hack的公钥不合法,或者说hack的证书不合法。

相关文章: