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

资讯详情

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

2025年HTTPS证书怎么选?免费DV证书真的够用吗?

2025年HTTPS证书怎么选?免费DV证书真的够用吗? 不卖关子先直接说结论2025年还在给普通域名买付费DV证书大概率是花冤枉钱。我自己管着几十个域名从个人博客到线上业务的API网关都用过这里面坑没少踩、经验也没少攒。今天掏心窝子聊清楚一件事——https证书到底哪些场景必须花钱、哪些场景白嫖更香、免费方案怎么选怎么配才算真正落地。先说个常见误区很多人一提免费证书脑子里还是“三个月一续、配置麻烦、容易被浏览器弹红锁”的旧印象。这印象不怪你好几年前免费证书的体验确实一般但现在的免费CA证书颁发机构已经成熟到能撑起主流生产环境了。很多大厂内部几百个服务都在跑Lets EncryptGoogle自己的CDN也在签发免费证书。你说你一个小网站还在买一年几百块的DV证书图啥呢这篇文章我分四块讲先搞清楚你买证书到底在为什么买单再对比现在主流免费方案怎么选然后走一遍从申请到自动续期的完整实操最后把我这几年踩过的坑一条条列出来。不整虚的全是能直接拿去用的东西。1. 先搞清楚证书到底在卖什么1.1 证书不是一张纸是一条信任链很多人以为HTTPS证书就是“加密文件”装上就能绿锁。其实证书本事没那么玄它的核心价值是建立信任链你访问的网站声称自己是example.com凭什么信它浏览器会去找CA要一个担保CA说“我验证过这个域名确实是这个人的”然后签一张带数字签名的证明。浏览器验证完签名链确认无误才把锁头给你亮绿。这整条链上有几个关键角色叶子证书签给你的实际域名、中间证书CA拿来签叶子证书的、根证书内置在浏览器和操作系统里的信任锚点。免费和付费证书在这条链上的行为方式一模一样没有说付费的链路就更“牢”一说。那付费到底买了啥分三种DV只验证域名所有权几十到几百块一年、OV验证企业组织信息几百到几千、EV最顶级的严格企业验证几千起步。关键点来了——如果你是个人站长、中小企业官网、SaaS后台、API接口你买的绝大多数就是DV证书而DV证书的验证强度和免费证书的DV完全同级都是验证你确实拥有这个域名仅此而已。1.2 付费和免费的差价差在哪我做过一个定价对比把主流渠道的价格拉出来看差距非常直观证书类型典型年费单域名验证级别适用场景付费DV50-500元不等域名所有权个人/中小企业官网、API域名付费OV500-3000元组织身份域名企业官网、需要展示公司信息的场景付费EV3000-10000元最严企业审核金融、政务、大品牌官网免费DVLets Encrypt等0元域名所有权绝大多数Web服务、API、个人站看出门道没有真正的差价核心在OV和EV——人家卖的是企业身份背书和浏览器里的企业名展示不是加密本身。而DV这块免费的和付费的技术本质几乎一致连加密强度都一样是TLS标准。很多小公司买一年三四百的赛门铁克或GlobalSign单域名DV除了花钱买个心理安慰没有获得任何额外的技术安全增益。一句话总结你买的DV付费证书约等于给超市里一块钱一瓶的矿泉水换个十块钱的包装瓶。水是一样的水就看你要不要为包装溢价买单。2. 免费证书怎么选主流方案对比与选型逻辑2.1 Lets Encrypt社区驱动的默认选择Lets Encrypt大概是目前免费CA里最出名的背后有Linux基金会、Mozilla、EFF等支持市场份额在免费证书里占了绝对大头。它的优势不只是免费而是自动化协议——CA和客户端之间通过ACME协议自动完成申请、验证、签发、续期全程能脚本化。Lets Encrypt的证书有效期是90天。很多人一听“90天”就头大其实这是设计出来的不是缺点。证书有效期越短一旦私钥泄露危害窗口越小过期证书也没法被滥用太久。配合自动续期90天反而是“无感”的——你只需要在服务器上配好cron或systemd定时任务证书到期前它自己就续了。它家的限制也值得提前知道单域名证书每周申请限制约50张多域名SAN或通配符证书限制会更紧一些。虽然对绝大多数场景够用但别写脚本去疯狂申请后面我会细讲限流这个大坑。2.2 ZeroSSL、Google Trust Services和其他备选除了Lets Encrypt现在能打的免费CA还有几个。ZeroSSL特点是签发快、控制台友好、免费额度用起来灵活。它也给付费方案主要卖点是一年有效期的通配符证书和更多API调用额度但免费那档已经足够日常用。ZeroSSL兼容ACME协议certbot和acme.sh都原生支持它。Google Trust ServicesGoogle自己搞的CA2024年起正式开放免费证书签发走ACME协议。背靠大厂基础设施稳而且已经在Google Cloud CDN里大规模自用。目前支持DV级别90天有效期适合喜欢“大厂出品”的人。还有BuyPass Go之类的小众CA免费但控制台简陋、文档少不推荐新手碰。之前国内一些云厂商也提供一年期免费DV证书不过很多后来收紧成3个月还得手动去控制台点申请费劲不说还容易忘续期翻车。我自己的结论是能ACME自动化的CA优先级永远高于要手动点的免费证书。2.3 什么场景必须付费什么场景直接免费我不是说付费证书一无是处具体问题要具体分析。必须买付费OV/EV的场景有这些金融、政务、银行类站点监管有要求大型品牌官网浏览器地址栏要显示企业名这是品牌信任的一部分内部有合规审计要求、需要CA出具企业实体审核报告的。而以下这些场景我是真觉得没必要花那钱个人博客、作品集中小企业的展示官网又不靠地址栏企业名吃饭SaaS后端的API域名测试环境、预发布环境CDN节点域名CDN平台本身就经常帮你签免费证书。我自己手头有个客户是做垂直电商小平台的之前每年花800块买两张DV证书还分主站和API站两个域名。我给他全切到Lets Encrypt之后一年省1600运行一年半没出过一次证书相关问题。你说省下来这钱买几台轻量服务器它不香吗3. 从申请到自动续期免费HTTPS全流程实操3.1 验证方式选哪个HTTP验证还是DNS验证要申请证书CA必须先确认你拥有这个域名。ACME协议里主流验证方式两种HTTP-01和DNS-01。HTTP-01是这么玩的CA给你一段随机token要求你在网站的某个URL路径http://你的域名/.well-known/acme-challenge/token放上对应内容CA通过HTTP访问这个地址能访问到就算验证通过。优点是配置简单、适合单机单域名缺点是必须开放80端口、没法签发通配符证书、多台服务器做负载均衡时还得保证能正确路由到对应文件。DNS-01则要求你在域名的DNS解析记录里加一条TXT记录CA去查询DNS确认这条记录存在就算验证通过。它的一大优势是能签通配符证书*.example.com而且不需要对外开放任何端口缺点是要求你能控制域名DNS并调用DNS服务商的API或者手动添加TXT记录。实操选型的逻辑很简单有API控制权的DNS服务商无脑上DNS-01灵活且支持通配符没有API或不想碰DNS的单域名用HTTP-01最省事。3.2 certbotwebroot适合单机和静态站场景certbot是EFF官方推荐的ACME客户端配合Lets Encrypt使用很成熟。我习惯用--webroot模式它会在你指定的网站根目录下临时创建验证文件验证完成后自动清理不用动nginx配置。先装certbotsudo apt update sudo apt install certbot然后申请证书sudo certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com这条命令的意思把验证文件放到/var/www/example目录下同时为example.com和www.example.com两个域名申请一张SAN证书。跑完后证书会输出到/etc/letsencrypt/live/example.com/下其中fullchain.pem是完整的证书链privkey.pem是私钥。接下来在nginx里配置server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 其他站点配置... }别忘了把80端口跳到443否则用户输http会直接裸奔server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; }改完nginx配置记得reloadsudo nginx -t sudo systemctl reload nginx有个细节容易忽略fullchain.pem和privkey.pem所在目录默认权限是root:root且目录是700。nginx进程如果是用非root用户跑的可能读不到私钥。这时候需要把/etc/letsencrypt/live/目录权限放开一点或者给nginx用户加访问权限。我遇到过一次这问题排查半天最后就是权限导致的。3.3 acme.shDNS API通配符证书与多服务商场景certbot很优秀但它对DNS-01的支持偏手动通配符证书用起来更麻烦。如果你有通配符证书需求或者想支持几十家DNS服务商API自动化推荐用acme.sh。这是个纯shell实现的ACME客户端轻量、脚本友好、对国内主流DNS服务商支持很好。安装就一条命令curl https://get.acme.sh | sh -s email你的邮箱example.com安装后会创建~/.acme.sh/目录并自动配置好alias环境变量。以Cloudflare为例先设置API tokenexport CF_Token你的Cloudflare API Token export CF_Account_ID你的账户ID然后申请通配符证书acme.sh --issue --dns dns_cf -d example.com -d *.example.comacme.sh会自动调用Cloudflare API添加TXT记录、等解析生效、验证、再删记录全程不用你手动碰DNS面板。签完证书后它会提示你安装证书acme.sh --install-cert -d example.com \ --key-file /etc/nginx/cert/example.com.key \ --fullchain-file /etc/nginx/cert/example.com.pem \ --reloadcmd systemctl reload nginx这一步的含义是把证书复制到指定路径nginx配置引用这些路径并在续期成功后自动reload nginx让新证书生效。国内阿里云和腾讯云DNS也都有对应支持比如dns_ali和dns_dp设置好API密钥后用法一样。我自己的多个域名全挂在腾讯云DNS上直接用acme.sh一把梭半年多没出过岔子。3.4 自动续期把自己从“三个月一折腾”里解放免费证书最大的心理门槛就是续期。但实际上只要配置对你完全可以忘了证书这回事。certbot自带的续期机制是安装时自动创建systemd timer或cron任务默认每天检查两次在证书到期前30天内开始自动续期。你可以跑一下dry-run验证整个链路sudo certbot renew --dry-run看到输出里有Congratulations, all simulated renewals succeeded之类的字样就说明没问题。acme.sh的续期更简单它会在每次申请/续期成功后自动创建一个cron任务默认每天凌晨检查一次。想手动确认的话acme.sh --cron -f续期之后还有个经常被忽略的动作reload web服务器。证书文件虽然更新了但nginx或Apache如果不reload进程内存里还是旧的证书等到旧证书过期浏览器照样报警。acme.sh支持在安装阶段指定--reloadcmdcertbot的话如果你用的是--nginx插件模式它会自动处理但用--webroot模式就得自己在续期钩子里配。我习惯这做法sudo certbot renew --deploy-hook systemctl reload nginx这样只有续期真正成功时才会触发reload不会没事瞎重启服务。还有个稳妥的兜底在续期任务之外写一个健康检查脚本定期openssl s_client -connect yourdomain:443 -servername yourdomain抓证书过期时间如果剩余天数小于阈值就告警发邮件。虽然有点多此一举但对有强迫症的人来说这一层保险能让你睡得踏实。4. 千万别踩的坑免费证书常见问题实录4.1 疯狂申请被限流这是最冤的封禁ACME客户端虽然方便但CA都有申请频率限制。以Lets Encrypt为例之前有每周每域名50张证书的限制虽然现在已经宽松不少但如果你在同一域名上短时间反复申请、撤销、再申请很容易触发限流到时候不管你怎么跑命令一直都报rate limited错误。我的亲身体会是调试证书申请机制时千万别直接拿生产域名反复试验。Lets Encrypt提供了staging环境API地址和真正的环境分开频率限制宽松很多专门用来测试。用certbot测试时加一个--staging参数就行sudo certbot certonly --webroot -w /var/www/example -d example.com --staging等到staging环境验证没问题了再切回正式环境申请一次。这招真的能帮你避开最冤枉的“被封”剧情。另外补充一个细节现在Lets Encrypt对失败订单和pending订单也有限制如果你某个验证一直失败别急着反复重试先看日志排查原因。盲目重试只会让限流计数器涨得更快。真被限了也没太好的办法只能等一般按周恢复。4.2 证书链缺一环浏览器依然红锁有阵子我帮朋友排查一个“明明装了证书浏览器还是显示不安全”的问题。打开浏览器一看红色警告证书报错说不完整。服务器上证书文件确实存在内容也没损坏可就是红锁。问题就出在证书链不完整。很多人申请证书后只安装了叶子证书就是CA签给你域名的那张漏了中间证书。而浏览器要验证你的叶子证书是否被受信任的根CA信任需要完整拿到从叶子→中间→根一整条链。链断了浏览器就无法验证签发关系。规范的做法是使用fullchain.pem这个文件里同时包含叶子证书和中间证书nginx配置里的ssl_certificate一定指向它别只指到单独的cert.pem。用acme.sh时候也一样--fullchain-file比--cert-file更合适。验证证书链是否完整有个快方法openssl s_client -connect example.com:443 -servername example.com -showcerts看输出里是否有多层证书。如果只有一层就是缺中间证书。再配合openssl verify -CAfile检查完整性基本能定位问题。4.3 老设备的信任危机新版根证书不认旧系统免费证书还有一个隐蔽问题老版本系统不认新CA的根证书。比如Lets Encrypt换了新的中间证书后一些旧版CentOS、老款Android、老旧Windows系统里内置的根证书库没有相应更新就会导致这些设备访问你网站时证书校验失败。说实话这个问题出现的概率不算高但对特定用户群体是致命的。如果你网站的访客可能用老系统或老设备比如某些工业互联网场景、内网老客户端部署免费证书之前最好先测试兼容性。我处理过一个客户的设备预装的是2016年的Android系统访问Lets Encrypt签发的HTTPS接口直接解析失败最后只能给这个设备单独保留了一套付费证书老牌CA建的根证书在这些老设备里兼容性确实好一些其他现代设备全部走免费证书。这算是唯一一个付费证书有明显优势的角落老牌CA的根证书链更老、覆盖的设备更广。所以如果你的业务有大量传统客户端这个兼容性成本可能是要付的。评估的时候别一刀切免费哪怕免费用它90%剩下10%的老设备也是钱。4.4 续期是成功的但服务就是没生效证书续期成功但浏览器还是显示过期这个问题我在刚用Lets Encrypt那半年里遇到不下三次。每次排查到最后原因都很统一证书文件更新了Web服务器没有reload或者CDN层缓存了旧证书。先说CDN的场景。如果你的站点套了Cloudflare或阿里云CDN且启用了CDN的SSL/证书管理那你源站换证书只是第一步CDN边缘节点是否抓取到新证书是另一回事。有些CDN配置下边缘节点会长期缓存旧证书直到过期用户访问时看到的就是过期告警。解决办法是去CDN后台刷新/重新部署证书或者把CDN的“SSL模式”调整一下让它重新回源抓取。再说纯源站场景。nginx对证书文件的读取是启动时加载的reload会重新读取。如果reload没执行比如cron任务权限问题、deploy-hook配错了那源站依然用的是旧证书。这有一个很经典的排查技巧直接看进程里的证书有效期别只看磁盘上的文件。openssl s_client -connect example.com:443 -servername example.com -servername example.com 2/dev/null | openssl x509 -noout -dates看输出里的notAfter日期。如果显示的还是旧日期说明服务进程没有加载新证书。这时候先手动reload再查如果还不行就得检查进程是不是被某种方式锁住了我有一次是旧nginx进程没被杀干净新进程根本没起来端口还被旧的占着。4.5 另一个常见坑多域名一枚证书漏了一个申请SAN证书时如果不小心漏了某个子域名浏览器访问那个子域名照样报错。这个坑看着低级但实际操作中因为“觉得一定全加上了”而产生盲区。用certbot时-d参数列出的域名如果比较多最好在申请完成后逐个域名验证一遍。写个简单脚本循环检查for d in example.com www.example.com api.example.com static.example.com; do echo $d echo | openssl s_client -connect $d:443 -servername $d 2/dev/null | openssl x509 -noout -subject done看看每个域名拿到的证书subject是不是都包含自己。漏配域名这种事发现越晚影响越大尤其是哪天你突然加了个新子域忘了加进证书里线上直接一片红锁。免费证书的扩展玩法与一个小彩蛋聊完坑再给你们点实战乐趣。免费证书搭配自动续期还有一个玩法内网服务也能用公网信任的证书。只要你有域名且这个域名的DNS记录能配置成内网IP比如gitlab.example.com解析到172.16.0.5用DNS-01验证方式就能签出公网CA信任的证书内网机器访问时就再也不用点“继续访问”按钮了。这个操作我帮好几家公司搭过解决了不少内网工具链的“红色的不安全”问题同事们都觉得像变魔术。最后再说一个小技巧如果你用acme.sh且域名挂在Cloudflare平时申请证书时加个--keylength ec-256参数可以直接签出ECC证书。ECC密钥比RSA短很多TLS握手性能更好而且现代浏览器都支持。同样是免费的能白嫖到性能优化不拿白不拿。我在实际部署中最大的体会是证书的“免费”或“付费”不是重点有没有可靠的自动化体系才是重点。只要续期机制稳定、验证链路清楚、监控告警到位免费证书在绝大多数场景都足够硬。不要因为“三个月要续一次”就恐惧免费方案——真正该恐惧的是没有自动化体系还硬着头皮手动管理一堆证书那才是迟早要出事的玩法。
返回列表