HTTPS与SSL/TLS证书基础
HTTPS 是 HTTP 与 SSL/TLS 的结合,为 Web 通信提供加密、完整性校验与身份认证。本文记录 HTTPS 的工作原理、SSL/TLS 握手流程,并结合 Let's Encrypt 证书的申请与配置实操,理解证书链与密钥管理。
一、HTTPS解决的问题
HTTP 明文传输存在三大安全风险,HTTPS 通过以下机制解决:
- 窃听:明文可被抓包查看 → SSL/TLS 加密
- 篡改:内容可被中间人修改 → MAC 完整性校验
- 冒充:无法确认服务器真实身份 → 证书 + CA 签名
二、对称加密与非对称加密
HTTPS 混合使用两种加密方式:
- 非对称加密(RSA、ECDHE):公钥加密、私钥解密。用于握手阶段安全交换对称密钥。计算开销大,不适合大数据量。
- 对称加密(AES、ChaCha20):加解密使用同一密钥,速度快。用于握手后的应用数据加密。
HTTPS 的核心思想是:用非对称加密协商出对称密钥,后续通信用对称密钥加密。
三、SSL/TLS握手流程
TLS 1.2 握手流程(简化):
- ClientHello:客户端发送支持的 TLS 版本、加密套件、随机数 ClientRandom
- ServerHello:服务器选定 TLS 版本、加密套件,返回随机数 ServerRandom
- Certificate:服务器发送证书链
- ServerKeyExchange / ServerHelloDone:密钥交换参数与完成信号
- ClientKeyExchange:客户端生成 PreMasterSecret 并用服务器公钥加密发送
- ChangeCipherSpec / Finished:双方切换到加密通信,发送加密的 Finished 验证握手完整性
双方根据 ClientRandom、ServerRandom、PreMasterSecret 计算出相同的会话密钥。TLS 1.3 简化为 1-RTT 握手,安全性更高。
四、证书链
证书信任基于链式结构:
- 根 CA:自签名证书,预置在操作系统/浏览器信任库
- 中间 CA:由根 CA 签发,负责签发终端证书
- 终端证书:网站持有的证书,由中间 CA 签发
验证时,浏览器从终端证书逐级向上验证签名,直到信任库中的根 CA。
服务器需配置完整证书链(终端证书 + 中间证书),否则部分客户端无法验证。Let's Encrypt 的 fullchain.pem 已包含完整链。
五、Let's Encrypt证书申请
使用 certbot 申请证书:
# 安装 certbot
sudo apt-get install -y certbot python3-certbot-nginx
# 申请证书(Nginx 插件自动验证)
sudo certbot certonly --nginx \
-d p2pblaze.com -d www.p2pblaze.com \
--non-interactive --agree-tos \
--email 18718770325@163.com
# 证书文件位置
# /etc/letsencrypt/live/p2pblaze.com/fullchain.pem 完整证书链
# /etc/letsencrypt/live/p2pblaze.com/privkey.pem 私钥
六、Nginx配置HTTPS
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name p2pblaze.com www.p2pblaze.com;
ssl_certificate /etc/letsencrypt/live/p2pblaze.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/p2pblaze.com/privkey.pem;
# 仅启用 TLS 1.2/1.3
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 会话缓存提升性能
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# HTTP 跳转 HTTPS
server {
listen 80;
server_name p2pblaze.com www.p2pblaze.com;
return 301 https://$host$request_uri;
}
七、证书自动续期
Let's Encrypt 证书有效期 90 天,certbot 安装时自动配置 systemd timer 续期:
# 测试续期流程(不实际续期)
sudo certbot renew --dry-run
# 查看 timer 状态
systemctl list-timers | grep certbot
# 手动续期并重载 Nginx
sudo certbot renew --deploy-hook "systemctl reload nginx"
八、验证
# 查看证书信息
openssl x509 -in /etc/letsencrypt/live/p2pblaze.com/cert.pem -noout -text
# 验证证书链
openssl s_client -connect p2pblaze.com:443 -servername p2pblaze.com
# 检查支持的协议与套件
nmap --script ssl-enum-ciphers -p 443 p2pblaze.com
# 在线检测:SSL Labs
# https://www.ssllabs.com/ssltest/
小结
HTTPS 通过非对称加密协商密钥、对称加密传输数据、证书实现身份认证。Let's Encrypt 让证书申请免费且自动化,配合 certbot 与 systemd timer 可实现零运维续期。生产环境务必禁用 TLS 1.0/1.1,仅保留 TLS 1.2+,并配置完整证书链与 HSTS。