尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SSL证书有效期缩短至200天,免费证书续期与自动化部署实战指南

SSL证书有效期缩短至200天,免费证书续期与自动化部署实战指南 最近几个月我这边接连有人问同一个问题“听说SSL证书有效期要砍到200天了以后免费证书还能用吗哪里还能申请”问的人里有做小网站的也有管公司内部系统的看来2026年之后证书签发规则的变化确实把不少人的续期节奏打乱了。先给结论免费证书不会消失而且主流免费证书Let’s Encrypt、ZeroSSL这些早就是90天有效期比200天还短它们并没有从此退出市场。真正需要改的不是“去哪里找免费证书”而是你自己的证书管理方式。这篇文章我把来龙去脉、现在还能用的免费证书渠道、自动化续期、常见部署格式转换、以及坑点一起整理出来按我自己的实操习惯写希望能帮你把这件麻烦事一次理顺。1. 200天新规来了免费证书还够用吗1.1 从398天到200天证书有效期为什么一缩再缩要搞懂这个变化先得明白SSL证书到底是干什么的。简单说证书就是把“某个域名”和“一把公钥”绑定在一起然后由CA证书颁发机构用它的私钥给这份绑定关系签名。浏览器访问你的网站时会把证书拿下来沿着CA证书链逐级验证直到系统内置的可信根证书确认没问题后才建立加密连接。所以证书的“有效期”本质上是CA为你这个绑定关系做的担保期限。担保期限太长问题就多私钥万一泄露别人可以在长达一年多的时间里拿这把泄露的私钥冒充你的站点域名到期、被抢注之后旧证书可能还在有效期内继续被使用某些被吊销的证书因为吊销列表同步不及时仍然可能被部分客户端信任。CA/Browser Forum由CA机构和浏览器厂商组成的行业组织这些年一直在推动缩短证书最长有效期。我记得早年间证书最长能到39个月后来一步步压缩到825天、398天。按最新通过的规则新签发证书的最长有效期将逐步降到200天左右过渡期之后基本所有公开信任的SSL/TLS证书都会按这个上限执行。苹果Safari等浏览器厂商也在配合推进可以说这是整个行业在往“短命证书”方向走目的就是减少密钥暴露和证书滥用带来的风险。这个改动本质上跟“免费证书”关系不大因为Let’s Encrypt从诞生起就是90天证书早已把“短周期自动化”玩成了标配。真正受影响最明显的是那些习惯了一次申请两年证书的传统用户现在不得不重新考虑续期频率。1.2 缩短有效期对网站运维的真正影响证书有效期缩短最直接的感受就是“换证书的频率翻倍”。原来398天一年最多折腾一两次以后最长200天一年至少要处理两次。如果公司内部有几十个域名、十几台服务器靠手工上传证书的话这个工作量大到会让人怀疑人生。第二个影响是时间窗口变紧。以前证书快过期时管理员可能靠邮件提醒或者等浏览器报错再去处理。现在有效期缩短这种“被动式运维”非常危险。因为证书剩余时间越来越短任何一个环节的延迟比如DNS解析没生效、域名验证没过、邮件没看到都会导致线上服务直接挂掉。对电商、支付、政府类网站来说证书过期可不是小事。第三个影响是证书管理的复杂度上来了。证书不再是一次性采购的资源而是需要“持续维护的资产”。你最好有一个地方统一记录证书的域名、签发时间、到期时间、部署位置、私钥存放路径等信息。我们公司现在就是用一个简单的表格加脚本每周自动扫一遍所有服务器上的证书到期时间提前30天就告警。但这个变化也有一个“意外好处”既然付费证书和免费证书都要经常换那很多本来买付费证书的站长干脆改用了免费证书配合自动化脚本使用效果并不差。这也是我写这篇文章想强调的核心思路——别再盯着“能申请多久”了要把重点放在“能不能自动续期”上。2. 免费证书盘点现在还能从哪领2.1 还在稳定发放的免费证书渠道先说大家最关心的还有哪些免费证书能申请我按自己在生产环境里用过、或者亲眼验证过的渠道来列避免云厂商那种“免费临时体验”的噱头。证书渠道有效期支持域名类型自动化适配备注Let’s Encrypt90天单域名、多域名SAN、通配符强acme.sh/certbot等成熟ACME v2协议完全免费是最多人用的选择ZeroSSL90天单域名、多域名SAN、通配符强支持ACME也提供网页手动签发免费额度够常规使用自带管理面板Google Trust Services90天单域名、多域名SAN、通配符强通过ACME方式签发谷歌公共CA现在已经开放普通域名申请阿里云免费证书3个月单域名一般可在控制台申请续期需重新验证个人用户一年额定数量有限不支持通配符腾讯云免费证书3个月单域名一般控制台操作支持自动签发适合腾讯云服务器上的简单业务百度云、华为云等云厂商免费证书3个月左右单域名一般各厂商规则常有调整以官网为准选免费证书前一定要看清它的规则。像Let’s Encrypt和ZeroSSL通过ACME方式可以一直续只要域名验证通过就没有额外费用。云厂商的免费证书通常不支持通配符而且申请次数、有效期限制都比较严格适合简单场景。我觉得现阶段最值得建立的组合是主力域名用Let’s Encrypt或者ZeroSSL做自动化续期个别只能用云厂商证书的场景比如某些云负载均衡只能上传指定格式的证书再申请云厂商免费证书。这样不会被某一个渠道锁死。2.2 选型要点域名类型、自动化适配与信任度具体选哪家我一般会按下面几个维度来评估第一是域名类型。如果你有泛域名需求比如*.example.com下面挂着几十个子域名必须选支持通配符的免费证书目前Let’s Encrypt和ZeroSSL都支持通过DNS验证签发通配符证书。云厂商免费证书基本不给通配符这条直接排除。第二是自动化适配。免费证书生命周期短如果每次手工申请那等于把麻烦扩大了十倍。所以我会优先看这个渠道支不支持ACME协议以及它的API能不能和现有脚本配合。Let’s Encrypt、ZeroSSL、Google Trust Services都支持ACME v2这是自动化的大前提。云厂商免费证书虽然有些控制台可以自动签发但要从外部脚本触发就比较麻烦适合不怎么变动的静态场景。第三是信任度。很多朋友担心免费证书不被浏览器信任其实只要证书由公共根CA签发并且中间链完整绝大多数系统、浏览器都内置了信任。Let’s Encrypt有IdenTrust根证书做兼容ZeroSSL和Google Trust Services也都有成熟的信任链这一点和付费证书在用户浏览器里的最终表现没有区别。第四是签发限制和续期方式。有些免费证书服务对“短时间反复签发”有限制比如同一域名每周签发数量不能超过多少。正常使用不会碰到但如果你的自动化脚本出了问题疯狂重复申请很可能被临时封禁。这点要留意别等出问题才发现。我个人的选择习惯是能上Let’s Encrypt就上Let’s Encrypt因为它支持的服务商最广、社区资料最多万一某个域名解析不在常用DNS服务商上或者希望有个管理面板看历史记录就切到ZeroSSL。Google Trust Services也不错不过它更偏技术型普通用户用得少一些。3. 免费证书的自动化续期90天也能省心3.1 用acme.sh自动签发并续期既然免费证书有效期都这么短自动化就成了必选项。市面上ACME客户端很多最出名的是certbot但我个人更常用acme.sh。原因很简单它轻量、shell脚本实现、对DNS服务商的支持特别全面基本主流DNS都有API脚本而且配置简单适合批量管理。我以Let’s Encrypt为例讲一下acme.sh从安装到自动续期的完整流程。先安装acme.shcurl https://get.acme.sh | sh -s emailyourexample.com安装完成后它会自动把调用脚本的别名加到用户的.bashrc或.zshrc里重新加载一下就好source ~/.bashrc然后注册账号这一步会把你的邮箱绑定到Let’s Encrypt账户上acme.sh --register-account -m yourexample.com --server letsencrypt接着签发证书。签发方式按验证类型分两类我重点说两种HTTP方式需要你有网站目录的写权限适用于已经有Nginx或Apache在跑80端口的情况。DNS方式通过在DNS服务商后台自动添加一条TXT解析记录来验证适用于没有80端口、或者需要签发通配符证书的情况。用Nginx的webroot模式签发单域名证书可以这样acme.sh --issue -d example.com -d www.example.com --webroot /var/www/html签发完证书后用install-cert参数把它安装到正式目录并触发服务重载acme.sh --install-cert -d example.com \ --key-file /etc/nginx/ssl/example.com.key \ --fullchain-file /etc/nginx/ssl/example.com.pem \ --reloadcmd systemctl reload nginxacme.sh默认会写入一条cron任务定时检查所有已签发证书的剩余有效期。它一般会在证书到期前自动续期你不需要天天盯着。如果用ZeroSSL作为默认CA在注册账号时它会要求先邮箱验证这一步通过后再签发其余流程基本一致。3.2 Linux下查看证书过期时间与续期确认自动续期虽然方便但脚本不是万无一失所以我强烈建议你养成手动检查证书到期时间的习惯。这里有两条最常用的命令一条查本地文件一条查线上远程证书。查本地证书openssl x509 -in /etc/nginx/ssl/example.com.pem -noout -dates输出里会同时看到notBefore生效时间和notAfter到期时间。想看得更详细可以加上-subject和-issuer确认证书绑定的域名、颁发者是不是自己预期的那家CAopenssl x509 -in /etc/nginx/ssl/example.com.pem -noout -subject -issuer -dates查远程线上服务openssl s_client -connect example.com:443 -servername example.com 2/dev/null | openssl x509 -noout -dates这条命令会在不打断正在运行的HTTPS服务的前提下把当前服务器实际用到的证书信息拉下来。我经常用它来验证线上证书是不是已经成功替换成了新的避免出现“配置文件里是新的进程里还是老证书”的诡异情况。如果你要监控多台服务器可以写个简单的shell循环把域名和端口列在一个文件里定时批量检查。下面这个脚本就是我的常用原型#!/bin/bash for domain in example.com www.example.com api.example.com; do exp$(echo | openssl s_client -connect $domain:443 -servername $domain 2/dev/null | openssl x509 -noout -enddate 2/dev/null | cut -d -f2) if [ -n $exp ]; then echo $domain : $exp fi done跑一次就能看到所有域的到期日期哪张证书快过期一目了然。4. 证书格式转换与常用部署实战4.1 阿里云/腾讯云免费证书导出后如何转成Tomcat的PFX免费证书申请下来后很多人卡在“不知道怎么用”。尤其是从云厂商下载证书经常是PEM格式的证书文件、私钥、证书链而Tomcat偏偏不吃这一套它要的是JKS或者PKCS12格式。这里我以最常见的“PEM三件套”转成.pfx为例给出可以直接抄的命令。比如你在阿里云下载了三个文件example_com.pem服务器证书example_com.key私钥example_com_chain.crt证书链先确认私钥和证书是不是匹配openssl x509 -noout -modulus -in example_com.pem | openssl md5 openssl rsa -noout -modulus -in example_com.key | openssl md5两个命令输出的MD5一致说明证书和私钥是配套的可以继续往下走。如果私钥是PKCS#8格式openssl rsa命令可能会报错这时用openssl pkey -in example_com.key -noout -modulus | openssl md5来比对。然后执行转换openssl pkcs12 -export \ -in example_com.pem \ -inkey example_com.key \ -certfile example_com_chain.crt \ -out example_com.pfx \ -passout pass:YourPassword \ -name tomcat参数说明-passout设置pfx文件的保护密码Tomcat连接器配置时要填同一个-name是别名随意起但要和后面配置一致。有时候云厂商下载的服务器证书是.cer格式DER编码那要先用下面命令转成PEMopenssl x509 -inform DER -in example_com.cer -out example_com.pem生成example_com.pfx后放到Tomcat的conf目录然后在server.xml里配置HTTPS连接器Connector port8443 protocolHTTP/1.1 SSLEnabledtrue maxThreads150 schemehttps securetrue keystoreFileconf/example_com.pfx keystoreTypePKCS12 keystorePassYourPassword clientAuthfalse sslProtocolTLS /改完重启Tomcat再用openssl s_client测试线上端口确认证书已生效。4.2 vsftpd的SSL证书要求与配置方法vsftpd是Linux上很常用的FTP服务器很多人不知道它也可以启用FTPS。这里有个容易被坑的地方vsftpd要求证书和私钥是PEM格式而且它没有单独的“证书链”配置项所以你要把服务器证书和中间证书链合并成一个文件。先准备证书和私钥。比如用acme.sh签发的证书在/etc/letsencrypt/live/example.com/下会有fullchain.pem含完整链和privkey.pem。把这两个文件拷贝到vsftpd自己的目录顺便合并一个vsftpd需要的证书文件mkdir -p /etc/vsftpd/certs cp /etc/letsencrypt/live/example.com/privkey.pem /etc/vsftpd/certs/vsftpd_key.pem cp /etc/letsencrypt/live/example.com/fullchain.pem /etc/vsftpd/certs/vsftpd_cert.pem如果只有单独的服务器证书和中间证书可以用cat合并cat example_com.pem example_com_chain.crt vsftpd_cert.pem然后修改/etc/vsftpd/vsftpd.conf开启SSL支持ssl_enableYES allow_anon_sslNO force_local_data_sslYES force_local_logins_sslYES ssl_tlsv1YES ssl_sslv2NO ssl_sslv3NO rsa_cert_file/etc/vsftpd/certs/vsftpd_cert.pem rsa_private_key_file/etc/vsftpd/certs/vsftpd_key.pem配置完之后记得把私钥文件权限改成600或者400否则vsftpd会拒绝启动chmod 600 /etc/vsftpd/certs/vsftpd_key.pem systemctl restart vsftpd这里要特别检查系统时间。如果服务器时间和实际时间偏差太大证书验证会直接失败表现为客户端连接时报证书无效。我遇到过几次排查半天才发现是NTP没同步所以建议装上chrony或者ntpdate保证时间准确。4.3 Nginx部署免费证书的提示Nginx是当前部署最灵活的Web服务器证书配置也最简单。用acme.sh签发后直接指定绝对路径即可server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ... }注意证书文件要用fullchain.pem如果只填服务器证书而漏掉中间证书链大部分浏览器会报“证书链不完整”或者“不受信任”。用Let’s Encrypt签发的证书fullchain.pem里已经包含中间证书直接省心。如果是其他渠道下载的证书请务必把中间证书拼到同一个PEM文件里。配置完成记得先测试nginx -t systemctl reload nginx然后访问https://example.com用“小锁”图标确认连接正常。5. 常见问题与排查技巧实录5.1 免费证书常见的“不信任”和中间链问题用免费证书踩过最典型的坑就是“浏览器访问时报不安全但服务器上明明配置了证书”。多数情况下问题出在中间链没配置完整。浏览器只有从你的站点证书开始一级一级向上找到内置根证书才认为可信。中间链一旦缺失验证就断了。遇到这个问题可以用系统内置的证书链检测工具或者直接看服务器发下来的证书链。命令行验证方式openssl s_client -connect example.com:443 -servername example.com -showcerts如果输出里只有一张证书说明服务端没发送中间证书。解决办法就是使用完整的fullchain.pem。Nginx和vsftpd都建议使用合并后的完整链文件。还有一类情况是“证书没有生效”常见原因是服务器时间不对尤其是虚拟机、老设备上容易出现。出现这类问题第一件事不是反复重装证书而是先执行date看一眼系统时间。5.2 续期脚本踩坑ACME协议版本和DNS验证ACME协议有v1和v2之分现在Let’s Encrypt已经彻底停用v1acme.sh默认使用v2一般不会踩坑。如果你在公司里用了比较老的ACME客户端脚本可能突然某天续期失败这时候要检查客户端版本尽量升级到新版本。DNS验证的问题是很容易被忽略的。用DNS方式申请通配符证书时需要在DNS后台添加一条_acme-challenge的TXT记录。acme.sh支持自动调用DNS服务商API但前提是你得提前配置好API密钥比如阿里云要配Ali_Key和Ali_SecretCloudflare要配CF_Token和CF_Account_ID。很多人在这一步看到“Add TXT record error”就懵了其实多半是账号权限不够或者环境变量没设置对。首次配置建议手动测试一次确认能自动添加TXT记录后再批量签发。还有一点如果你在多个服务器上重复签发同一域名的通配符证书可能会遇到TXT记录缓存延迟问题。建议在脚本里加一点等待时间别一添加成功就马上验证至少等10秒再执行后续操作。5.3 过期时间速查表为了方便平时排查我把常用的查询命令整理成一张表存到本地笔记里随时参考。场景命令查看本地PEM证书到期时间openssl x509 -in cert.pem -noout -dates查看本地DER证书到期时间openssl x509 -in cert.cer -inform DER -noout -dates查看线上HTTPS证书到期时间openssl s_client -connect example.com:443 -servername example.com 2/dev/null | openssl x509 -noout -dates查看证书域名和签发者openssl x509 -in cert.pem -noout -subject -issuer检查证书和私钥是否匹配openssl x509 -noout -modulus -in cert.pem | openssl md5与openssl rsa -noout -modulus -in key.pem | openssl md5对比查看完整证书链openssl s_client -connect example.com:443 -servername example.com -showcerts转换DER为PEMopenssl x509 -in cert.cer -inform DER -out cert.pem命令行只用这几个基本能覆盖日常80%的问题。说回最初的问题SSL证书有效期缩短到200天免费证书并没有因此消失。真正需要改变的是你的“证书管理思路”。我个人的体会是与其纠结付费证书能买几年不如赶紧把自动化续期和到期监控搭起来。用acme.sh配合Let’s Encrypt90天的免费证书也能跑得很稳再写几条简单的命令行检查挂在cron或systemd timer里证书到期这种事基本就不用再操心了。最后再分享一个小技巧续期脚本执行完之后最好顺手做一次自动化验证比如用openssl s_client抓线上证书的指纹和本地新证书比对不一致就发告警。这样既能确认脚本真的生效又能在服务出问题前第一时间发现。证书这事看着小出问题时代价都不小早点把流程跑顺以后能少挨很多骂。
返回列表