HTTPS简介

一. 什么是HTTPS?

HTTPS 是运行在 TLS/SSL 之上的 HTTP,与普通的 HTTP 相比,在数据传输的安全性上有很大的提升。




二. SSL协议的握手过程

握手过程分成五步:

  1. 客户端给出协议版本号、客户端生成的随机数(假如叫 R1),以及客户端支持的加密算法。
  2. 服务端确认双方使用的加密方法,并给出数字证书(该证书中包含了服务端的公钥)及服务端生成的随机数(假如叫 R2)。
  3. 客户端确认数字证书的有效性,然后生成一个新的随机数(假如叫 R3),并使用数字证书中的公钥加密 R3 并发给服务端。
  4. 服务端使用自己的私钥解密出客户端发来的随机数 R3
  5. 客户端与服务端根据约定的加密方法,使用前面的三个随机数生成“对话密钥“,然后用该密钥来加密接下来的整个对话过程。


注意:

  • 生成对话密钥一共需要三个随机数,前两个随机数都是明文,仅第三个随机数被加密过,所以握手之后的通话安全,只取决于第三个随机数能不能被破解。
  • 服务端的公钥和私钥,只用于加密和解密第三个随机数(非堆成加密)
  • “对话密钥”用于加密握手之后的对话(堆成加密)


疑问:随机数为什么要三个?只用最后一个随机数 R3 不行么?

说明:这是SSL/TLS的设计,它假设服务器不相信所有的客户端都能够提供完全随机数(假如某个客户端提供的随机数不随机的话,就大大增加了“对话密钥”被破解的风险),所以由三组随机数组成最后的随机数,保证了随机数的随机性,以此来保证每次生成的“对话密钥”安全性。




三. 数字证书

什么是数字证书

数字证书是一个电子文档,其中包含了持有者的信息、公钥及证明该证书有效的数字签名,它一般由数字证书认证机构(CA,其组织结构是一个树型结构)来负责签发和管理,它的类型有很多,HTTPS使用的是SSL证书。


数字证书的签发过程

  1. CA在接收到申请者的资料(持有者信息、公钥、私钥)后,进行核对并确定信息的真实有效
  2. CA通过 SHA-256 哈希得到证书内容的摘要,然后用自己的私钥给这份摘要加密,得到数字签名。
  3. 分别生成包含公钥和私钥的两个证书


数字证书的验证过程

  1. 接收端接到一份数字证书C1后,对该证书的内容进行 SHA-256 哈希,得到摘要H1。
  2. 从C1的颁发者的数字证书中找到公钥,然后使用该公钥对C1上的数字签名进行解密,得到摘要H2。
  3. 对比H1和H2,如果相等,则表示证书没有被篡改。
  4. 沿着C1的证书链,逐级向上验证证书合法性,直到根CA(注:根CA是自验证的,合法的根CA会被操作系统加入到权威信任CA列表中,信任根CA就表示信任所有根CA下所有子级CA所签发的证书)。

注:iOS中,证书是否有效的标准是“信任链中如果只含有有效证书并且以可信锚点结尾”,这里的可信锚点通常是包括在系统中的CA根证书,不过在验证证书链时,也可以设置自定义的证书作为可信的锚点。