运维常见问题 --- 如何实现个人网站ssl证书免费无限自动续约
举例环境是nginx和windows上配置,其他类似只是配置不同
- 首先,下载 win-acme 工具:
- 访问 https://github.com/win-acme/win-acme/releases
- 下载最新版本的 win-acme.v2.x.x.xxx.x64.pluggable.zip
- 解压到一个固定的目录,比如
- 准备工作:
- 确保你的Nginx已经正确配置并运行
- 确保你的域名已经正确解析到你的服务器IP
- 记下你的Nginx网站根目录路径
- 运行证书申请:
- 以管理员身份打开命令提示符
- 进入win-acme目录
- 运行
- 选择 创建新证书
- 选择证书类型(通常选择单域名证书)
- 输入你的域名
- 选择验证方式:建议选择选项1 "[http] 在网络路径保存验证文件"
- 输入你的Nginx网站根目录路径(比如 )
- 在你的证书生成目录下会发现两个文件,一个key.pem,一个crt.pem
- Nginx配置示例:
server {
listen 80;
server_name your-domain.com;
# 用于验证的配置
location /.well-known/acme-challenge/ {
root C:/nginx/html; # 改成你的实际网站根目录
}
# 将http重定向到https
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name your-domain.com;
# 证书配置
ssl_certificate C:/Certificates/your-domain.com/crt.pem;
ssl_certificate_key C:/Certificates/your-domain.com/key.pem;
# 其他SSL配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
root C:/nginx/html;
index index.html;
}
}
- 自动续约设置:
- win-acme会自动创建一个Windows计划任务
- 你可以在Windows任务计划程序中找到它
- 默认会在证书过期前自动续约
- 你可以在Windows任务计划程序中查看和修改续约计划
- 验证安装:
- 重启Nginx:
- 访问你的https网站验证证书是否正常工作
- 可以通过 https://www.ssllabs.com/ssltest/ 测试证书状态
检测续约成功
在Linux系统上使用Nginx配置Let's Encrypt证书的完整步骤:
- 安装必要软件:
# Ubuntu/Debian系统 sudo apt update sudo apt install nginx certbot python3-certbot-nginx # CentOS系统 sudo yum install epel-release sudo yum install nginx certbot python3-certbot-nginx
- 配置Nginx基础配置:
# /etc/nginx/conf.d/example.conf server { listen 80; server_name example.com www.example.com; root /var/www/html; # 用于验证的配置 location /.well-known/acme-challenge/ { root /var/www/html; } }
- 申请证书:
# 自动配置nginx sudo certbot --nginx -d example.com -d www.example.com # 或者只申请证书不修改nginx配置 sudo certbot certonly --nginx -d example.com -d www.example.com
- 完整的Nginx HTTPS配置:
# /etc/nginx/conf.d/example.conf server { listen 80; server_name example.com www.example.com; # 将HTTP重定向到HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name example.com www.example.com; root /var/www/html; # SSL配置 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # SSL优化配置 ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # 现代配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # HSTS配置(谨慎使用) # add_header Strict-Transport-Security "max-age=63072000" always; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # 其他安全headers add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; # 网站配置 location / { try_files $uri $uri/ /index.html; } # 性能优化 location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { expires 30d; access_log off; } }
- 设置自动续期:
# 测试续期 sudo certbot renew --dry-run # 添加定时任务 sudo crontab -e # 添加以下内容(每天两次尝试续期) 0 0,12 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
- 证书管理命令:
# 查看证书列表 sudo certbot certificates # 删除证书 sudo certbot delete --cert-name example.com # 手动续期 sudo certbot renew
- 安全加固:
# 设置证书目录权限 sudo chmod -R 700 /etc/letsencrypt/live/ sudo chmod -R 700 /etc/letsencrypt/archive/ # 备份证书 sudo tar -czf letsencrypt-backup.tar.gz /etc/letsencrypt
- 监控脚本示例:
#!/bin/bash # check_cert.sh domain="example.com" exp_date=$(openssl s_client -connect ${domain}:443 -servername ${domain} 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2) exp_epoch=$(date -d "${exp_date}" +%s) current_epoch=$(date +%s) days_left=$(( (exp_epoch - current_epoch) / 86400 )) if [ $days_left -lt 30 ]; then echo "警告:证书将在 ${days_left} 天后过期" # 添加告警通知代码 fi
- 常见问题处理:
a. 续期失败:
# 查看续期日志 sudo tail -f /var/log/letsencrypt/letsencrypt.log # 手动强制续期 sudo certbot renew --force-renewal
b. Nginx配置测试:
# 测试配置 sudo nginx -t # 重新加载配置 sudo nginx -s reload
- 性能优化建议:
# 添加到http块 http { # 启用OCSP stapling ssl_stapling on; ssl_stapling_verify on; # 启用session缓存 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 启用HTTP/2 listen 443 ssl http2; }
使用限制:
- 每个域名每周可以请求的新证书数量有限制
- 每个证书最多可包含100个域名
- 证书有效期为90天
只能签发DV证书
补充知识:
三种证书的区别:
- 安全性能力:
-
DV证书:
- 仅提供基础的SSL/TLS加密
- 只保证数据传输安全
- 不验证网站运营者身份
-
OV证书:
- 提供SSL/TLS加密
- 包含企业身份信息
- 证实网站运营者为合法注册企业
-
EV证书:
- 最高级别加密保护
- 完整的企业身份验证
- 最严格的身份审核标准
- 申请流程和时间:
-
DV证书:
- 全自动验证
- 几分钟到几小时完成
- 仅需证明域名控制权
-
OV证书:
- 需人工审核
- 1-3个工作日
- 需提供企业资质文件
-
EV证书:
- 最严格的人工审核
- 5-7个工作日或更长
- 需提供全面的企业认证材料
- 成本价格:
-
DV证书:
- 免费(Let's Encrypt)
- 或每年几百元
- 最经济的选择
-
OV证书:
- 每年几千元
- 中等价位
- 适合一般企业预算
-
EV证书:
- 每年上万元起
- 最贵的选择
- 需要较大投入
- 浏览器显示效果:
-
DV证书:
- 普通锁标志
- 不显示组织信息
- 基础https标识
-
OV证书:
- 锁标志
- 显示组织名称
- 点击可查看详细信息
-
EV证书:
- 绿色地址栏(部分浏览器)
- 显示完整企业名称
- 最高级别的视觉信任标识
- 适用场景:
-
DV证书:
- 个人博客
- 信息类网站
- 小型企业网站
- 测试环境
-
OV证书:
- 电商网站
- 企业官网
- 社交平台
- 需要身份可信的场景
-
EV证书:
- 银行网站
- 支付平台
- 金融机构
- 政府网站
- 大型企业官网
- 验证内容:
-
DV证书:
- 仅验证域名所有权
- 通过DNS或文件验证
- 不验证组织信息
-
OV证书验证:
- 域名所有权
- 企业营业执照
- 组织机构代码
- 企业电话地址
-
EV证书验证:
- 所有OV证书要求
- 法律文件审查
- 银行账户验证
- 实地考察(可能)
- 多重交叉验证
- 主要优势:
-
DV证书:
- 快速部署
- 成本低
- 自动化程度高
- 适合小规模使用
-
OV证书:
- 增加用户信任
- 证明企业身份
- 性价比适中
- 适合一般商用
-
EV证书:
- 最高信任等级
- 最强身份证明
- 最佳品牌展示
- 适合高要求场景
选择建议:
- 如果是个人网站或小型项目,选择DV证书足够
- 如果是企业网站需要展示可信度,选择OV证书
- 如果是金融相关或需要最高信任级别,选择EV证书