HTTPS详解

HTTP介绍: HTTP详解

HTTPS简介

HTTPS出现的目的就是为了弥补HTTP的缺陷, HTTP有哪些缺陷呢?

  • 通信使用明文(不加密), 内容可能会被窃听
  • 不验证通信方的身份, 因此有可能遭遇伪装
  • 无法证明报文的完整性, 所以有可能已遭篡改

HTTPS采用SSL协议(Secure Socket Layer)解决了HTTP的上述缺陷, SSL协议的安全机制如下:

  • 数据加密传输
  • 身份认证机制
  • 报文完整性检查

HTTPS 只对报文主体加密.

SSL的原理

数据加密传输

首先介绍两种加密方式, 共享密钥加密和公开密钥加密, SSL采用的是两者并用的混合加密机制.

(1)共享密钥加密

加密和解密同用一个密钥的方式称为共享密钥加密(Common keycrypto system), 也被叫做对称密钥加密. 但共享密钥加密存在的问题是如何把密钥安全地转交给对方.

(2)公开密钥加密

公开密钥加密使用一对非对称的密钥. 一把叫做私有密钥(private key), 另一把叫做公开密钥(public key). 顾名思义, 私有密钥不能让其他任何人知道, 而公开密钥则可以随意发布, 任何人都可以获得. 使用公开密钥加密方式, 发送密文的一方使用对方的公开密钥进行加密处理, 对方收到被加密的信息后, 再使用自己的私有密钥进行解密. 利用这种方式, 不需要发送用来解密的私有密钥, 也不必担心密钥被攻击者窃听而盗走.

(3)混合加密机制

公开密钥加密的性能是要低于共享密钥加密的, 所以 SSL 充分利用两者各自的优势, 采用共享密钥加密和公开密钥加密两者并用的混合加密机制, 通过公开密钥加密方式来转交共享密钥, 然后在报文通信阶段使用共享密钥加密方式.

身份认证机制

所有使用HTTPS的服务器都必须到数字证书认证机构(Certificate Authority)申请数字证书, 证书包含服务器的公钥, 服务器域名, 证书发行机构, 数字签名等信息.

数字签名: 即CA使用自己的私钥对数字证书里的其他内容进行加密后得出的加密串

客户端认证服务器身份的过程:

  • 客户端向服务器发送HTTPS请求.
  • 服务器返回自己的数字证书给客户端.
  • 客户端(浏览器)的"证书管理器"中有一个"受信任的根证书颁发机构"列表, 客户端从中查询对应的CA公钥.
  • 如果客户端没有查询对应的CA公钥, 则会发出警告(这说明证书有问题).
  • 使用CA公钥来解密数字签名, 然后与数字证书里的其他内容进行对比, 如果相同则证明了数字证书的真实性.
  • 客户端判断数字证书里的服务器域名与自己请求的域名是否相同, 如果相同则验证了服务器的身份.

报文完整性检查

SSL使用数据摘要算法(SHA的MAC算法)来检查报文的完整性. 数据摘要算法可以将任意长度的数据转换为固定长度的数据, 它是一种单向散列函数, 即不可能反向推导出原始数据.

报文完整性检查的过程:

  • 服务器使用共享密钥将响应正文加密后得到SIGN值.
  • 服务器对响应正文使用数据摘要算法生成MAC-1值.
  • 服务器将SIGN和MAC-1返回给客户端.
  • 客户端使用共享密钥将SIGN解密后得到响应正文.
  • 客户端对响应正文使用数据摘要算法生成MAC-2值
  • 客户端对比MAC-1和MAC-2, 如果相同则报文完整.

HTTPS工作的完整流程

读到这里我们脑海里会有一个疑问, 那就是如何安全的将服务器的共享密钥转交给客户端? HTTPS工作的完整流程就可以解答我们的疑问:

  • 服务器的运营人员向CA申请数字证书.
  • 客户端发送请求到服务器时, 服务器返回数字证书.
  • 客户端(浏览器)的"证书管理器"中有一个"受信任的根证书颁发机构"列表, 客户端从中查询对应的CA公钥.
  • 客户端验证数字证书的真实性, 即使用CA公钥来解密数字签名, 然后与数字证书里的其他内容进行对比.
  • 此时, 客户端就安全地获取到了服务器的公钥.
  • 服务器通过公开密钥加密方式转交给客户端共享密钥.
  • 最后, 客户端与服务器之间使用共享密钥加密报文进行通信.

如果浏览器里的CA公钥被篡改, 那就无法保证整个过程的安全性了, 所以我们要去官网下载浏览器, 不要去下载那种未知的第三方浏览器.

你可能感兴趣的:(JavaWeb笔记)