最近两天在研究关于安全方面的东西,必不可少的需要了解一下 Https/SSL 的通信原理,在这里将了解的结果做个总结。

首先,SSL 的通信过程大体可以分为两个阶段:密钥交换(也有的称之为握手)和正式传输。

密钥交换/握手阶段

  1. 首先客户端像服务器发送加密连接请求

  2. 服务端接收到请求之后,给客户端发送包含 Public Key 的证书

这里之所以不直接发送 Public Key,而是将公钥放在证书中发送给客户端,是因为这样可以防止 Public Key 被篡改。只要证书是可信的,那么 Public Key 就是可信的。另外这个证书通常又叫做 X.509 证书,这个证书由 CA(Certificate Authority)颁发。

  1. 客户端校验证书的合法性。然后客户端生成一个对称加密密钥。并用服务端发送过来的 Public Key 进行加密,最后将加密过后的密钥发送给服务器端
  • 为什么要多生成一个密钥进行加密传输,而不是直接使用 Public key 进行加密?
    非对称加密,比较安全,但是加解密大量数据的时候性能不行。而对称加密性能好,但是双方密钥都一样,安全性不好。所以 SSL 采用的方法是仅使用非对称加密来加密对称加密的密钥,然后再用这个加密过的密钥加密传输数据。

  • 如何进行证书合法性校验?
    客户端,一般是浏览器,会查找计算机上面的可信证书链,确保发过来的证书是受信任的证书。

  1. 服务端用 Private Key 解密发送过来的密钥

这样双方就在一种可信任的环境下获得了加解密数据的密钥,以后所有的通信数据都通过这个密钥来进行加解密。

传输阶段

经过上面的握手阶段,双方都获得了加密密钥后,直接使用 HTTP 层的协议传输加密过后的数据即可。