HTTPS 技术文档
适用对象:网络/后端/安全工程师。文档涵盖 HTTPS 概述、加密原理、证书体系、TLS 握手、配置示例与常见问题,并引用相关 RFC。
目录
- [HTTPS 概述](#HTTPS 概述)
- 加密技术原理
- 数字证书体系
- [SSL/TLS 握手过程](#SSL/TLS 握手过程)
- [TLS 1.3 完整握手](#TLS 1.3 完整握手)
- [TLS 1.2 完整握手](#TLS 1.2 完整握手)
- 配置示例
- 常见问题与排查
- 术语表
- [RFC 与参考资料](#RFC 与参考资料)
HTTPS 概述
- 定义:HTTPS(Hypertext Transfer Protocol Secure)是在 HTTP 之上叠加 TLS/SSL 的安全扩展版本,通过加密、完整性校验与身份认证保护应用层通信。
- 分层位置:TLS 位于传输层(TCP)与应用层(HTTP)之间;典型端口
443。 - HTTP vs HTTPS 对比:
- 加密:HTTP 明文传输;HTTPS 使用对称加密(AES/ChaCha20)保护内容。
- 完整性:HTTP 易被篡改;HTTPS 使用 AEAD(如 AES-GCM/ChaCha20-Poly1305)与序列号确保完整性。
- 身份认证:HTTPS 通过服务器证书建立对站点的信任,支持双向认证(可选客户端证书)。
- 协议扩展:ALPN 协商应用协议(HTTP/2、HTTP/1.1),HSTS 强制全站使用 HTTPS,SNI 支持同 IP 多证书。
- 性能影响:握手增加往返;TLS 1.3 与会话复用/0-RTT 显著降低延迟。
加密技术原理
- 对称加密(如 AES):同一密钥用于加/解密;HTTPS 采用 AEAD 模式(AES-GCM/ChaCha20-Poly1305)提供机密性与完整性。
- 非对称加密(RSA/ECDSA):使用公钥/私钥对;在 HTTPS 中用于签名验证与密钥交换(TLS 1.2 可使用 RSA 密钥交换;TLS 1.3 移除 RSA 密钥交换,仅使用(EC)DHE)。
- 混合加密体系:
- 握手阶段使用非对称与密钥协商(DHE/ECDHE/PSK)建立会话密钥。
- 数据传输阶段使用高效对称加密保护记录层数据。
- 密钥交换:
- TLS 1.2:支持
RSA、DHE、ECDHE;前向保密(PFS)依赖DHE/ECDHE。 - TLS 1.3:仅
ECDHE/DHE与PSK(会话票或外部 PSK);移除静态 RSA/DH。
- TLS 1.2:支持
- 密钥派生:
- TLS 1.2:
master_secret = PRF(pre_master_secret, ClientRandom||ServerRandom)并派生读写密钥与 IV。 - TLS 1.3:基于 HKDF(RFC 5869)进行
early_secret、handshake_secret、master_secret逐步派生,提供更强的密钥分离与前向保密。
- TLS 1.2:
数字证书体系
- 信任链:根 CA(受操作系统/浏览器信任)→ 中间 CA → 服务器证书。客户端根据信任存储验证整条链的签名与约束。
- 关键字段(X.509,RFC 5280):
Subject/Issuer:主体与签发者;Serial Number:证书序列号。Subject Alternative Name (SAN):域名/IP 绑定(现代浏览器以 SAN 为准)。Public Key/Signature Algorithm:公钥与签名算法(RSA/ECDSA)。Validity:Not Before/Not After有效期;时间漂移会导致验证失败。Key Usage/Extended Key Usage (EKU):密钥用途(digitalSignature、keyEncipherment等)与扩展用途(serverAuth/clientAuth)。Basic Constraints:CA 标识与路径长度约束。
- 证书验证流程:
- 构建证书链:服务器证书 + 中间证书(可由服务器发送/OCSP/缓存补全)。
- 路径验证:逐级验证签名与约束,检查根 CA 是否在信任存储中。
- 名称校验:使用 SAN 字段匹配访问域名(支持通配符规则)。
- 有效期与撤销:检查时间有效性;通过 CRL/OCSP(RFC 6960)验证撤销状态;启用 OCSP Stapling 可提升性能与可靠性。
- 可选客户端认证:服务器请求客户端证书并验证链/用途后建立双向认证。
SSL/TLS 握手过程
TLS 1.3 完整握手
- 特性:握手消息更少、默认前向保密、支持 0-RTT(仅在安全评估通过情况下使用)。
- 时序(Mermaid):
Client Server ClientHello (supported_versions, key_share, SNI, ALPN) ServerHello (key_share) 派生 handshake_secret (HKDF) EncryptedExtensions Certificate / CertificateVerify Finished 验证证书与握手完整性 Finished 派生 master_secret Application Data (加密) Client Server
- 状态转换:
Initial→Handshake(密钥派生)→Authenticated→Secure(应用数据)。 - 会话复用:
NewSessionTicket生成 PSK;后续 1-RTT 或 0-RTT 握手减少延迟。
TLS 1.2 完整握手
- 时序(Mermaid):
Client Server ClientHello (版本、随机数、cipher suites、SNI、ALPN) ServerHello (选择套件) Certificate ServerKeyExchange (DHE/ECDHE) ServerHelloDone ClientKeyExchange [可选] Certificate / CertificateVerify ChangeCipherSpec / Finished ChangeCipherSpec / Finished Application Data (加密) Client Server
- 状态转换:
Initial→Negotiated→KeyExchange→Secure。 - 密钥计算:
pre_master_secret(RSA 或(EC)DHE)→master_secret(PRF)→ 派生读写密钥与 IV。
配置示例
Nginx(TLS 1.2/1.3,HTTP/2,HSTS,OCSP Stapling)
nginx
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
# TLS 1.2 套件;TLS 1.3 套件由 OpenSSL 默认控制
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
# 会话复用
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
OpenSSL 证书与调试
bash
# 生成 ECDSA 私钥与 CSR(推荐 P-256 或使用 Ed25519 视支持情况)
openssl ecparam -name prime256v1 -genkey -noout -out server.key
openssl req -new -key server.key -out server.csr -subj '/CN=example.com'
# 使用 ACME 客户端(如 certbot)签发
# certbot certonly --nginx -d example.com
# 测试握手与证书链
openssl s_client -connect example.com:443 -servername example.com -alpn h2 -tls1_3 -showcerts
# 查看证书字段
openssl x509 -in fullchain.pem -text -noout
Curl/HTTP 客户端验证
bash
# 验证 HTTPS 与 HTTP/2 协商
curl -I https://example.com --http2 -v
# 指定 CA 证书文件(自签场景)
curl https://internal.example --cacert /path/to/ca.crt
常见问题与排查
- 证书不匹配:域名未在 SAN 中;修复为重新签发包含正确域名的证书。
- 中间链缺失:服务器未发送完整链;在
ssl_certificate提供fullchain或配置ssl_trusted_certificate。 - 时间漂移:系统时间错误导致验证失败;启用 NTP 并校准时间。
- SNI 问题:多域同 IP 未正确提供相应证书;确保客户端发送
SNI,服务器按server_name匹配证书。 - 版本/套件不兼容:旧客户端不支持 TLS 1.3 或现代套件;开启 TLS 1.2 并提供兼容套件,避免启用过时算法(RC4、3DES)。
- OCSP Stapling 失败:DNS/防火墙阻断或
ssl_trusted_certificate未配置;检查解析与上游 OCSP 服务。 - HTTP/2 协商失败:ALPN 未开启或证书/配置不支持;确认
http2监听与 ALPN。 - 混合内容:HTTPS 页面加载 HTTP 资源被浏览器阻止;统一资源为 HTTPS 或使用 CSP 约束。
- 性能优化:开启会话复用/0-RTT(谨慎评估重放风险);优先 ECDSA 证书与 ECDHE 曲线(
x25519/secp256r1)。
术语表
- AEAD:具备同时提供加密与完整性的模式(如 AES-GCM)。
- ALPN:应用层协议协商,选择
h2或http/1.1。 - SNI:服务器名称指示,使同 IP 能托管多证书。
- PFS:前向保密,密钥泄露不影响已完成会话,依赖(EC)DHE。
- OCSP:在线证书状态协议,用于撤销检查;Stapling 为服务器缓存并提供结果。
- HKDF:基于 HMAC 的密钥派生函数,TLS 1.3 的关键组成。
RFC 与参考资料
- RFC 8446:TLS 1.3 规范
- RFC 5246:TLS 1.2 规范
- RFC 5280:互联网 X.509 公钥基础设施证书与 CRL
- RFC 6066:TLS 扩展(含 SNI)
- RFC 7301:ALPN(应用层协议协商)
- RFC 6797:HSTS(HTTP 严格传输安全)
- RFC 6960:OCSP(在线证书状态协议)
- RFC 5869:HKDF(基于 HMAC 的提取与扩展密钥派生函数)
注:示例配置需结合具体 OpenSSL/Nginx 版本与平台进行适配与测试;生产环境建议使用自动化证书管理与安全基线审查,并通过 SSL Labs 等工具进行合规与性能评估。