Contents

SSL/TLS工作原理

什么是SSL/TLS?

SSL/TLS 是一种用于保护网络通信安全的加密协议。SSL是原始的加密协议,TLS是它的升级版。这个协议的核心是使用非对称加密来确保通信端点能在不可信网络下安全的传输。

什么是非对称加密?

非对称加密是一种加密算法,核心特点是数据的加密与解密使用不同的密钥,两个密钥分别称为public key和private key。用private key加密的内容,只能用public key解密;用public key加密的内容,只能用private key解密。

为什么需要非对称加密呢? 因为假如通信的双方使用对称加密——也就是加密解密使用同一个密钥。那么它们通信前需要先在网络传递这一密钥,而一旦密钥被拦截了,通信就被破解了。

而使用非对称加密时(假设是B发送加密信息给A):

  1. A发送自己的public key给B
  2. B用A的public key加密信息,把信息发送给A
  3. A用自己的private key解密

这一过程中,中间人就算拦截到A的public key和B用A的public key加密后的信息,由于它没有A的private key,也就无法解密信息,于是就没有了对称加密时密钥泄露导致信息被破解的问题。

然而中间人拿到public key还是有攻击的办法。

单纯使用非对称加密有什么隐患?

单纯使用非对称加密的问题在于public key的传递。如上图所示,中间人H如果拦截到A与B之间的通信,它可以用下列方法解密并篡改信息:

  1. A发送自己的公钥A时,H把这个公钥A拦截下来,用自己的公钥H替代并发送给B
  2. B以为这个公钥是A的,于是用公钥H加密信息并传回给A
  3. H用自己的私钥H解密这一段用自己的公钥加密的信息,对其进行查看,修改等
  4. H再用A的公钥加密B的原始信息,发回给A

可以发现,这一过程中A和B是无感的。针对这一情况,通信端点使用CA证书来确保公钥的合法性。

CA(Certificate Authority)证书

CA证书由CA签发,假如它确保的A公钥的合法性,那么这份证书里面主要带有:

  1. A的公钥
  2. 签发的CA
  3. 使用者A
  4. 签名算法、签名哈希算法
  5. 数字签名
  6. 有效日期等其他信息

对A而言,它的这份公钥需要CA的确保:于是它把公钥A发给CA,CA将公钥以及其他信息用某种hash算法,一般称作签名哈希算法指纹算法,生成hash值,一般称作指纹,然后用CA自己的私钥加密这个指纹,生成数字签名,最后在证书明文上附上这一数字签名,这份证书就可以被使用了。

对B而言,假如B想要与A通信,那么A在收到B发起通信的请求后,便会把这一份证书发给B,B对证书进行校验,便能确定里面A的公钥的合法性了。

那么,B怎么对证书进行校验呢?实际上,CA的作用便是作为一个公认的信任来源,B信任CA,于是它只要校验证书确实是CA签发的,那它就信任这一份证书,校验过程如下:

  1. 首先,由于B信任CA,所以B的系统/浏览器自带有CA的证书,证书里面有CA的公钥
  2. B拿到A的证书后,先看看使用者是不是A
  3. B使用证书里声明的CA的公钥,按照声明得签名算法解密数字签名,得到CA加密前的证书的指纹1,按照1,B自带CA的公钥
  4. B再使用证书里声明的签名哈希算法(指纹算法)用证书明文生成它的指纹2
  5. 对比指纹1与指纹2,如果相等,那么证书确实是CA签发得,那么B就信任这个公钥,后面就可以按照上文提到的非对称加密过程进行通信了
  • 图解

    /posts/ssl-certs-process/images/ssl.png

那么,中间人H是否可以拦截并伪造证书,然后发给B呢? 我们假设H拿到了证书并篡改公钥A为公钥H,那么B在拿到证书后,使用自带的CA公钥对数字签名进行解密,得出指纹1,然后使用证书声明的签名哈希算法,计算证书的哈希得出指纹2,此时由于证书内容被篡改了,指纹2将不同于指纹1,便能发现证书被篡改了。

  • 中间人H还有什么办法呢?

HTTPS全过程

HTTPS全称是HTTP over SSL,也就是通过SSL/TLS加密HTTP数据,这或许是SSL最广泛的应用。

前面提到了CA作为一个公证机构,能确保数字证书的真实性。但是在实际使用中,CA认证一般是要收费的,普通人不会去做CA认证,进而获得属于自己的数字证书。更多的是,一些大的机构,例如银行,网店,金融机构,它们去获得自己的数字证书。那这种情况如何保证网络通信的安全呢?

这些机构获取到CA授予的数字证书之后,将数字证书加到自己的web服务器上。当用户要去访问它们的网页,例如https://domain.com,会经过下图所示的步骤。

/posts/ssl-certs-process/images/webcert.png

  • 用户向web服务器发起一个安全连接的请求
  • 服务器返回经过CA认证的数字证书,证书里面包含了服务器的public key
  • 用户拿到数字证书,用自己浏览器内置的CA证书解密得到服务器的public key
  • 用户用服务器的public key加密一个用于接下来的对称加密算法的密钥,传给web服务器
    • 因为只有服务器有private key可以解密,所以不用担心中间人拦截这个加密的密钥
  • 服务器拿到这个加密的密钥,解密获取密钥,再使用对称加密算法,和用户完成接下来的网络通信
  • 后续便是服务器对用户的校验,这个通常就是账号密码来解决了,通信本身已经安全

延伸阅读

浅谈SSL/TLS工作原理

what-happens-in-a-tls-handshake

加密(对称、非对称),签名(算法),指纹和指纹算法,认证证书CA_Michaelwubo的博客-CSDN博客_证书指纹算法