HTTPS 协议深度解析:从握手到证书验证 HTTPS 的必要性 HTTP 的安全隐患 明文传输:所有数据都是可读的 无法验证身份:容易遭受中间人攻击 数据篡改:传输内容可被恶意修改 HTTPS 的解决方案 加密:保护数据隐私 认证:验证服务器身份 完整性:防止数据篡改 TLS 握手过程 Client Hello 客户端发送: 支持的 TLS 版本 随机数(RandomC) 支持的密码套件(Cipher Suites) 支持的压缩方法 Server Hello 服务器回复: 选择的 TLS 版本 随机数(RandomS) 选择的密码套件 服务器证书 证书验证 客户端验证证书: 检查证书链 验证有效期 检查域名匹配 验证吊销状态(CRL/OCSP) 密钥交换 根据选择的密钥交换算法:
客户端发送:
TLS 版本:TLS 1.3 随机数:32 字节随机数 密码套件: - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - TLS_AES_128_GCM_SHA256
服务器回复:
选择的密码套件:TLS_AES_256_GCM_SHA384 证书:包含公钥和服务器身份信息
客户端验证证书:
根据选择的密钥交换算法:
双方发送加密的 Finished 消息,验证握手成功。
证书版本:V3 序列号:唯一标识 签名算法:SHA256withRSA 颁发者:CA 信息 有效期: - 开始日期 - 结束日期 主体:服务器信息 公钥:服务器的公钥 扩展: - SAN(主题备用名称) - 密钥用途 - CRL 分发点 - OCSP URL 签名:CA 的数字签名
DV(域名验证)
OV(组织验证)
EV(扩展验证)
通配符证书
多域名证书(SAN)
# 安装 Certbot apt install certbot # 获取证书(HTTP-01 验证) certbot certonly --standalone -d example.com # 自动续期 certbot renew --dry-run
TLS 1.3 套件(最高优先级)
TLS 1.2 套件(向后兼容)
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; # 现代 TLS 配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256'; ssl_prefer_server_ciphers off; # 会话缓存 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; # HSTS add_header Strict-Transport-Security "max-age=63072000" always; }
ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
ssl_session_tickets on; ssl_session_ticket_key /etc/nginx/ticket.key;
服务器主动提供 OCSP 响应:
ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s;
启用 HTTP/2 提升性能:
listen 443 ssl http2;
server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; }
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self'" always;
# 检查证书过期时间 echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates # 监控脚本 #!/bin/bash DOMAIN="example.com" EXPIRY_DATE= EXPIRY_EPOCH= CURRENT_EPOCH=1774231043 DAYS_LEFT=$(((EXPIRY_EPOCH - CURRENT_EPOCH) / 86400)) if [ $DAYS_LEFT -lt 30 ]; then echo "警告:证书将在 $DAYS_LEFT 天后过期" fi
HTTPS 页面包含 HTTP 资源:
缺少中间证书:
证书域名与访问域名不一致:
HTTPS 是现代 Web 的必需品:
记住:安全是一个持续的过程,需要定期审查和更新配置。