本文详细介绍如何通过脚本自动化生成SSL证书,涵盖Let’s Encrypt、OpenSSL等工具的使用方法,提供可复用的Bash/Python脚本示例,并解析证书续签与部署的最佳实践,帮助开发者高效实现HTTPS加密。
一、为什么需要自动化SSL证书生成?
随着HTTPS成为网站安全标配,手动申请和更新SSL证书已无法满足现代运维需求。自动化方案能:
- 解决证书过期导致的业务中断风险
- 降低人工维护成本
- 适应微服务架构的证书海量需求
- 符合PCI DSS等安全合规要求
二、主流自动化工具对比
工具 | 证书类型 | 验证方式 | 适合场景 |
---|---|---|---|
Let’s Encrypt | DV证书 | HTTP/DNS验证 | 公有Web服务 |
OpenSSL | 自签名证书 | 无CA验证 | 内网/测试环境 |
Certbot | DV/OV证书 | ACME协议 | 自动化运维 |
三、实战脚本示例
1. 使用Certbot自动申请(Bash)
!/bin/bash
DOMAIN="example.com"
EMAIL="admin@example.com"
安装Certbot(以Ubuntu为例)
sudo apt install certbot python3-certbot-nginx -y
自动获取证书并配置Nginx
sudo certbot --nginx -d $DOMAIN -d www.$DOMAIN --non-interactive --agree-tos -m $EMAIL
设置自动续期
(crontab -l 2>/dev/null; echo "0 3 /usr/bin/certbot renew --quiet") | crontab -
2. OpenSSL自签名证书(Python)
import os
from OpenSSL import crypto, SSL
def generate_self_signed_cert(cert_file="cert.pem", key_file="key.pem"):
创建密钥对
k = crypto.PKey()
k.generate_key(crypto.TYPE_RSA, 2048)
创建证书
cert = crypto.X509()
cert.get_subject().CN = "localhost"
cert.set_serial_number(1000)
cert.gmtime_adj_notBefore(0)
cert.gmtime_adj_notAfter(365246060)
cert.set_issuer(cert.get_subject())
cert.set_pubkey(k)
cert.sign(k, 'sha256')
保存文件
with open(cert_file, "wb") as f:
f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
with open(key_file, "wb") as f:
f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k))
四、高级技巧与注意事项
- 通配符证书:通过DNS验证获取
.example.com
证书 - 证书链合并:
cat cert.pem chain.pem > fullchain.pem
- 密钥安全:设置400权限
chmod 400 private.key
- OCSP装订:提升HTTPS握手性能
五、监控与故障排查
推荐监控方案:
- 使用Nagios检查证书过期时间:
check_http -H example.com -C 30 --sni
- Prometheus+Blackbox实现证书到期告警
- 日志分析:
journalctl -u certbot -f
评论