# HTTPS

HTTPS就是HTTP的加密版本。通常使用SSL(第三方证书)或者TLS(安全传输层协议)来实现,目前使用比较多的是SSL。
可以简单的理解为:使用HTTP就像是两个人明文写信,信的内容很可能被人给看到。使用HTTPS就像把信放在保险箱中,然后再把保险箱交给收信人,而密码只有你们两个人知道(真实的HTTPS使用非对称加密)。 维基百科 介绍 (opens new window)

# HTTPS加密流程

HTTPS协议默认端口443

  1. 客户端:返回支持的算法列表一个随机数给服务端(随机数用作后续生成MAC密钥)
  2. 服务端:返回SSL证书一个随机数给客户端(随机数用作后续生成MAC密钥)
  3. 客户端获取证书中的公钥、生成一个pre_master_secret随机密码串(使用证书中的公钥对其进行加密),然后将加密后的pre_master_secret返回给服务器
  4. 客户端和服务端:根据 pre_master_secret客户端随机数服务端随机数用同样的规则计算出MAC密钥(后续对话使用这个MAC密钥进行对称加密数据传输),握手过程就结束了

https握手图示

# SSL证书包含什么?

  1. 证书的发布机构CA
  2. 证书的有效期
  3. 公钥(这里的公钥被证书颁发机构的私钥加密过)
  4. 证书所有者
  5. 签名
  6. 其它

# 获取SSL证书中的公用密钥的过程

  1. 验证CA机构合法

    • 客户端接收到证书后,根据证书中记录的机构,从操作系统中取出内置在系统中对应的机构,验证机构是否合法
  2. 解密数据

    • 根据证书的CA机构,从本地OS中取出对应的CA公钥(证书里的信息被CA私钥加密)
    • 用CA公钥,对证书里的签名解密,得出hashA(签名其实就是CA把证书通过hash函数计算出的hash值,用来判断证书有没有被中间篡改过)
    • 客户端用约定的hash算法根据证书的内容得出一个hashB
  3. 验证数据是否被篡改

    • hashA与hashB对比,结果一致,则证明数据有效(没有被中间篡改过)
  4. 获取公钥

    • 获取证书中的服务器公钥,用于后续生成对称加密密钥