跳转至

https原理

HTTPS(HyperText Transfer Protocol Secure)是基于HTTP和SSL/TLS协议的安全通信协议,主要用于保障网络传输的安全性。它为HTTP加入了加密、认证和完整性校验,确保数据在客户端和服务器之间的传输安全。

以下是HTTPS的工作原理的详细解析:


1. HTTPS的作用

HTTPS在以下三方面增强了HTTP: 1. 数据加密:防止被窃听。 - 通过SSL/TLS协议对数据进行加密,只有通信双方可以解密。 2. 身份验证:防止被伪装。 - 使用数字证书验证服务器身份,防止中间人攻击。 3. 数据完整性:防止被篡改。 - 通过消息摘要校验数据的完整性。


2. HTTPS的工作原理

(1) HTTPS 通信流程

HTTPS的通信过程包含两个阶段:TLS握手阶段加密通信阶段

第一阶段:TLS握手
  1. 客户端问候(Client Hello)
  2. 客户端发起连接请求,发送支持的TLS版本、加密算法列表和随机数。

  3. 服务器响应(Server Hello)

  4. 服务器选择TLS版本和加密算法,并发送自己的数字证书和随机数。

  5. 证书验证

  6. 客户端验证服务器的数字证书是否合法(检查CA签名、域名、有效期等)。

  7. 密钥协商

  8. 客户端生成一个预主密钥,用服务器的公钥加密后发送给服务器。
  9. 服务器用私钥解密,得到预主密钥。
  10. 双方使用预主密钥和随机数生成对称密钥。

  11. 握手完成

  12. 双方确认使用对称密钥加密后续通信。
第二阶段:加密通信
  1. 加密数据传输
  2. 客户端和服务器使用对称密钥加密通信数据(如HTML内容、图片等)。
  3. 消息完整性校验
  4. 使用MAC(消息认证码)确保数据未被篡改。

(2) HTTPS和HTTP的关系

HTTPS 并不是一种新的协议,而是将 HTTP 的传输过程包装在 SSL/TLS 之上: - HTTP 数据会被加密后,通过 SSL/TLS 协议传输。 - 从用户的角度来看,HTTPS 和 HTTP 的使用方法基本相同,区别在于 HTTPS 数据在传输过程中是加密的。


3. HTTPS关键技术

(1) SSL/TLS协议

  • SSL/TLS 提供了加密、身份验证和数据完整性校验。
  • HTTPS 的安全性完全依赖于 SSL/TLS 协议的实现。

(2) 数字证书

数字证书由权威的认证机构(CA)签发,用于验证服务器身份。 - 包含服务器的公钥、颁发机构信息和有效期。 - 客户端通过证书链验证证书的可信性。

(3) 加密算法

  • 非对称加密:用于密钥协商(如RSA、ECDHE)。
  • 对称加密:用于加密数据传输(如AES)。
  • 哈希算法:用于数据完整性校验(如SHA-256)。

4. HTTPS的优缺点

优点

  1. 数据加密确保安全性,防止信息被窃取。
  2. 验证服务器身份,防止中间人攻击。
  3. 提高用户信任,增强隐私保护(如浏览器显示安全锁图标)。

缺点

  1. 性能开销
  2. SSL/TLS握手增加延迟。
  3. 加密和解密消耗服务器和客户端资源。
  4. 证书成本
  5. 部分CA的证书需要购买(如商业CA)。
  6. 复杂性
  7. 配置和维护HTTPS需要额外的技术支持。

5. HTTPS防护机制

(1) 防止中间人攻击

  • 使用可靠的CA签发证书,确保客户端可以信任服务器。
  • 配置HSTS(HTTP严格传输安全),强制使用HTTPS。

(2) 数据加密

  • 使用强加密算法(如AES-GCM)。
  • 定期更新SSL/TLS库,防止漏洞(如Heartbleed)。

(3) 完整性校验

  • 数据传输过程中附加MAC校验,防止数据篡改。

6. 配置HTTPS的实践

(1) 获取证书

  • 从认证机构(CA)申请证书,如Let’s Encrypt(免费证书)。
  • 确保证书与域名匹配,并定期更新。

(2) 配置Web服务器

  • 在服务器(如Apache、Nginx)中启用SSL/TLS。
  • 配置强加密算法,禁用旧版本协议(如TLS 1.0)。

(3) 优化HTTPS性能

  • 启用会话重用(Session Resumption)减少握手开销。
  • 使用HTTP/2协议提高传输效率。

7. 常见攻击与防护措施

攻击类型 描述 防护措施
中间人攻击(MITM) 攻击者伪造服务器证书,劫持通信。 使用可信CA签发证书;启用HSTS。
SSL Stripping 将HTTPS降级为HTTP,使通信变为明文。 强制启用HTTPS;配置HSTS。
漏洞利用 利用SSL/TLS实现中的漏洞(如Heartbleed)。 定期更新TLS库;禁用过时协议和算法。

客户端验证服务器证书的合法性主要通过以下步骤完成


客户端验证服务器证书的步骤

1. 验证证书的完整性

  • 客户端检查证书的数字签名。
  • 使用证书颁发机构(CA)的公钥解密证书的签名部分。
  • 将解密得到的哈希值与证书内容计算出的哈希值进行对比。
  • 一致:证明证书未被篡改,且由可信的CA签发。
  • 不一致:证书可能被篡改或伪造,验证失败。

2. 验证证书的可信链

  • 证书由多个层级组成,包括根证书、中间证书和服务器证书,形成一个证书链。
  • 客户端逐级验证:
  • 检查服务器证书的签发者是否是可信的CA或中间CA。
  • 递归检查中间证书的签发者,直到根证书。
  • 确保根证书存在于客户端的可信根证书列表中。
  • 如果证书链中任何一个证书无效(过期、不可信、链断裂等),验证失败。

3. 验证证书的有效期

  • 检查证书的有效期(Validity)字段,确保证书在当前时间内仍然有效。
  • 如果证书过期或尚未生效,验证失败。

4. 验证证书的域名

  • 检查证书中的域名(Common Name 或 Subject Alternative Name 字段)是否与客户端请求的服务器域名一致。
  • 完全匹配或符合通配符规则(如 *.example.com)。
  • 如果域名不匹配,验证失败。

5. 检查吊销状态

  • 验证证书是否被吊销(如因密钥泄露或伪造被撤销)。
  • 两种常见的吊销检查方法:
  • CRL(Certificate Revocation List,证书吊销列表)
    • 客户端下载CA发布的CRL文件,检查证书是否在列表中。
  • OCSP(Online Certificate Status Protocol,在线证书状态协议)
    • 客户端实时向CA的OCSP服务器查询证书状态。
  • 优化措施
    • 使用OCSP Stapling,由服务器提前获取并缓存OCSP响应,减少客户端与CA之间的通信延迟。

6. 检查证书的使用范围

  • 查看证书的扩展字段(Extensions),确保证书的使用范围符合预期:
  • Key Usage:定义证书可以执行的操作(如数字签名、密钥加密)。
  • Extended Key Usage:进一步限定用途(如TLS服务器身份验证)。

7. 验证证书的加密强度

  • 确保证书使用的加密算法和密钥长度足够安全。
  • 例如,RSA密钥长度应为2048位或更高。
  • 确保不使用弱算法(如MD5或SHA-1)。

客户端验证失败时的处理

如果验证过程中的任何一步失败,客户端通常会终止连接并显示错误提示,例如: - “证书不可信” - “证书已过期” - “证书与服务器域名不匹配”

现代浏览器会通过警告页面提示用户不要继续访问,但仍允许用户手动绕过(不推荐)。


例子:验证流程的实际表现

假设您访问 https://example.com,客户端的验证过程: 1. 浏览器接收 example.com 的证书。 2. 验证证书的签名,确保其未被篡改。 3. 验证证书的链条到达受信任的根CA。 4. 检查证书有效期和域名是否匹配 example.com。 5. 向OCSP服务器查询吊销状态。 6. 验证通过后,浏览器建立加密连接并显示绿色安全锁。


在客户端验证服务器证书的过程中,是否需要向外发送数据取决于验证方式和具体配置。


1. 不需要向外发送数据的情况

在多数情况下,客户端可以在本地完成部分验证步骤,例如:

(1) 验证证书链和签名

  • 客户端使用本地存储的可信根证书列表验证证书链的完整性和合法性。
  • 验证签名时,使用本地存储的根证书的公钥,无需访问外部服务器。

(2) 验证域名和有效期

  • 验证域名是否匹配服务器的证书(Common NameSubject Alternative Name)。
  • 检查证书的有效期字段是否在当前时间范围内。
  • 这些检查均可在客户端本地完成,无需外部请求。

2. 需要向外发送数据的情况

客户端在某些验证步骤中可能需要访问外部资源,例如:

(1) 检查证书吊销状态

吊销状态检查是需要访问外部服务器的主要环节。方法包括:

  • CRL(Certificate Revocation List)
  • 客户端从CA的指定URL下载CRL文件(通常包含在证书的CRL Distribution Point字段中)。
  • 检查证书是否出现在吊销列表中。
  • 由于需要访问CA服务器下载CRL文件,需向外发送请求。

  • OCSP(Online Certificate Status Protocol)

  • 客户端向CA的OCSP服务器发送查询请求,验证证书是否被吊销。
  • OCSP查询是实时的,需要客户端与外部服务器通信。

优化:OCSP Stapling - 为减少客户端外部请求,服务器可在握手中提供预先缓存的OCSP响应(OCSP Stapling)。 - 客户端使用服务器提供的响应验证证书状态,无需直接与CA通信。

(2) 检查透明度日志(Certificate Transparency,CT)

  • 某些现代浏览器(如Chrome)会验证证书是否已被记录在CT日志中。
  • 客户端可能需要访问外部的透明度日志服务器。

3. 外部请求与隐私的平衡

(1) 隐私风险

  • 如果客户端直接向CA服务器或第三方服务发送请求,可能暴露用户访问的目标网站。
  • 例如,OCSP请求包含目标证书信息,CA可能得知用户正在访问某个网站。

(2) 常见解决方案

  • OCSP Stapling:减少客户端直接与CA通信。
  • CRL缓存:客户端可以定期下载和更新CRL文件,而不是每次请求时实时查询。

4. 与DNS解析的对比

  • DNS解析:客户端向DNS服务器查询域名的IP地址。查询过程通常涉及递归查询到根服务器。
  • 证书验证:客户端仅在吊销状态检查或透明度日志检查时需要访问外部服务器,这与DNS解析类似,但查询目标是CA或透明度日志服务器,而不是DNS根服务器。

5. 具体情景下的行为

  • 普通用户浏览器访问网站
  • 浏览器通常会启用OCSP或OCSP Stapling验证。
  • 如果OCSP服务器无法访问,浏览器可能提示用户证书验证失败(部分浏览器会默认通过,降低用户体验)。

  • 离线环境

  • 客户端无法访问外部服务器(如CRL或OCSP服务器),验证会依赖本地数据(如CRL缓存或本地可信根证书列表)。
  • 可能导致吊销状态无法确认。

总结

客户端在验证服务器证书时,是否需要访问外部服务器取决于: 1. 吊销状态检查是否启用,以及使用CRL或OCSP。 2. 是否启用了OCSP Stapling或本地缓存。

通过合理配置,可以减少外部请求,提高性能,同时平衡隐私和安全性。例如,使用OCSP Stapling优化吊销验证,避免频繁向CA服务器发送请求。