news 2026/4/15 11:59:42

SSL证书踩坑与自动续期:半夜被叫醒的教训

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SSL证书踩坑与自动续期:半夜被叫醒的教训

凌晨2点,告警电话响了。

“网站打不开,显示证书过期。”

一看日历,证书有效期90天,刚好今天到期。忘续了。

从那以后,我把所有证书都做了自动续期。整理一下踩过的坑。

常见的坑

坑1:证书过期

这是最常见的问题。证书有有效期,过期了浏览器就报错。

检查方法:

# 查看证书过期时间openssl s_client -connect example.com:443 -servername example.com2>/dev/null|openssl x509 -noout -dates# 输出notBefore=Dec2300:00:002024GMTnotAfter=Mar2223:59:592025GMT

或者用这个一行命令:

echo|openssl s_client -connect example.com:4432>/dev/null|openssl x509 -noout -enddate

坑2:证书链不完整

现象:PC浏览器正常,手机浏览器报错。

# 检查证书链openssl s_client -connect example.com:443 -servername example.com# 正常应该显示完整的证书链Certificate chain0s:/CN=example.com i:/C=US/O=Let's Encrypt/CN=R3 1 s:/C=US/O=Let's Encrypt/CN=R3 i:/C=US/O=Internet Security Research Group/CN=ISRG Root X1

如果只有0没有1,说明中间证书没配。

解决:

# 下载中间证书,拼到一起catexample.com.crt intermediate.crt>fullchain.crt

Nginx配置:

ssl_certificate /etc/nginx/ssl/fullchain.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key;

坑3:证书和域名不匹配

# 检查证书包含的域名openssl x509 -in cert.crt -noout -text|grep-A1"Subject Alternative Name"# 输出X509v3 Subject Alternative Name: DNS:example.com, DNS:www.example.com

如果访问api.example.com,但证书只包含example.com,就会报错。

解决:申请泛域名证书*.example.com

坑4:私钥和证书不匹配

# 检查私钥和证书是否匹配openssl x509 -noout -modulus -in cert.crt|md5sum openssl rsa -noout -modulus -in private.key|md5sum# 两个md5值应该一样

如果不一样,说明证书和私钥不是一对,需要重新申请。

坑5:多域名证书配置错误

一个证书包含多个域名,但Nginx配置错了。

# 错误:每个server block用不同证书 server { server_name example.com; ssl_certificate /etc/nginx/ssl/example.crt; } server { server_name api.example.com; ssl_certificate /etc/nginx/ssl/api.crt; # 应该用同一个 } # 正确:多域名证书只需要配一次 server { server_name example.com www.example.com api.example.com; ssl_certificate /etc/nginx/ssl/fullchain.crt; # 包含所有域名的证书 }

Let’s Encrypt自动续期

Let’s Encrypt的证书90天过期,必须做自动续期。

安装certbot

# Ubuntu/Debianaptinstallcertbot python3-certbot-nginx# CentOSyuminstallcertbot python3-certbot-nginx

申请证书

# 自动配置Nginxcertbot --nginx -d example.com -d www.example.com# 或者只申请证书,自己配置certbot certonly --nginx -d example.com

手动续期

# 测试续期(不会真的续期)certbot renew --dry-run# 真正续期certbot renew

自动续期

certbot安装后会自动创建定时任务,但建议检查一下:

# 查看定时任务systemctl list-timers|grepcertbot# 或者查看croncat/etc/cron.d/certbot

如果没有,手动添加:

# 每天凌晨2点检查续期02* * * root certbot renew --quiet --post-hook"systemctl reload nginx"

--post-hook是续期成功后执行的命令,用来重载Nginx。

续期失败排查

# 查看日志tail-100 /var/log/letsencrypt/letsencrypt.log# 常见原因# 1. 80端口被占用,验证失败# 2. DNS解析不对# 3. 防火墙拦截了验证请求

acme.sh自动续期

比certbot更轻量,纯shell实现。

安装

curlhttps://get.acme.sh|shsource~/.bashrc

申请证书

# 使用DNS验证(推荐,不需要80端口)exportAli_Key="your_key"exportAli_Secret="your_secret"acme.sh --issue --dns dns_ali -d example.com -d"*.example.com"# 使用HTTP验证acme.sh --issue -d example.com -w /var/www/html

安装证书

acme.sh --install-cert -d example.com\--key-file /etc/nginx/ssl/example.key\--fullchain-file /etc/nginx/ssl/fullchain.crt\--reloadcmd"systemctl reload nginx"

acme.sh会自动设置定时任务续期。

证书监控

续期做好了,还要有监控兜底。

脚本监控

#!/bin/bash# check_ssl.shDOMAINS="example.com api.example.com"ALERT_DAYS=7WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxx"fordomainin$DOMAINS;doexpire_date=$(echo|openssl s_client -connect ${domain}:443 -servername ${domain}2>/dev/null|openssl x509 -noout -enddate|cut-d=-f2)expire_ts=$(date-d"${expire_date}"+%s)now_ts=$(date+%s)days_left=$((($expire_ts-$now_ts)/86400))if[$days_left-lt$ALERT_DAYS];thencurl-s -H"Content-Type: application/json"\-d"{\"msgtype\":\"text\",\"text\":{\"content\":\"[证书告警]${domain}还有${days_left}天过期\"}}"\$WEBHOOKfiecho"${domain}: 剩余${days_left}天"done

加到crontab每天跑一次:

09* * * /opt/scripts/check_ssl.sh

Prometheus监控

用blackbox_exporter:

# blackbox.ymlmodules:https_2xx:prober:httphttp:valid_http_versions:["HTTP/1.1","HTTP/2"]valid_status_codes:[200]tls_config:insecure_skip_verify:false
# prometheus.yml-job_name:'ssl_expiry'metrics_path:/probeparams:module:[https_2xx]static_configs:-targets:-https://example.com-https://api.example.comrelabel_configs:-source_labels:[__address__]target_label:__param_target-source_labels:[__param_target]target_label:instance-target_label:__address__replacement:blackbox_exporter:9115

Grafana面板告警:

# 证书剩余天数 probe_ssl_earliest_cert_expiry - time() < 86400 * 7

多服务器证书同步

如果有多台服务器用同一个证书,续期后需要同步。

方案一:rsync同步

#!/bin/bash# sync_ssl.shSERVERS="10.0.0.2 10.0.0.3 10.0.0.4"CERT_PATH="/etc/nginx/ssl"forserverin$SERVERS;dorsync-avz${CERT_PATH}/ root@${server}:${CERT_PATH}/sshroot@${server}"systemctl reload nginx"done

方案二:共享存储

证书放在NFS/对象存储上,所有服务器挂载同一个目录。

方案三:配置中心

把证书存在配置中心(Consul、Nacos),服务启动时拉取。

运维小技巧

我们有几台Web服务器在不同城市,证书统一管理比较麻烦。

用星空组网把所有服务器组到一起后,用Ansible一个命令就能把证书同步到所有节点:

ansible webservers -m copy -a"src=/etc/nginx/ssl/ dest=/etc/nginx/ssl/"ansible webservers -m shell -a"systemctl reload nginx"

HTTPS最佳配置

顺便提一下Nginx的HTTPS优化配置:

# SSL配置 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 off; # Session复用 ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets off; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # HSTS add_header Strict-Transport-Security "max-age=63072000" always;

总结

问题原因解决方案
证书过期忘了续期自动续期+监控告警
证书链不完整缺少中间证书fullchain配置
域名不匹配证书不包含该域名泛域名证书
私钥不匹配证书和私钥不是一对重新申请
手机报错PC正常证书链问题检查中间证书

证书管理核心:

  1. 自动续期是必须的
  2. 监控告警是兜底
  3. 多服务器要有同步机制
  4. 定期检查证书状态

别等凌晨被叫醒才想起来。


有SSL相关经验欢迎交流~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 15:22:22

从零实现施密特触发器:基于运放的硬件实践

从零实现施密特触发器&#xff1a;一次深入运放核心的硬件实践你有没有遇到过这样的问题——一个看似简单的传感器信号&#xff0c;接入单片机后却频频误触发&#xff1f;明明只按了一次按键&#xff0c;系统却记录了三四次&#xff1b;温度缓慢上升时&#xff0c;ADC读数像抽风…

作者头像 李华
网站建设 2026/4/11 17:40:41

【Open-AutoGLM插件安装全指南】:从零配置到高效运行的5大核心步骤

第一章&#xff1a;Open-AutoGLM插件安装概述Open-AutoGLM 是一款基于 AutoGLM 架构开发的开源自动化机器学习插件&#xff0c;旨在简化大语言模型在垂直场景中的部署与调用流程。该插件支持多种主流框架集成&#xff0c;提供命令行与API双模式操作接口&#xff0c;适用于本地开…

作者头像 李华
网站建设 2026/4/8 2:26:59

Open-AutoGLM沉思MCP落地难题全解析,90%团队忽略的3个致命陷阱

第一章&#xff1a;Open-AutoGLM沉思MCP落地难题全解析在大模型与自动化系统深度融合的背景下&#xff0c;Open-AutoGLM作为基于GLM架构的开源自动推理框架&#xff0c;其与MCP&#xff08;Model Control Protocol&#xff09;协议的集成面临多重现实挑战。协议语义不一致、控制…

作者头像 李华
网站建设 2026/4/14 9:12:35

Dify企业级实战深度解析 (20)

一、学习目标作为整个系列课程的终极收尾篇&#xff0c;本集核心目标是实现 “知识体系闭环、实战问题清零、进阶路径明确、职业发展落地”&#xff1a;系统梳理全系列核心技能与知识脉络&#xff0c;复盘企业级项目实战中的关键难点与解决方案&#xff0c;解答学习与落地中的高…

作者头像 李华
网站建设 2026/4/13 18:05:19

Open-AutoGLM设备选择难题,一文解决算力、存储与扩展性三大瓶颈

第一章&#xff1a;Open-AutoGLM设备需求概述 Open-AutoGLM 是一款面向自动化代码生成与模型推理的开源框架&#xff0c;其运行依赖于特定的硬件与软件环境配置。为确保系统稳定运行并充分发挥性能&#xff0c;部署前需满足一系列基础设备要求。 硬件配置建议 CPU&#xff1a…

作者头像 李华
网站建设 2026/4/4 14:26:43

还在用云端跑GLM?Open-AutoGLM本地部署教程来了,隐私+低延迟一步到位

第一章&#xff1a;Open-AutoGLM本地部署的时代已来随着大语言模型技术的飞速发展&#xff0c;Open-AutoGLM 作为一款开源、可定制的自动化语言生成工具&#xff0c;正逐步成为企业与开发者本地化部署的首选方案。其灵活性、隐私保护能力以及对离线环境的支持&#xff0c;使得在…

作者头像 李华