一、HTTPS 简介
HTTPS 全称 HTTP over TLS/SSL(TLS 就是 SSL 的新版本 3.1)。TLS/SSL 是在传输层上层的协议,应用层的下层,作为一个安全层而存在,翻译过来一般叫做传输层安全协议。对 HTTP 而言,安全传输层是透明不可见的,应用层仅仅当做使用普通的 Socket 一样使用 SSLSocket 。TLS 是基于 X.509 认证,他假定所有的数字证书都是由一个层次化的数字证书认证机构发出,即 CA。另外值得一提的是 TLS 是独立于 HTTP 的,使用了 RSA 非对称加密,对称加密以及 HASH 算法,任何应用层的协议都可以基于 TLS 建立安全的传输通道,如 SSH 协议。
代入场景:假设现在 A 要与远端的 B 建立安全的连接进行通信。
- 直接使用对称加密通信,那么密钥无法安全的送给 B 。
- 直接使用非对称加密,B 使用 A 的公钥加密,A 使用私钥解密。但是因为 B 无法确保拿到的公钥就是 A 的公钥,因此也不能防止中间人攻击。
为了解决上述问题,引入了一个第三方,也就是上面所说的 CA(Certificate Authority):
CA 用自己的私钥签发数字证书,数字证书中包含 A 的公钥。然后 B 可以用 CA 的根证书中的公钥来解密 CA 签发的证书,从而拿到 A 的公钥。那么又引入了一个问题,如何保证 CA 的公钥是合法的呢?答案就是现代主流的浏览器会内置 CA 的证书。
中间证书:
现在大多数 CA 不直接签署服务器证书,而是签署中间 CA,然后用中间 CA 来签署服务器证书。这样根证书可以离线存储来确保安全,即使中间证书出了问题,可以用根证书重新签署中间证书。另一个原因是为了支持一些很古老的浏览器,有些根证书本身,也会被另外一个很古老的根证书签名,这样根据浏览器的版本,可能会看到三层或者是四层的证书链结构,如果能看到四层的证书链结构,则说明浏览器的版本很老,只能通过最早的根证书来识别
校验过程
那么实际上,在 HTTPS 握手开始后,服务器会把整个证书链发送到客户端,给客户端做校验。校验的过程是要找到这样一条证书链,链中每个相邻节点,上级的公钥可以校验通过下级的证书,链的根节点是设备信任的锚点或者根节点可以被锚点校验。那么锚点对于浏览器而言就是内置的根证书啦(注:根节点并不一定是根证书)。校验通过后,视情况校验客户端,以及确定加密套件和用非对称密钥来交换对称密钥。从而建立了一条安全的信道。