HTTPS 协议详解
HTTPS(HyperText Transfer Protocol Secure,安全超文本传输协议)是在HTTP基础上通过TLS/SSL协议加密的通信协议,确保数据在客户端和服务器之间的传输安全。
1. HTTPS 协议概述
基本概念
- 作用:安全Web通信,保护数据机密性、完整性和身份验证
- 端口:443(默认)
- 协议栈:HTTP + TLS/SSL + TCP
- 核心目标:
- 机密性:防止窃听
- 完整性:防止篡改
- 身份验证:验证服务器身份
HTTPS vs HTTP
特性 | HTTP | HTTPS |
---|
加密 | 无 | TLS/SSL加密 |
认证 | 无 | 证书验证 |
端口 | 80 | 443 |
性能 | 更快 | 稍慢(握手开销) |
安全 | 不安全 | 安全 |
2. TLS/SSL 协议基础
TLS 版本演进
版本 | 发布年份 | 状态 | 主要改进 |
---|
SSL 2.0 | 1995 | 已废弃 | 基础加密 |
SSL 3.0 | 1996 | 已废弃 | 改进握手 |
TLS 1.0 | 1999 | 已废弃 | 基于SSL 3.0 |
TLS 1.1 | 2006 | 已废弃 | 改进CBC模式 |
TLS 1.2 | 2008 | 常用 | 更强密码套件 |
TLS 1.3 | 2018 | 推荐 | 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证书 (可选)
↓
服务器证书
↓
验证结果
验证步骤
- 有效期检查:证书未过期
- 链路完整性:完整证书链到信任根
- 签名验证:使用上级CA公钥验证
- 主体匹配:CN/SAN匹配访问域名
- 吊销检查:OCSP/CRL验证
- 密钥用法:符合扩展要求
- 信任存储:根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 协议流程
- 账户注册
- 证书订购
- 域名验证(HTTP-01/DNS-01)
- 证书颁发
- 自动续期
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 |
BEAST | CBC模式IV预测 | TLS 1.2+,AEAD加密 |
POODLE | SSL 3.0回退攻击 | 禁用SSL 3.0 |
Heartbleed | OpenSSL缓冲区溢出 | 及时更新软件 |
Logjam | DH弱参数 | 强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
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应用的基础。