HTTPS握手过程

121 阅读3分钟

握手过程

  • client hello:客户端通过发送client hello消息向服务器发起握手请求,该消息包含了客户端所支持的 TLS 版本和密码组合以供服务器进行选择,还有一个client random随机字符串
  • server hello:服务器发送server hello消息对客户端进行回应,该消息包含了数字证书,服务器选择的密码组合和server random随机字符串
  • 验证证书合法性:客户端对服务器发来的证书进行验证,确保对方的合法身份,验证过程可以细化为以下几个步骤:
    1. 检查数字签名
    2. 验证证书链
    3. 检查证书的有效期
    4. 检查证书的撤回状态
  • premaster secret字符串: 客户端向服务器发送另一个随机字符串premaster secret(预主密钥),这个字符串是经过服务器的公钥加密过的,只有对应的私钥才能解密
  • 使用私钥:服务器使用私钥解密premaster secret
  • 生成共享密钥:客户端和服务器均使用client randomserver randompremaster secret,并通过相同的算法生成相同的共享密钥KEY,用于后续通信时进行对称加密
  • 客户端就绪:客户端发送经过共享密钥 KEY加密过的finished信号
  • 服务器就绪:服务器发送经过共享密钥KEY加密过的finished信号
  • 达成安全通信:握手完成,双方使用对称加密进行安全通信

如何验证证书合法性?

数字证书和 CA 机构

在说校验数字证书是否可信的过程前,我们先来看看数字证书是什么,一个数字证书通常包含了:

  • 公钥;
  • 持有者信息;
  • 证书认证机构(CA)的信息;
  • CA 对这份文件的数字签名及使用的算法;
  • 证书有效期;
  • 还有一些其他额外信息;

数字证书的作用,是用来认证公钥持有者的身份,以防止第三方进行冒充。说简单些,证书就是用来告诉客户端,该服务端是否是合法的,因为只有证书合法,才代表服务端身份是可信的。

为了让服务端的公钥被大家信任,服务端的证书都是由 CA (Certificate Authority,证书认证机构)签名的,CA 就是网络世界里的公安局、公证中心,具有极高的可信度,所以由它来给各个公钥签名,信任的一方签发的证书,那必然证书也是被信任的。

之所以要签名,是因为签名的作用可以避免中间人在获取证书时对证书内容的篡改。

数字证书签发和验证流程

如下图图所示,为数字证书签发和验证流程:

image.png

CA 签发证书的过程

如上图左边部分:

  • 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值;
  • 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;
  • 最后将 Certificate Signature 添加在文件证书上,形成数字证书;

客户端校验服务端的数字证书的过程

如上图右边部分:

  • 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
  • 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 H2 ;
  • 最后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。