网站刚上线一周,早上打开手机发现客户群里有三个人在说"你们网站打不开了"。第一反应是服务器挂了,SSH连上去CPU和内存都正常,Nginx在跑,但浏览器就是显示"您的连接不是私密连接"。查了十分钟才发现是Let's Encrypt的90天免费证书过期了,宝塔面板的自动续期cron任务不知什么时候被关掉了。更离谱的是,当时在宝塔点"申请"只花了3秒就重新签发了,证书部署后网站立刻恢复,但这十分钟里已经有7个客户发消息说"以为你们公司倒闭了"
SSL证书配完不等于完事了
一个完整的SSL证书生命周期是:选类型 → 申请 → 部署 → 强制HTTPS → 修复混合内容 → 配置HSTS → 自动续期 → 定期检查。大多数翻车发生在以为"部署完就完事了"之后——证书过期了没人知道、页面引了一张HTTP图片导致绿锁变灰、续期脚本被误删了三个月才发现。
这篇文章把八个环节从头到尾拆一遍,每个环节该用什么工具、最容易在哪个节点翻车、翻车了怎么救。
DV够用吗?OV值不值?EV是不是智商税?
先把这个最基础的问题说清楚:DV/OV/EV三种证书的加密强度完全一样,区别只在于CA机构验证了多少你的身份信息。打个比方:DV证书相当于你拿身份证拍了张照发过去,CA说"好,域名是你注册的,给你发证";OV证书相当于你还提交了营业执照、公司地址,CA打电话核实了你的公司确实存在;EV证书相当于连公司章程、股东信息都审查了一遍。
一句话选型:个人博客、企业展示站、内容资讯站——Let's Encrypt免费DV证书完全够用,浏览器小锁和付费DV证书一毛一样。如果你的网站涉及用户注册、在线支付、会员信息,上OV证书,不是因为加密更强,而是因为用户可以点击小锁查看你的企业名称,这是反钓鱼最直接的信任信号。银行、支付、证券——EV证书,这是监管合规要求,不是你想不想的问题。

关于域名覆盖范围还有一个选择:如果你的域名有多个子域名(blog.example.com、shop.example.com、api.example.com),买一张通配符证书(*.example.com)比买多张单域名证书便宜得多。如果多个完全不同的主域名(example.com、example.cn、example.co.uk),用多域名证书。
宝塔面板申请Let's Encrypt:3秒签发,但5个前提条件有一个不满足就失败
宝塔面板是中文站长群体里SSL配置门槛最低的方案。路径:网站 → 选中域名 → SSL → Let's Encrypt → 勾选域名 → 申请。3秒后证书就部署好了,勾上"强制HTTPS"就全部搞定。
但这个"3秒签发"有五个前提条件,任何一个不满足都会申请失败——而且宝塔的错误提示往往只有一个含糊的"验证失败,请检查域名解析"。
| # | 前提条件 | 检查方法 | 没满足的表现 |
|---|---|---|---|
| 1 | 域名已解析到服务器IP | ping 你的域名 | 验证请求发到了错误IP,Let's Encrypt找不到验证文件 |
| 2 | 80端口防火墙已放行 | 宝塔安全页+云厂商安全组 | HTTP验证请求被防火墙拦截,超时 |
| 3 | 网站已创建且80端口正常响应 | 浏览器访问 http://域名 | Nginx/Apache没绑定这个域名 |
| 4 | /.well-known/目录可公开访问 | 检查网站根目录是否有这个文件夹 | 伪静态规则或CDN拦截了验证路径 |
| 5 | 未超过Let's Encrypt频率限制 | 等一小时再试 | 每小时每个域名最多申请5次,超过就报错 |
第4条是最容易被忽略的。如果你用了CDN(Cloudflare、阿里云CDN等),Let's Encrypt的HTTP验证请求打不到你的源服务器,而是被CDN节点拦截了。解决方案:申请证书时暂时关闭CDN的代理模式(Cloudflare里把橙色云朵点灰),等证书签发部署好之后再开回来。或者用DNS验证方式代替HTTP验证——宝塔面板也支持DNS验证,但需要手动添加TXT记录,比HTTP验证多一步。
Nginx手动配置:三步拿到SSL Labs A+评分
如果不用宝塔,纯手动在Nginx上配置SSL证书,核心是三步:拿到证书文件 → 配置Nginx → 安全加固。
/etc/nginx/conf.d/example.com.conf
# 80端口 → 强制跳转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/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# 安全加固(TLS 1.2/1.3,禁用旧协议)
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;
ssl_prefer_server_ciphers on;

# OCSP Stapling(减少TLS握手延迟)
ssl_stapling on;
ssl_stapling_verify on;
# HSTS(强制浏览器只用HTTPS访问)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
root /var/www/example.com;
index index.html index.php;
}
这个配置跑完 nginx -t && nginx -s reload,去 SSL Labs(ssllabs.com)测一下,TLS 1.2/1.3 + 现代密码套件 + OCSP Stapling + HSTS 四项全开,评分就是A+。如果少了OCSP Stapling或用了旧密码套件(如包含RC4、3DES),评分会掉到B或C。
六个翻车场景,个个都是真实发生过的事
翻车一:证书过期,自动续期根本没跑
宝塔面板的Let's Encrypt自动续期依赖cron任务。如果你重装过系统、迁移过面板、或者手动清理过crontab,续期任务可能已经不在了。检查命令:crontab -l | grep acme,如果没输出,续期脚本已经丢了。手动补一句:"/www/server/panel/tool/acme.sh" --cron --home "/www/server/panel/vhost/acme" 加到crontab里,每天凌晨跑一次。
翻车二:绿锁变灰,因为一张产品图走了HTTP
SSL证书部署正确、强制HTTPS开了、地址栏也显示HTTPS——但小锁是灰色的,旁边有个感叹号。F12打开Console,看到一行黄色警告"Mixed Content: The page was loaded over HTTPS but requested an insecure image"。排查方法:浏览器开发者工具 → Security标签 → 查看非安全来源。根源通常是WordPress文章里插入的图片链接是绝对路径http://,或者在主题设置里填的Logo地址是http://。
翻车三:中间证书没配,手机能打开电脑打不开
服务器只配置了网站证书(cert.pem),没配中间证书(chain.pem)。结果:Chrome桌面端报"NET::ERR_CERT_AUTHORITY_INVALID",但手机Safari能打开——因为手机系统预置了中间证书而桌面端没有。修复:把fullchain.pem(网站证书+中间证书拼接)而不是cert.pem配置到ssl_certificate指令里。
翻车四:WordPress换域名后全站图片走HTTP
网站从HTTP升到HTTPS后,WordPress数据库里存了几百条带http://的图片链接。手动改数据库怕搞坏序列化数据,用插件最安全。Really Simple SSL免费版一键检测并修复混合内容,Better Search Replace可以批量替换数据库里的http://为https://(但注意序列化数据要勾选"序列化安全"选项)。
翻车五:CDN开了HTTPS但源站是HTTP,无限重定向
Cloudflare开启了"Always Use HTTPS",但源站的Nginx也配了HTTP→HTTPS 301跳转。用户请求到达CDN → CDN强制HTTPS → 请求转发到源站 → 源站又做了一次301 → CDN收到301后再发HTTPS请求 → 无限循环。浏览器显示"重定向次数过多"。解决方案:CDN和源站只在一端做强制HTTPS跳转,另一端关掉。通常让CDN做,源站不跳转。
翻车六:SSL配好了但百度收录的还是HTTP版本
网站上线HTTPS后,百度搜索结果的链接还是http://开头。用户点进来先经过301跳转到https://,多了一次网络往返,而且百度对301跳转的权重传递不是100%。解决办法:去百度站长平台(ziyuan.baidu.com)做站点改版——把HTTP版本改版到HTTPS版本,通知百度所有收录链接统一更新。Google方面在Search Console里添加HTTPS版本的新资源,然后做地址变更。这个过程通常需要2-4周才能全部更新完毕。
自动续期:三条防线确保证书永远不会再过期
Let's Encrypt证书90天有效期是故意的——设计理念就是"短有效期+强制自动续期"比"长有效期+人工记得续费"更安全。但如果自动续期脚本挂了,90天一晃就过去了。
三道防线
防线一:宝塔面板内置续期
宝塔默认在crontab里配置了每天凌晨运行的acme.sh续期任务。确认它存在:crontab -l | grep acme。如果不存在,宝塔面板 → 计划任务 → 添加Shell脚本 → 填入acme.sh续期命令 → 每天执行一次。
防线二:外部监控+告警
免费工具:UptimeRobot(uptimerobot.com)不仅可以监控网站是否在线,还可以监控SSL证书到期时间,到期前30天/14天/7天/1天分别发邮件告警。免费版支持50个监控项。另一个选择:SSL Certificate Expiry Monitor(Chrome插件),一键添加所有需要监控的域名。
防线三:日历提醒
Let's Encrypt证书每90天续期一次,在你的日历里设一个每80天重复的提醒:"检查所有站点SSL证书有效期"。自动化工具可能出bug,但你的日历提醒不会——这是最后一道物理防线。
不同场景的SSL配置方案
SSL证书配置这件事,技术门槛已经降到了历史最低——宝塔面板3秒签发Let's Encrypt,Cloudflare免费CDN自带SSL,WordPress有Really Simple SSL一键修复混合内容。翻车的根因几乎从来不是"不知道怎么配",而是配完之后忘了维护:证书过期了没人知道、自动续期脚本被误删了三个月才被发现、一张HTTP图片让全站绿锁变灰但没人检查过。把自动续期确认、UptimeRobot监控、日历提醒这三道防线全部设好,SSL证书才算真正配完了。
