快速理解https是如何保证安全的

1.https作用

  • 混合加密
  • 身份验证: 可以通过数字证书验证对方身份
  • 验证数据完成性: 防止内容被中间人冒充或篡改

2. 基础知识

  • 数字摘要:通过hash函数对报文进行哈希,得到长度固定的字符串称谓摘要, 这个过程是单向的,无法通过摘要反推原文。

  • 数字签名:对数字摘要进行非对称加密后的密文,叫做数字签名。

  • 数字证书:可用于客户端验证服务端身份的证书,一般是由CA机构签发的。数字证书包含颁发机构、过期时间、网站域名、网站公钥、CA签名。

  • CSR:CSR是Certificate Signing Request的英文缩写,即数字证书签名请求,网站只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其【根证书私钥】对CSR内容进行【签名】,就生成了数字证书;CSR请求中包含网站生成的公钥,因此CSR必定有对用的key,也就是私钥.例如下图是在线生成CSR的工具:

快速理解https是如何保证安全的
生成结果:
快速理解https是如何保证安全的

3. https流程

  1. 网站首先需要申请域名,然后使用域名生成 CSR 和 私钥,然后向CA机构申请数字证书。

  2. 浏览器向网站发送https请求,URL中必须使用域名。

  3. 网站收到请求后,立刻响应数字证书。

  4. 浏览器收到数字证书后,在本地已授信的根证书列表中,查询数字证书中的颁发机构的根证书;如果不存在则无法验证,所以提示用户该数字证书不安全,如果存在,则使用本地根证书对数字证书进行验证,如果验证失败则提示用户该数字证书不安全。如果证书没有问题,浏览器自动生成一个随机数(对称**)对请求报文进行加密,然后再使用数字证书中的公钥对随机数进行加密,然后将【请求密文】和【随机数密文】发送给网站。

  5. 网站收到浏览器发来的密文后,首先使用私钥解密【随机数密文】得到【随机数】,然后使用随机数解密【请求报文】,此时SSL连接已建立,该连接以后的通信将一直使用该【随机数】进行对称加密。最后网站使用【随机数】加密响应报文,并发送到浏览器。

  6. 浏览器接受到响应报文后,使用【随机数】解密报文,然后使用【随机数】加密请求。

4. 数字证书验证主要过程

  1. 浏览器请求数字证书

比如访问百度收到的数字证书如下图:
快速理解https是如何保证安全的

点击URL框左边的锁即可查看证书,在证书的常规信息:

  • 颁发给: baidu.com 即数字证书中的网站域名
  • 颁发者: CA机构
  • 有效期: 即数字证书的有效期
    快速理解https是如何保证安全的
    上图示数字证书的详情,点击下方的【证书的详情信息】可以打开证书的解释,最重要的信息就是指纹和公钥了。

指纹就是证书签名,是CA对证书内容进行摘要后使用私钥加密后的签名。

公钥是网站的公钥。

  1. 浏览器查找CA根证书

浏览器安装后都会内置很多CA机构的根证书,基本涵盖全球CA机构,如谷歌浏览器中的根证书如下:
快速理解https是如何保证安全的
这些根证书实际就是CA机构自己给自己颁发的数字证书,其中的信息和颁发给网站的数字证书的格式是一样的。

浏览器根据网站数字证书中的颁发机构名称,从根证书列表中查询对用的根证书,如果不存在,则说明网站数字证书的颁发机构不受信任,不够安全,因此验证失败,如果存在则继续验证。

  1. 浏览器使用根证书中的公钥,对数字签名进行解密,如果能解密成功,说明指纹是CA机构使用私钥进行加密的,如果解密失败则说明数字签名是伪造的。解密成功后获得证书摘要。

  2. 浏览器根据摘要算法主动生成摘要,和解密数字签名得到的数字摘要进行对比,如果不一致则说明证书内容被篡改了,否则说明该数字证书的确是CA机构签发的。

  3. 浏览器比较数字证书中的域名是否和请求中的一致,如果不一致则说明该数字证书虽然的确是CA机构签发的,但并不是目标网站的数字证书。比如一个非法网站拥有CA签发的数字证书,但它截取了访问某个百度的https请求,并响应浏览器自己的证书,如果浏览器不进行域名校验,就会认为数字证书是正确的,进而整个会话被劫持。

这也是为什么https要求必须是域名,否者会话可能被劫持。如下图,当https请求中使用ip访问百度时,浏览器也会提示不安全,以避免会话被劫持:
快速理解https是如何保证安全的
快速理解https是如何保证安全的
流程图:
快速理解https是如何保证安全的
关系图:
快速理解https是如何保证安全的

5.证书链

快速理解https是如何保证安全的
快速理解https是如何保证安全的
可知百度的数字证书并不是一级CA机构签发的,而是二级CA机构签发的。