HTTPS 协议

HTTPS 协议详解

HTTPS(HyperText Transfer Protocol Secure,安全超文本传输协议)是在HTTP基础上通过TLS/SSL协议加密的通信协议,确保数据在客户端和服务器之间的传输安全。

1. HTTPS 协议概述

基本概念

  • 作用:安全Web通信,保护数据机密性、完整性和身份验证
  • 端口:443(默认)
  • 协议栈:HTTP + TLS/SSL + TCP
  • 核心目标
  • 机密性:防止窃听
  • 完整性:防止篡改
  • 身份验证:验证服务器身份

HTTPS vs HTTP

特性HTTPHTTPS
加密TLS/SSL加密
认证证书验证
端口80443
性能更快稍慢(握手开销)
安全不安全安全

2. TLS/SSL 协议基础

TLS 版本演进

版本发布年份状态主要改进
SSL 2.01995已废弃基础加密
SSL 3.01996已废弃改进握手
TLS 1.01999已废弃基于SSL 3.0
TLS 1.12006已废弃改进CBC模式
TLS 1.22008常用更强密码套件
TLS 1.32018推荐1-RTT,强制前向保密

TLS 协议栈

应用层 (HTTP)
    ↓
TLS 记录协议 (Record Protocol)
    ↓
握手协议 (Handshake) + 警告协议 + 更改密码规范协议
    ↓
密码套件 (AEAD加密、对称加密、密钥交换、MAC)
    ↓
传输层 (TCP)

3. TLS 握手过程

TLS 1.2 完整握手流程

1. ClientHello
   - 支持的TLS版本
   - 支持的密码套件列表
   - 随机数(Client Random)
   - 会话ID(恢复会话)
   - 扩展(SNI、ALPN等)

2. ServerHello
   - 选择的TLS版本和密码套件
   - 随机数(Server Random)
   - 会话ID

3. Certificate
   - 服务器证书链

4. ServerKeyExchange (可选)
   - DHE/ECDHE参数交换

5. CertificateRequest (可选)
   - 客户端证书请求

6. ServerHelloDone

7. Certificate (客户端证书,可选)

8. ClientKeyExchange
   - 预主密钥加密或密钥交换参数

9. CertificateVerify (可选)
   - 客户端证书签名验证

10. ChangeCipherSpec
    - 切换到加密模式

11. Finished
    - 握手消息HMAC验证

12. ChangeCipherSpec (服务器)

13. Finished (服务器)

TLS 1.3 简化握手(1-RTT)

1. ClientHello
   - 密码套件、扩展、密钥共享

2. ServerHello
   - 选择的密码套件、证书、签名

3. 加密应用数据 (0-RTT可选)

4. 密码套件(Cipher Suites)

密码套件格式

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
└───┬───┘└──────┬──────┘└──┬──┘└──┬──┘
    │     │         │      │     └─HMAC算法
    │     │         │      └──────加密算法
    │     │         └─────────密钥交换
    │     └────────────────密钥交换证书类型
    └──────────────────────协议版本

现代推荐套件(TLS 1.3)

  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_GCM_SHA256

已废弃套件

  • RSA密钥交换(无前向保密)
  • RC4流加密
  • SHA-1哈希
  • MD5

5. 数字证书系统

X.509 证书结构

Certificate ::= SEQUENCE {
  tbsCertificate       TBSCertificate,
  signatureAlgorithm   AlgorithmIdentifier,
  signatureValue       BIT STRING
}

TBSCertificate ::= SEQUENCE {
  version           [0] Version DEFAULT v1,
  serialNumber      CertificateSerialNumber,
  signature         AlgorithmIdentifier,
  issuer            Name,
  validity          Validity,
  subject           Name,
  subjectPublicKeyInfo SubjectPublicKeyInfo,
  ...
}

证书字段

字段说明
版本X.509 v3
序列号唯一标识
签名算法SHA256WithRSA等
颁发者CA信息
有效期notBefore/notAfter
主体域名、组织信息
公钥RSA/ECDSA公钥
扩展SAN、Key Usage等

证书扩展

  • Subject Alternative Name (SAN):支持多域名
  • Key Usage:密钥用途限制
  • Extended Key Usage:扩展密钥用途
  • OCSP Stapling:证书状态查询
  • Certificate Transparency:证书透明度

6. 密钥交换机制

前向保密(PFS)

  • 静态RSA:无PFS(已废弃)
  • DHE/ECDHE:临时密钥交换,提供PFS

ECDHE(推荐)

1. 客户端生成临时ECDH密钥对
2. 发送公钥给服务器
3. 服务器生成临时ECDH密钥对
4. 服务器用私钥计算共享密钥
5. 客户端用私钥计算相同共享密钥

TLS 1.3 密钥推导

使用HKDF(HMAC-based Key Derivation Function):

Shared Secret → HKDF → 加密密钥、认证密钥

7. 证书验证流程

证书链验证

客户端信任根CA
       ↓
中间CA证书 (可选)
       ↓
服务器证书
       ↓
验证结果

验证步骤

  1. 有效期检查:证书未过期
  2. 链路完整性:完整证书链到信任根
  3. 签名验证:使用上级CA公钥验证
  4. 主体匹配:CN/SAN匹配访问域名
  5. 吊销检查:OCSP/CRL验证
  6. 密钥用法:符合扩展要求
  7. 信任存储:根CA在信任列表中

8. 证书颁发机构(CA)

根CA分类

  • 公共CA:Let’s Encrypt、DigiCert、GlobalSign
  • 私有CA:企业内部PKI
  • 自签名证书:测试环境

Let’s Encrypt(ACME协议)

# 自动获取证书
certbot certonly --standalone -d example.com

# 证书更新
certbot renew

ACME 协议流程

  1. 账户注册
  2. 证书订购
  3. 域名验证(HTTP-01/DNS-01)
  4. 证书颁发
  5. 自动续期

9. HSTS(HTTP Strict Transport Security)

配置示例

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

属性说明

  • max-age:强制HTTPS时间(秒)
  • includeSubDomains:包含子域名
  • preload:提交到HSTS预加载列表

HSTS 预加载

  • 浏览器内置信任列表
  • 硬编码,无需Set-Cookie
  • 提交:https://hstspreload.org/

10. 现代TLS配置最佳实践

推荐配置(Mozilla SSL Configuration Generator)

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;

OCSP Stapling

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/chain.pem;
resolver 8.8.8.8 8.8.4.4;

11. TLS 1.3 特性

主要改进

  • 1-RTT握手:减少往返时间
  • 0-RTT(可选):快速数据传输
  • 集成加密:握手和应用数据统一加密
  • 强制PFS:所有密钥交换提供前向保密
  • 更少密码套件:简化选择

0-RTT 风险与缓解

  • 重放攻击:攻击者可重放早期数据
  • 缓解:重要操作禁用0-RTT,服务器端检测

12. 攻击与防护

常见TLS攻击

攻击类型描述防护
中间人攻击(MITM)拦截并伪造连接证书固定、HSTS
BEASTCBC模式IV预测TLS 1.2+,AEAD加密
POODLESSL 3.0回退攻击禁用SSL 3.0
HeartbleedOpenSSL缓冲区溢出及时更新软件
LogjamDH弱参数强DH参数,ECDHE优先

防护措施

  • 证书固定(HPKP,已废弃):预定义信任公钥
  • 证书透明度(CT):公开证书日志
  • HTTP Public Key Pinning替代:使用Expect-CT
  • 定期安全扫描:Qualys SSL Labs测试

13. 性能优化

会话恢复

  • Session ID:TLS 1.2状态恢复
  • Session Tickets:加密票据,服务器无状态
  • TLS 1.3 PSK:预共享密钥

OCSP Stapling

  • 服务器缓存OCSP响应
  • 减少客户端OCSP查询
  • 提高隐私和性能

HTTP/2 + TLS

  • 消除TLS记录开销
  • 头部压缩优势
  • 服务器推送安全

14. 编程实现示例

Python 使用 ssl 模块

import ssl
import socket
from http.client import HTTPSConnection

# 创建SSL上下文
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
context.check_hostname = True
context.verify_mode = ssl.CERT_REQUIRED

# HTTPS连接
conn = HTTPSConnection("example.com", context=context)
conn.request("GET", "/")
response = conn.getresponse()
print(response.read())
conn.close()

Node.js HTTPS服务器

const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('server.key'),
  cert: fs.readFileSync('server.crt'),
  ca: fs.readFileSync('ca.crt'), // 证书链
  requestCert: false,
  rejectUnauthorized: true
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('Hello HTTPS');
}).listen(443);

15. 调试和工具

证书调试工具

# 查看证书信息
openssl x509 -in cert.pem -text -noout

# 验证证书链
openssl verify -CAfile ca.pem server.pem

# TLS连接测试
openssl s_client -connect example.com:443 -servername example.com

# 检查密码套件
nmap --script ssl-enum-ciphers -p 443 example.com

在线测试工具

  • SSL Labs:https://www.ssllabs.com/ssltest/
  • Security Headers:安全头部检查
  • Observatory:Mozilla安全配置评分

常见问题诊断

  • 证书不受信任:检查根CA、链完整性
  • SNI问题:虚拟主机配置
  • 密码套件不匹配:客户端/服务器支持差异
  • OCSP失败:网络问题或CA服务故障

HTTPS 通过TLS/SSL协议为Web通信提供了强大的安全保障。现代HTTPS部署结合TLS 1.3、HSTS、OCSP Stapling等技术,实现了高效、安全的加密通信,是构建现代Web应用的基础。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注