虚拟机网站证书过了有效期,站点会被浏览器直接拦截,想避免半夜被用户投诉“证书过期网站打不开”,把续签交给自动化工具体系是最省心的办法,下面从原理到实操,把虚拟机环境下的自动续签一次说清。
虚拟机网站证书过期怎么自动续签?先理解续签逻辑
网站HTTPS证书不是一次配置永久有效,Let’s Encrypt免费证书默认有效期只有90天,付费证书一般是一年,虚拟机环境因为经常做快照、迁移、关机休眠,时间容易跑偏,定时任务也可能在恢复快照后丢失,证书一旦过期,用户访问时浏览器会显示“您的连接不是私密连接”,接口调用方也会因SSL握手失败直接报错。
自动续签的本质,是用ACME协议向证书颁发机构证明域名控制权,然后自动下载新证书、替换旧证书、重载Web服务,整个过程不需要人工点按钮,判断一台虚拟机能不能自动续签,主要看三件事:
- 域名解析是否指向当前虚拟机的公网IP。
- 80端口或DNS解析权限是否可用,用于完成ACME验证。
- 系统时间是否准确,证书有效期的判断依赖本地时间。
很多运维第一次踩坑,就是因为虚拟机快照恢复后系统时间回到了过去,续签脚本判断“证书还没到期”就不执行,结果真实世界里的证书已经过期,用户全被浏览器挡住。
免费SSL证书自动续签与付费证书对比:虚拟机网站该怎么选
搞自动续签之前,先分清免费和付费证书的差异,不是所有场景都要上付费证书,虚拟机个人项目、企业展示站、测试环境用免费的完全够。
| 对比维度 | Let’s Encrypt免费证书 | 付费证书 |
|---|---|---|
| 有效期 | 90天,自动续签 | 通常1年,部分支持自动续签 |
| 价格 | 免费 | 每年几十到几千元不等 |
| 验证方式 | DV域名验证 | DV/OV/EV身份验证 |
| 自动续签支持 | certbot、acme.sh完美支持 | 视服务商API开放程度 |
| 品牌显示 | 无组织名称 | OV/EV可显示企业名称 |
| 适用场景 | 个人博客、API接口、中小企业官网 | 电商、金融、政务等高信任场景 |
行业共识认为,大多数运行在虚拟机上的非交易类网站,免费DV证书配合自动续签已经能满足安全要求,付费证书的额外价值在于身份认证和保险赔付,不是自动续签能力本身,如果虚拟机里跑的是用户登录、在线支付这类业务,再考虑升级付费证书。
虚拟机里网站证书过期了怎么办?Certbot方案实操
这是最通用的方案,适合Ubuntu、Debian、CentOS等主流系统的虚拟机,以Nginx为例,假设域名是example.com,证书目录和Web服务都在同一台虚拟机上。
安装Certbot和Nginx插件
先更新软件源并安装对应包:
sudo apt update sudo apt install certbot python3-certbot-nginx
如果虚拟机用的是Apache,把python3-certbot-nginx换成python3-certbot-apache。
首次签发并自动配置Nginx
执行下面这条命令,Certbot会读取Nginx配置,自动找到域名对应的server块,完成验证并修改配置文件:
sudo certbot --nginx -d example.com -d www.example.com
命令结束时会询问是否将HTTP流量重定向到HTTPS,选2(Redirect)即可,这样用户访问HTTP也会自动跳转HTTPS。
配置定时任务实现nginx证书自动续签
Certbot安装时通常已经创建了systemd timer或cron任务,如果没有,可以手动添加一条crontab:
sudo crontab -e
加入下面这行,每天凌晨3点检查并续签:
0 3 /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"
--deploy-hook后面的命令会在证书成功续签后执行,自动重载Nginx让新证书生效,不需要重启整个虚拟机,几秒钟就能完成切换。
验证续签是否真的会成功
这一步不能省,跑一次“干跑”测试,让Certbot用测试证书走完整流程:
sudo certbot renew --dry-run
如果输出没有报错,说明定时任务、验证路径、重载命令都正常,以后正式续签时基本不会出问题。
国内服务器SSL证书自动续签配置的注意点
很多虚拟机部署在简米云、酷番云这类国内云平台上,地域网络环境和备案要求会让续签多出几个变量,业内专家指出,国内服务器上Let’s Encrypt的HTTP验证偶尔会因为跨境网络抖动失败,DNS验证是更稳妥的选择。
用acme.sh解决网络连通性和端口限制
acme.sh是一个轻量级Shell脚本,不需要root权限,也不会往系统目录塞一堆依赖,特别适合国内服务器、集群虚拟机和Docker环境,安装命令:
curl https://get.acme.sh | sh -s email=my@example.com
安装完成后重新加载shell,或用~/.acme.sh/acme.sh直接调用。
如果虚拟机没有开放80端口,或者域名没有备案无法使用HTTP验证,就改用DNS API方式,以简米云DNS为例:
export Ali_Key="你的AccessKey ID" export Ali_Secret="你的AccessKey Secret" ~/.acme.sh/acme.sh --issue --dns dns_ali -d example.com -d www.example.com
酷番云DNS则使用dns_tencent,其他服务商参数可以在acme.sh的DNS API列表里查到。
安装证书并自动重载Nginx
acme.sh默认会把证书放在~/.acme.sh/example.com/目录下,建议安装到Nginx实际读取的路径,并绑定重载命令:
~/.acme.sh/acme.sh --install-cert -d example.com --key-file /etc/nginx/ssl/example.com.key --fullchain-file /etc/nginx/ssl/example.com.cer --reloadcmd "systemctl reload nginx"
acme.sh安装后就会自动创建cron任务,每天检查证书有效期,在到期前自动续签并执行reloadcmd,不需要再手动配置定时任务。
系统时间不同步是隐藏杀手
虚拟机如果长期不重启、或从旧快照恢复,时间偏差可能超过几分钟,证书有效期判断和HTTPS握手都会用到系统时间,可以用下面命令检查:
timedatectl status
如果时间不对,先安装chrony并强制同步:
sudo apt install chrony sudo systemctl enable chrony sudo chronyc makestep
配置完之后再重新跑一次续签测试,大部分“明明续签成功但浏览器还是提示过期”的问题会消失。
自动续签失败后的应急处置
自动续签不是百分百可靠,DDOS防护、DNS服务商API变更、磁盘写满都可能导致续签失败,证书真过期时,先别急着回滚虚拟机快照。
首先手动触发一次续签:
sudo certbot renew
或者对单个域名:
~/.acme.sh/acme.sh --renew -d example.com --force
如果报错显示验证失败,检查域名解析是否还是当前虚拟机IP,80端口是否在安全组里开放,如果错误指向DNS API,检查AccessKey是否被禁用或权限过期,绝大多数续签失败都能通过这三步定位到具体原因。
手动续签成功后,Nginx会自动重载,用户刷新页面就能恢复正常,不要用关闭HTTPS回退到HTTP的方式来“临时解决”,这会让用户密码和数据暴露在链路上,得不偿失。
自动续签这套机制跑通之后,虚拟机上的网站证书基本可以做到无感更新,免费证书配合certbot或acme.sh,加上一条定时任务和一个重载钩子,就能把90天的生命周期管理变成后台自动流程,剩下的,就是偶尔看一眼系统时间和磁盘空间。
Q&A:虚拟机网站证书过期自动续签相关问题
虚拟机网站证书过期自动续签一直失败怎么排查?
先看系统时间是否准确,再检查域名解析是否指向当前虚拟机IP,接着测试ACME验证路径:HTTP验证需要80端口可达,DNS验证需要服务商API密钥有效,多数情况下,失败原因集中在防火墙拦截、安全组未放行、或者DNS记录缓存未生效。
网站SSL证书自动续签免费与付费证书在虚拟机上有区别吗?
自动续签能力本身没有本质区别,工具层面都支持,区别在证书类型和信任级别:免费证书是DV域名验证,没有企业身份信息;付费OV/EV证书能在浏览器地址栏显示公司名称,并提供一定的安全赔付,个人网站、API服务用免费证书完全够,涉及资金交易的场景再考虑付费证书。
certbot和acme.sh哪个更适合虚拟机网站证书续签?
certbot适合标准Nginx/Apache环境,插件式配置直接修改站点文件,上手简单,acme.sh不依赖系统包管理器,支持几十家DNS服务商API,无需开放80端口,更适合国内服务器、容器化虚拟机和不能用HTTP验证的场景,两者都能自动续签,acme.sh安装后会自动创建cron任务,每天检查证书有效期并在到期前自动续签。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/649700.html





