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

资讯详情

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

免费SSL证书一键配置指南:从申请到自动续期全流程

免费SSL证书一键配置指南:从申请到自动续期全流程 做网站运维这些年被问得最多的技术问题里SSL证书配置绝对排前三。尤其是这两年浏览器对HTTP站点的“不安全”提示越来越强硬小锁标志成了用户判断网站是否可信的第一印象证书这件事已经从“可选项”变成了“必选项”。但很多朋友一听要申请证书、改服务器配置就以为得走收费证书的流程其实完全没必要。我自己的几个线上项目包括公司官网、接口服务、测试环境全部跑的免费证书最长的一个已经稳定运行两年多没出过问题。这篇文章就把我实际用的这一套“免费SSL证书一键配置”方案完整拆开讲从证书从哪来、怎么申请、怎么配到服务器上再到后续续期和监控一条线走完。如果你正在被“小锁标志”逼得焦头烂额或者因为证书过期线上突然变红而半夜惊醒看完这篇应该能踏实不少。1. 免费SSL证书从哪来主流渠道与实际选型1.1 免费证书的三大来源现在能拿到免费SSL证书的渠道归纳下来无非三个方向。第一个是云平台提供的免费版证书像阿里云、腾讯云都有长期免费的单域名证书一般有效期为3个月到期后在控制台重新申请、重新部署就行。这类证书的优势是申请流程极短因为在云平台内已经帮你把域名和DNS解析这些前置条件准备好了点几下就能签发适合对操作不太熟悉的新手。我早期刚接触的时候就拿这个练手体验确实很顺。第二个是Lets Encrypt这个全球性的证书签发机构它本身就是做免费证书的主打全自动化申请和续期证书有效期现在也是90天。配合acme.sh或certbot这类自动化客户端可以把申请、部署、续期全部写成脚本跑一次以后就能自动续期基本实现“永久免费”。目前我生产环境的主力证书都是走这条线配合脚本定时任务证书管理基本是零负担。第三个是部分面板和一键工具集成的申请入口比如宝塔面板里可以配置Lets Encrypt证书很多容器编排工具也有内置的ACME客户端。这类方案是把上面两种能力再封装一层适合不想碰命令行的朋友。需要提醒的是市面上的所谓“永久免费SSL证书”在严格意义上都不存在因为证书本身有有效期所谓永久其实是指“到期后自动化续期”这个流程让你感知不到证书在中途失效。这一点在选型时需要先建立认知免得到时候被“永久”两个字误导。1.2 证书类型选型单域名、多域名与通配符证书证书的覆盖范围分为三类选错很容易出问题。单域名证书只保护一个域名比如www.example.com它不能同时覆盖example.com不带www的根域名更不能覆盖其他子域名。如果你的站点只有一个访问入口单域名证书最省事、申请最快的也是它。多域名证书可以把多个不同的域名放到同一张证书里比如同时保护www.example.com、api.example.com、example.net适合一个项目下有多个域名入口的场景。但要注意多域名证书里每一个域名都要在申请时列清楚后续想加域名一般得重新签发。通配符证书也叫泛域名证书是覆盖某个域名下所有子域名的比如 *.example.com 可以保护 a.example.com、b.example.com但不保护example.com根域名本身。这类证书对子域名特别多的场景很友好比如你在一个域名下拆了多个服务api、admin、cdn一张通配符证书全搞定。Lets Encrypt和云平台都支持通配符证书但申请时通常要求用DNS方式校验要求你对域名解析有操作权限。我个人的经验是先说未来可能有哪些子域名再决定证书类型。如果只是给blog.example.com挂一个站点用单域名就够了如果知道自己接下来会在这个域名下拆好几个服务直接上一次通配符证书省得后面反复签发。1.3 渠道选择的实操考量选渠道的时候我建议关注三个点稳定性、续期自动化程度、安装复杂度。稳定性方面云平台免费版和Lets Encrypt都经过了大量生产环境验证作为免费方案它们的根证书和中间证书都内置在主流操作系统和浏览器信任链中不存在“不认证书”的兼容性问题。区别主要在于云平台免费版证书有效期短需要手动或半自动续期Lets Encrypt通过acme.sh这类工具可以实现全自动续期一旦跑通之后只需要在日志里确认“续期成功”即可。续期这件事是最容易被忽略的坑。证书过期一天网站就会恢复成“不安全”如果刚好赶上周末或者节假日线上业务直接受影响。所以我现在的做法是优先选择能自动续期的方案每天跑一次定时任务检查证书有效期快到期时自动续期、自动重载服务。如果你所在组织的流程不允许引入外部工具那至少要在日历上做提醒证书到期前一周就处理掉。安装复杂度上云平台控制台一般提供一键部署到云服务器或负载均衡不需要登录服务器操作适合没有服务器管理经验的情况。但如果你自己管理服务器用脚本工具部署到Nginx或Apache会更灵活也更容易在本地完成配置修改后统一发布。综合下来我给你的建议是如果你用的是云服务器先用云平台的免费版证书把流程跑通熟悉之后再切到acme.sh加Lets Encrypt的方案体验“全自动”带来的省心。接下来就详细说申请这一步。2. 证书申请与域名校验拿到第一张免费证书的全过程2.1 申请前的准备不管走哪个渠道申请SSL证书前有几样东西必须先准备好一个你拥有管理权的域名、该域名的DNS解析记录管理权限、一个能正常访问的网站或服务器。域名自不必说证书签发的目的就是给这个域名做身份认证。DNS解析权限很重要因为免费证书的签发机构需要验证“这个域名确实是你控制的”最常见的校验方式就是在DNS解析里加一条TXT记录或CNAME记录。你如果用的是阿里云DNS控制台里直接添加记录就能完成校验如果是第三方DNS服务商逻辑一样只是入口不同。还有一个容易被忽略的准备确认本机能访问到你的服务器。有些校验方式会要求签发机构从公网访问你网站根目录下的一个临时验证文件如果你的服务器有防火墙限制或者用了CDN但没配置好回源校验会一直失败。2.2 三种域名校验方式证书签发过程中的核心验证环节常见的有三种方式。DNS方式是去域名解析后台添加指定的TXT记录或CNAME记录告诉签发机构“这个域名我可以控制”。这种方式的优点是适用范围最广尤其适合申请通配符证书缺点是需要去解析后台操作等待DNS生效会有几分钟延迟。HTTP文件方式是在网站的指定目录下放置一个由签发机构随机生成的验证文件比如 http://example.com/.well-known/acme-challenge/xxx签发机构通过公网访问这个文件完成验证。这种方式不需要动DNS但要求服务器80端口能正常访问且目录路径可写。邮箱方式是通过域名WHOIS信息里的邮箱接收验证邮件点击邮件里的链接完成验证。由于现在很多域名隐私保护默认开启邮箱不一定能显示而且邮件有时会被丢进垃圾箱这种方式现在已经用得比较少。实际执行时acme.sh这类工具会自动完成验证文件的部署和清理不需要你手动去放文件DNS方式则需要你手动添加解析记录但通配符证书申请时也可以用DNS API自动添加。我的建议是能用DNS API自动校验就别手动这能省掉DNS生效等待的时间。2.3 自动续期配置用acme.sh把续期变成“一键”申请证书后真正复杂的是续期这件事。手动续期需要重复申请、下载、上传、重载服务步骤虽然不复杂但三个月做一次总有忘记的时候。所以我强烈建议直接用acme.sh把申请和续期做成脚本然后交给系统的定时任务跑。acme.sh的使用流程大致是先安装然后执行一条申请命令指定证书类型和域名。举个例子申请一个example.com的通配符证书命令大概是curl https://get.acme.sh | sh -s emailyour_emailexample.com acme.sh --issue -d *.example.com --dns dns_ali到了续期这一步acme.sh会自动为每个证书生成一个续期脚本你只需要让它配合定时任务执行即可。通常我是在服务器上添加一条cron任务每天凌晨检查一次0 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh /dev/null这样acme.sh每天检查所有证书距离到期不足30天时自动续期并调用reloadcmd重载Nginx。从我的实际操作经验看配置好这套流程之后证书管理这块基本就是“眼不见心不烦”唯一需要做的只是在日志里偶尔确认一下续期确实成功了。这里有一点必须强调acme.sh续期后需要重载Web服务器才能生效这个动作要在申请时配置好reloadcmd或者在续期脚本里加上重载命令。acme.sh --install-cert -d *.example.com --key-file /etc/nginx/ssl/example.key --fullchain-file /etc/nginx/ssl/example.pem --reloadcmd systemctl reload nginx这样续期完证书Nginx也自动重载了不会出现“文件更新了但服务还在用旧证书”的尴尬情况。3. 服务器端一键配置实操Nginx、Apache与其他场景3.1 Nginx配置两个server块搞定HTTPS跳转证书拿到手之后真正让网站变“绿色”的是服务器配置。目前自建服务器里Nginx的使用率最高我就先以它为例。Nginx启用HTTPS最核心的就是server块的修改。我一般会把配置拆成两个server块一个监听80端口负责把HTTP请求301跳转成HTTPS另一个监听443端口真正加载证书并处理请求。下面是一份我常用的配置模板server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.pem; ssl_certificate_key /etc/nginx/ssl/example.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; root /var/www/example; index index.html; location / { try_files $uri $uri/ 404; } }这里有几个参数值得说清楚。ssl_certificate指向的是证书文件一般用acme.sh生成的fullchain.pem它包含网站证书和中间证书这样做的好处是可以避免某些客户端因为缺少中间证书而报“证书链不完整”。ssl_certificate_key指向私钥文件这个文件权限一定要控制好我习惯将其设置为600或640并确保只有root和nginx用户可读。ssl_protocols限制TLS版本TLSv1.2和TLSv1.3是当前主流把早起的TLSv1.0、TLSv1.1都关掉兼容性影响不大但安全性提升明显。配置完成后记得执行nginx -t检查语法通过后再systemctl reload nginx使配置生效。这一步很多人会忘改完配置直接退出去结果网站还是旧的。3.2 Apache配置修改SSL虚拟主机配置段如果你的服务器用的是Apache流程也类似只是入口变成了sites-available下的SSL虚拟主机配置文件。开启SSL模块后在VirtualHost配置段里写明证书路径即可VirtualHost *:443 ServerName example.com DocumentRoot /var/www/example SSLEngine on SSLCertificateFile /etc/ssl/example/example.pem SSLCertificateKeyFile /etc/ssl/example/example.key SSLCertificateChainFile /etc/ssl/example/chain.pem Directory /var/www/example AllowOverride All Require all granted /Directory /VirtualHostApache里需要注意SSLCertificateChainFile这个配置项它用来指定中间证书链文件如果漏了有些手机浏览器会提示“证书不受信任”。但不同Apache版本对这个配置项的写法有差异新版本里有时需要把这部分内容直接合入SSLCertificateFile指向的文件中。最简单省事的做法是直接把nginx用的fullchain.pem内容配置到Apache的SSLCertificateFile里中间证书和网站证书放一起避免链不完整的问题。配置完同样要测试Apache的命令是apachectl configtest或httpd -t通过后重载服务。3.3 非Web场景Tomcat、Spring Boot与Node.js的证书集成证书不只是给Nginx和Apache用Java系的服务、Node.js服务同样需要而且这部分往往更难找教程。Tomcat和Spring Boot用的是Java KeystoreJKS或PKCS12格式证书签发下来是PEM格式直接给Java用是不行的需要先转换。我一般这样处理先用acme.sh签发PEM格式证书然后用openssl命令将其转换成PKCS12格式再导入到Java Keystore中。以Spring Boot内置的Tomcat为例最常见的做法是在配置文件里指定PKCS12证书路径server.port443 server.ssl.enabledtrue server.ssl.key-storeclasspath:keystore.p12 server.ssl.key-store-passwordchangeit server.ssl.keyStoreTypePKCS12 server.ssl.key-aliastomcat转换命令大致是openssl pkcs12 -export -in fullchain.pem -inkey example.key -out keystore.p12 -name tomcat -password pass:changeit这里的核心逻辑是JVM只认Java能加载的密钥库格式PEM必须先转换。很多人报错“找不到证书文件”大概率就是格式没对。如果你是Dubbo、Nacos这类Java生态组件需要开启HTTPS思路一样先把PEM转成PKCS12。Node.js则稍微特殊一点它可以直接读取PEM格式的证书不需要转换。Express或Fastify服务里用HTTPS模块加载证书即可const https require(https); const fs require(fs); const options { key: fs.readFileSync(/etc/nginx/ssl/example.key), cert: fs.readFileSync(/etc/nginx/ssl/example.pem) }; https.createServer(options, app).listen(443);这几种场景有个共同点私钥和证书文件一定要和代码仓库隔离别提交到Git里不然“免费证书”虽然不要钱但私钥泄露带来的安全成本是巨大的。4. 证书生命周期管理过期时间查看与监控告警4.1 Linux下查看证书过期时间的几种姿势证书配置完不是终点之后的“维护”才决定这事做得对不对。最大的坑就是证书过期很多线上事故的起因就是没人记得证书哪天到期。在Linux服务器上查看证书过期时间最直接的是用openssl命令。你不需要登录云控制台直接看本地证书文件就行openssl x509 -enddate -noout -in /etc/nginx/ssl/example.pem输出会显示类似notAfterMar 22 12:00:00 2025 GMT这就是证书的到期时间。如果想看更详细的信息可以加上-text参数还能看到证书的签发者、公钥算法、SANSubject Alternative Name列表等。SAN列表尤其重要它能帮你确认这张证书到底保护了哪些域名。查线上站点的证书过期时间可以用openssl s_client命令直接连接域名查看echo | openssl s_client -servername example.com -connect example.com:443 2/dev/null | openssl x509 -noout -enddate这招在排查问题的时候特别有用不用上服务器就能知道线上证书的实际状态。比如怀疑CDN节点缓存了旧证书跑一条命令就能验证。4.2 给证书加一个“闹钟”监控脚本与告警方案查看过期时间是个单次动作想让证书不裸奔还得建立持续监控。我的方案很简单写一个脚本每天检查证书到期天数少于30天就到企业微信、钉钉或邮件里发提醒。脚本的核心是利用openssl拿到期时间再和当前时间做差计算剩余天数。一个最小可用的示例#!/bin/bash CERT_FILE/etc/nginx/ssl/example.pem EXP_DATE$(openssl x509 -enddate -noout -in $CERT_FILE | cut -d -f2) EXP_EPOCH$(date -d $EXP_DATE %s) NOW_EPOCH$(date %s) DAYS_LEFT$(( (EXP_EPOCH - NOW_EPOCH) / 86400 )) if [ $DAYS_LEFT -lt 30 ]; then echo 证书将在 ${DAYS_LEFT} 天后到期 | mail -s SSL证书到期提醒 adminexample.com fi如果你的服务器上没配邮件服务最简单的替代方式是调webhook企业微信机器人和钉钉机器人都支持文本消息推送网上都有现成的curl示例。我现在的项目里甚至把这类脚本和acme.sh的定时任务合在了一起每天先检查如果剩余天数小于30天就触发续期续期后自动重载Nginx再把结果推送到群里。这套逻辑跑下来证书管理基本不需要人介入。4.3 多域名证书的生成与管理细节多域名证书在实际使用中有很多细节不少朋友以为申请一张多域名证书就一劳永逸结果发现加域名和续期都有讲究。先说生成多域名证书在申请时把多个域名用逗号分隔列出acme.sh的写法是在-d参数后跟多个域名acme.sh --issue -d example.com -d www.example.com -d api.example.com --webroot /var/www/example需要注意的是Lets Encrypt对每张证书的域名数量有限制免费版一般是100个以内普通场景完全够用。域名越多申请时的校验步骤也越多如果其中一个域名校验失败整张证书申请都会失败。管理方面多域名证书的续期是整张证书一起续的不能单独续某个域名。所以你如果频繁增删域名反而建议用单域名证书串起来每个站点独立续期互不影响。从运维角度讲证书粒度越小出问题时的影响面就越小。另外提醒一个细节多域名证书续期后之前配置好的Nginx、Apache里的证书文件内容已经变了但服务器不重载的话对外服务的还是旧证书。所以前面说的reloadcmd或手动重载动作要多域名证书尤其不能忘。我见过有人申请的是多域名证书配置了三个站点结果只重载了其中一个另外两个站点在证书到期后直接报错排查了半天才发现问题。5. 配置过程中最常见的问题与排查技巧实录5.1 高频报错证书链不完整、不匹配与权限问题我处理过的证书问题里有几类出现频率极高这里直接给你一份速查表。问题现象可能原因解决办法浏览器提示连接不是私密连接/证书链不完整缺少中间证书使用fullchain.pem或把中间证书内容合入证书文件证书无效/域名不匹配申请时域名与访问域名不一致确认证书SAN列表里包含所有访问域名Nginx启动报权限错误私钥文件权限过大将key文件chmod为600或640证书过期但配置文件没问题证书文件未更新或服务未重载确认续期后执行了reload安卓手机提示证书错误电脑正常部分客户端不支持某些TLS版本或加密套件检查ssl_protocols和ssl_ciphers配置去掉过旧协议证书链不完整这个问题最常见。原因在于有的证书签发机构只下发网站证书不附带中间证书。你用Nginx时如果只配置了站点证书文件没有配置中间证书电脑浏览器可能因为本地缓存了中间证书而正常手机上或新环境里就直接报错。解决办法就是开头说的直接用fullchain.pem它把网站证书和中间证书放在一个文件里从根上避免这个问题。5.2 部署完成后访问异常浏览器不认证书怎么办配置完HTTPS后有时候浏览器仍然显示不安全这时候先别急着怀疑证书有问题。我一般按这个顺序排查先看本机时间是否准确。如果你的系统时间不对浏览器会认为证书“不在有效期内”明明刚签发的证书也可能瞬间“过期”。这个原因看着低级实际踩到的人不少。然后看证书链是否完整再检查域名是否匹配。如果局域网内访问正常、外网访问异常多半是防火墙或者CDN配置问题需要确认443端口是否放行、CDN的SSL模式是否配置正确。还有一个容易被忽略的场景用了CDN却把证书配在源站CDN节点没同步更新证书。这种情况下你直接访问源站一切正常但从浏览器访问时会打中CDN节点拿到的是CDN缓存里的旧证书。排查方法就是前面说的openssl s_client命令直接看线上443端口返回的证书是不是最新的。5.3 免费与收费证书的实际差异与选择建议免费证书用得好好的为什么还有人买收费证书两者的差异主要在三个层面。第一是有效期的长短。免费证书普遍是90天或3个月续期频率高必须依赖自动化或严格的提醒机制收费证书可以买一年甚至更久适合没有自动化运维能力、也不想手动折腾的团队。第二是支持范围和定制能力。收费证书通常可以提供更多的SAN域名数量、支持更复杂的证书策略一些企业级场景还需要特定类型的证书如OV或EV证书这些免费方案覆盖不了。第三是品牌背书和售后。收费证书在浏览器地址栏可能展示公司名称EV证书但现在的浏览器对EV证书的展示样式已经弱化实际带来的“信任溢价”比早年小很多。售后方面收费证书通常有客服支持能帮忙处理兼容性问题。我的建议很简单个人站点、中小项目、测试环境直接用免费证书配合自动续期稳定性完全够银行、电商这类对合规和品牌背书要求极高的场景再考虑付费的OV/EV证书。别为了“付费更安心”而盲目升级更重要的是把证书生命周期管理这事做扎实。根据我个人经验把免费SSL证书玩明白了技术难度并不高真正拉开差距的是运维意识申请完要记得部署部署完要记得自动续期续期完要记得重载每一步都有对应的细节。掌握这套思路之后不管以后用的证书是来自云平台还是Lets Encrypt不管服务器是Nginx还是Apache你都会发现证书配置这件事其实就是“先搞定申请再搞定部署再搞定续期”这三板斧。这里最后再分享一个小技巧建议你把证书相关文件全部统一放到一个目录比如/etc/ssl/下按域名建子目录和站点配置、备份策略放在一起管理这样排查问题时路径永远不迷路。
返回列表