当前位置: 首页 > news >正文

Ubuntu 22.04 下 Nginx 如何一键搞定 Let‘s Encrypt 证书?附自动续期脚本

Ubuntu 22.04 下 Nginx 极速部署 Let's Encrypt 证书全攻略

最近在帮几个创业团队部署线上服务时,发现很多开发者虽然知道 HTTPS 的重要性,但面对证书申请和配置还是望而却步。其实在 Ubuntu 22.04 上,用 Nginx 配合 Let's Encrypt 完全可以实现五分钟内完成 HTTPS 部署,而且后续维护完全自动化。本文将分享一套经过 50+ 服务器验证的极简方案,包含几个你可能不知道的实用技巧。

1. 环境准备与工具选型

在开始之前,我们先理清几个关键点。Let's Encrypt 作为非营利性证书颁发机构,提供的免费证书已被所有主流浏览器信任。其核心优势在于自动化工具链成熟,而 Certbot 正是其官方推荐的客户端工具。

必备条件检查清单

  • 已解析到服务器公网 IP 的域名(A 记录)
  • 服务器已开放 80 和 443 端口(临时开放 80 端口即可)
  • Nginx 基础配置已完成(至少有一个可访问的 HTTP 站点)

提示:如果使用云服务商,记得检查安全组规则是否放行相关端口。常见问题往往是防火墙阻拦而非配置错误。

安装 Certbot 时推荐使用 Snap 版本而非系统仓库版本,因为前者始终保持最新:

sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot

2. 一键证书获取的进阶技巧

常规教程都会教的基础命令是certbot --nginx,但实际生产环境中我们更需要这些增强参数:

sudo certbot --nginx -d example.com -d www.example.com \ --email admin@example.com \ --agree-tos \ --no-eff-email \ --redirect \ --hsts \ --uir

这个复合命令一次性完成了:

  • 为带 www 和不带 www 的域名申请证书
  • 自动配置联系邮箱(避免证书到期前无法通知)
  • 强制 HTTP 跳转 HTTPS
  • 添加 HSTS 安全头
  • 启用内容安全策略

常见问题排查表

错误现象可能原因解决方案
Could not bind to port 80Nginx 未运行或端口被占用启动 Nginx 或检查占用进程
DNS problem: NXDOMAIN域名解析未生效检查 DNS 解析状态
Too many requests同一域名申请超限(每周5次)改用临时域名测试

3. Nginx 配置深度优化

证书部署后,建议手动检查生成的 Nginx 配置(通常在/etc/nginx/sites-available/目录)。以下是几个值得添加的安全优化项:

ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...'; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 1.1.1.1 valid=300s;

这些配置实现了:

  • 会话复用减少 TLS 握手开销
  • 禁用不安全的 TLS 1.0/1.1
  • 启用 OCSP Stapling 提升验证速度
  • 使用现代加密套件

4. 自动化续期系统设计

虽然 Certbot 自带的renew命令可以处理续期,但在高可用场景下需要更健壮的方案。推荐使用这个增强版续期脚本:

#!/bin/bash echo "[$(date)] Starting cert renewal" >> /var/log/le-renew.log if /usr/bin/certbot renew --quiet > /dev/null 2>&1; then echo "[$(date)] Renewal succeeded" >> /var/log/le-renew.log systemctl reload nginx else echo "[$(date)] Renewal failed" >> /var/log/le-renew.log echo "Cert renewal failed" | mail -s "Cert Alert" admin@example.com fi

将其保存为/etc/cron.weekly/le-renew并赋予执行权限,比单纯用 crontab 的优势在于:

  • 详细日志记录便于排查
  • 失败时自动邮件告警
  • 与系统维护周期同步(每周执行)

5. 证书监控与告警系统

即使有自动续期,仍然建议设置监控。这里提供一个简单的 Prometheus 监控方案:

  1. 创建监控脚本/opt/le-monitor/check_cert.sh
#!/bin/bash domain="example.com" end_date=$(openssl x509 -enddate -noout -in /etc/letsencrypt/live/$domain/cert.pem | cut -d= -f2) end_ts=$(date -d "$end_date" +%s) now_ts=$(date +%s) days_left=$(( (end_ts - now_ts) / 86400 )) echo "cert_expiry_days{domain=\"$domain\"} $days_left"
  1. 配置 Node Exporter 的 textfile 收集器:
- job_name: 'node' static_configs: - targets: ['localhost:9100'] file_sd_configs: - files: - '/opt/le-monitor/cert_metrics.prom'
  1. 设置 crontab 每 6 小时更新一次指标:
0 */6 * * * /opt/le-monitor/check_cert.sh > /opt/le-monitor/cert_metrics.prom

这样就能在 Grafana 中直观看到证书剩余有效期,并设置 30 天阈值告警。

6. 多域名与通配符证书实战

对于需要管理多个子域名的场景,通配符证书是更好的选择。申请时需要 DNS 验证:

sudo certbot certonly \ --manual \ --preferred-challenges=dns \ -d *.example.com \ --server https://acme-v02.api.letsencrypt.org/directory

按照提示在 DNS 添加 TXT 记录验证所有权后,会生成适用于所有子域的证书。注意这种证书:

  • 需要每 3 个月手动更新(无法全自动)
  • 不支持裸域名(需单独申请 example.com)
  • 私钥安全性要求更高

建议将这类证书与具体业务证书分开管理,避免频繁更新影响核心业务。

http://www.jsqmd.com/news/548962/

相关文章:

  • BabelDOC终极指南:如何完美翻译PDF学术论文并保持原格式
  • 2025卡膜厂家Top10排行实测分享
  • 超级千问语音设计世界效果展示:听听这些用文字描述生成的惊艳语音
  • OpenAI Agents SDK避坑指南:常见问题与解决方案全解析
  • FPGA资源优化指南:use_dsp48和SIMD模式在Vivado中的实战技巧
  • 律所案件卷宗协作难泄露风险高?企业网盘选型必须知道的 3 个红线(含 5 款主流网盘实测)
  • 手把手教你用cesium-plot-js实现军事标绘图形回显(避坑指南)
  • 版本控制系统迁移指南:从SVN到Git的平滑过渡方案
  • 知网AIGC检测算法升级后怎么降AI率?2026最新降AI率方法全面解读
  • 从ResNet50到自定义CNN:手把手教你用TensorFlow训练自己的12类果蔬识别模型(Python实战)
  • Dify自动补全背后的秘密:如何用GPT-4和Llama提升意图识别准确率
  • OpenClaw+GLM-4.7-Flash:个人旅行计划自动生成与优化
  • 【从零开始】手写BLE协议栈(2-3)带着镣铐跳舞:nRF52 的 TIFS 硬件实现
  • 在eNSP中构建高可用网关:VRRP主备切换实战解析
  • 这家口腔机构,如何用AI把到院成本从1200+打到310元?
  • OpenClaw任务编排:Qwen3.5-4B-Claude复杂工作流设计指南
  • 别再纠结选哪个了!从零到一,手把手教你用Odoo 18的ORM快速搞定一个客户管理模块
  • 脑机接口数据集处理知识体系重构:从信号解码到临床转化
  • RePKG深度解析:Wallpaper Engine资源格式转换与逆向工程实战
  • 树莓派Pico RP2040 I2C实战:用AT24C02 EEPROM做个数据掉电保存的小项目
  • STM32实战:从零移植SOEM构建轻量级EtherCAT主站
  • FaceFusion实战指南:从零搭建超逼真换脸系统,解锁AI人脸编辑新玩法
  • 别再只跑Demo了!手把手教你用自建数据集训练YOLOv8垃圾检测模型(从数据标注到模型部署)
  • 终极指南:如何让普通鼠标在Mac上实现触控板级体验
  • OpenClaw数据安全方案:GLM-4.7-Flash本地模型处理敏感信息
  • Koikatsu Sunshine增强补丁终极指南:5大核心功能解析与完整部署方案
  • 利用Dify快速搭建Janus-Pro-7B智能应用:无需编码的AI工作流设计
  • 文科论文降AI率太难了?学姐亲测这几招降AI率方法真的管用
  • Step3-VL-10B-Base在C语言环境中的集成与应用
  • 微服务网关实战:一站式解决CORS跨域难题