SSL证书管理
SSL证书管理
SSL证书类型
| 类型 | 验证方式 | 适用场景 |
|---|---|---|
| DV | 域名验证 | 个人网站 |
| OV | 组织验证 | 企业网站 |
| EV | 扩展验证 | 金融机构 |
| 自签名 | 无验证 | 内部测试 |
Let's Encrypt证书
安装Certbot
# Ubuntu/Debian
sudo apt-get install certbot python3-certbot-nginx
# CentOS/RHEL
sudo yum install certbot python3-certbot-nginx
申请证书
# 使用Nginx插件
sudo certbot --nginx -d example.com -d www.example.com
# 使用Webroot
sudo certbot certonly --webroot -w /var/www/html -d example.com
# 使用Standalone
sudo certbot certonly --standalone -d example.com
自动续期
# 测试续期
sudo certbot renew --dry-run
# 配置自动续期
echo "0 0,12 * * * root certbot renew --quiet --post-hook 'systemctl reload nginx'" | sudo tee /etc/cron.d/certbot
Nginx SSL配置
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优化
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;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
# HTTP重定向
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
Docker环境证书管理
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./certs:/etc/nginx/certs
- ./html:/usr/share/nginx/html
certbot:
image: certbot/certbot
volumes:
- ./certs:/etc/letsencrypt
- ./html:/var/www/html
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
实践:自动化证书管理
#!/bin/bash
# cert-renew.sh
DOMAIN="example.com"
WEBROOT="/var/www/html"
# 检查证书是否需要续期
if certbot certificates | grep -q "Expiring"; then
echo "证书即将过期,开始续期..."
# 续期证书
certbot renew --webroot -w $WEBROOT
# 重新加载Nginx
systemctl reload nginx
echo "证书续期完成"
else
echo "证书状态正常"
fi
证书检查
# 查看证书信息
openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -dates
# 检查远程证书
openssl s_client -connect example.com:443 </dev/null 2>/dev/null | openssl x509 -noout -dates
# 验证证书链
openssl verify -CAfile /etc/letsencrypt/live/example.com/chain.pem /etc/letsencrypt/live/example.com/cert.pem
通配符证书
# 申请通配符证书
sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com
# DNS验证
# 添加TXT记录: _acme-challenge.example.com
总结
SSL证书管理是Web安全的基础。使用Let's Encrypt和自动化工具,可以实现免费、自动化的证书管理。