三分钟免费部署SSL通配符证书:Let‘s Encrypt+Nginx实战指南

📅 发布时间:2026/8/17 16:51:22
三分钟免费部署SSL通配符证书:Let‘s Encrypt+Nginx实战指南
你的网站还在用 HTTP 裸奔吗当 Chrome 浏览器将 HTTP 站点标记为“不安全”当微信小程序强制要求 HTTPS 后端当搜索引擎明确表示 HTTPS 是排名加分项时为网站部署 SSL 证书已不再是“加分项”而是“必选项”。但问题来了一个主站加多个子域名难道要为www.example.com、api.example.com、blog.example.com每个都单独申请、部署、续费一次证书吗这不仅管理繁琐成本也直线上升。这正是 SSL 通配符证书要解决的核心痛点——一张证书保护主域名及其所有同级子域名。本文要带你搞定的就是如何快速、免费地获取并部署这种“一证通吃”的 SSL 通配符证书。我们不会空谈理论而是直接上手使用 Let‘s Encrypt 提供的免费、自动化工具在几分钟内完成从申请到 Nginx 配置的全过程。你会发现获得与 Google 官网同等级别的 HTTPS 安全防护门槛远比想象中低。1. 通配符证书为什么它是子域名管理的“终极方案”在深入操作之前我们必须先理解通配符证书Wildcard Certificate到底解决了什么实际问题以及它和普通单域名证书的本质区别。想象一下你正在运营一个云服务平台你的域名结构可能是这样的www.yourplatform.com(主站)api.yourplatform.com(开放接口)console.yourplatform.com(用户控制台)docs.yourplatform.com(文档中心)blog.yourplatform.com(技术博客)如果使用单域名证书你需要为上述每一个地址单独购买和部署证书。这带来的问题是管理噩梦每个证书都有独立的有效期你需要维护一个表格来跟踪它们的续期时间任何一次遗忘都可能导致服务中断。成本高昂商业证书通常按域名数量收费子域名越多费用越高。部署繁琐每次新增一个子域名例如status.yourplatform.com用于服务状态监控你都需要重复一遍申请、验证、部署的流程。而一张通配符证书*.yourplatform.com可以一次性解决所有yourplatform.com下的同级子域名。这里的*就是通配符它匹配任意单个层级的子域名。这意味着无论是现在已有的还是未来新增的xxx.yourplatform.com都自动受到保护。重要限制与常见误区*只匹配一级子域名。证书*.example.com可以保护a.example.com、b.example.com但不能保护a.b.example.com二级子域名。如果需要保护二级子域名需要申请*.b.example.com或使用多域名通配符证书SAN Wildcard但 Let‘s Encrypt 目前不支持。通配符证书不保护根域名。*.example.com不包含example.com。因此在实际申请时我们通常需要同时申请两个主体*.example.com和example.com以覆盖所有情况。免费与商业证书的选择Let‘s Encrypt 提供了完全免费、自动化的通配符证书其加密强度与顶级商业证书无异区别主要在于有效期90天 vs 1-2年、保修金额无 vs 有和人工客服社区支持 vs 专属支持。对于绝大多数企业和个人项目Let‘s Encrypt 的免费证书已完全足够。理解了“为什么需要”之后我们进入“如何实现”的核心环节。2. 环境准备选择你的“证书管家”要实现“三分钟搞定”关键在于选对工具。我们将使用Certbot这是由 EFF电子前沿基金会维护的、与 Let‘s Encrypt 交互的官方客户端。它自动化了整个流程验证域名所有权、申请证书、安装到 Web 服务器。在开始前请确保你拥有一台服务器拥有公网 IP并已安装 Linux 系统如 Ubuntu 20.04/22.04, CentOS 7/8。一个域名并且你已经将域名解析A 记录指向了这台服务器的公网 IP。例如将example.com和*.example.com都解析到你的服务器 IP。服务器权限拥有root或sudo权限。开放的 80 或 443 端口Certbot 需要通过 HTTP-01 或 DNS-01 挑战来验证你对域名的控制权。最常用的是 HTTP-01它需要临时在 80 端口提供一个特定文件供 Let‘s Encrypt 服务器访问。请确保服务器的 80 端口未被防火墙屏蔽。如果你的 80 端口已被占用例如已有 Nginx/Apache 在运行这通常不是问题Certbot 可以与之协作。但如果 80 端口完全无法对外开放则需要使用 DNS-01 挑战方式这要求你的域名服务商提供 API让 Certbot 自动添加一条 TXT 记录来完成验证。本文以最通用的 HTTP-01 方式为例。3. 核心工具安装一行命令部署 Certbot登录你的服务器我们开始安装 Certbot。根据你的操作系统命令略有不同。对于 Ubuntu/Debian 系统sudo apt update sudo apt install certbot python3-certbot-nginx -ypython3-certbot-nginx是用于自动配置 Nginx 的插件。如果你使用 Apache则安装python3-certbot-apache。对于 CentOS/RHEL 7/8 系统首先确保已启用 EPEL 仓库然后安装# CentOS 7 sudo yum install epel-release -y sudo yum install certbot python2-certbot-nginx -y # CentOS 8 / RHEL 8 sudo dnf install epel-release -y sudo dnf install certbot python3-certbot-nginx -y安装完成后可以通过以下命令验证certbot --version如果输出版本号如certbot 1.32.0说明安装成功。4. 关键一步获取通配符证书的“钥匙”这是整个流程中最关键的一步。由于通配符证书的验证必须使用 DNS-01 挑战方式因为 HTTP-01 无法验证*.example.com下的所有潜在子域名而自动化 DNS-01 需要域名服务商的 API 支持且配置较为复杂。对于首次尝试或快速验证我们采用一种更直接的手动验证方式它同样高效。我们将使用 Certbot 的manual模式并配合--preferred-challenges dns参数。这个命令不会自动修改你的 DNS 或 Web 服务器配置而是会引导你手动完成验证。运行以下命令请将example.com替换为你的真实域名sudo certbot certonly --manual --preferred-challenges dns -d *.example.com -d example.com命令参数解析certonly仅获取证书不尝试自动安装。--manual启用手动模式交互式完成挑战。--preferred-challenges dns指定使用 DNS 挑战方式。-d *.example.com -d example.com指定要包含在证书中的域名。这里我们同时申请了通配符域名和根域名。执行命令后Certbot 会引导你完成以下步骤它会提示你同意服务条款。询问你是否愿意分享邮箱地址用于安全通知可选。最关键的一步Certbot 会显示类似如下的信息Please deploy a DNS TXT record under the name _acme-challenge.example.com with the following value: Xr4H-9bD8qL1pQwE2vZ5aBc7dF0gH3jK6lMnOp8RsT Before continuing, verify the record is deployed.这时你需要登录你的域名管理控制台如阿里云、腾讯云、Cloudflare 等为域名example.com添加一条TXT 记录。记录名主机记录_acme-challenge记录类型TXT记录值将 Certbot 给出的那一长串随机字符串如Xr4H-9bD8qL1pQwE2vZ5aBc7dF0gH3jK6lMnOp8RsT完整填入。TTL通常设置为 60010分钟或默认值即可。添加完 DNS 记录后需要等待几分钟让 DNS 记录在全球生效。你可以打开一个新的终端窗口使用dig或nslookup命令来验证记录是否已传播# 使用 dig 命令查询 dig -t txt _acme-challenge.example.com # 或者使用 nslookup nslookup -typetxt _acme-challenge.example.com当查询结果中显示了你刚刚设置的 TXT 记录值时说明记录已生效。回到 Certbot 的交互窗口按Enter键继续。Certbot 会向 Let‘s Encrypt 的服务器查询这条 TXT 记录验证通过后便会为你签发证书。成功后你会看到类似下面的输出其中包含了证书的存储路径Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem /etc/letsencrypt/live/example.com/privkey.pem重要提示通过此manual方式获取的证书在续期时同样需要手动执行上述 DNS 验证步骤。为了实现完全自动化你可以研究 Certbot 针对你的域名注册商如 Cloudflare,阿里云DNS的 DNS 插件但这超出了“三分钟快速上手”的范围。手动方式让你清晰理解原理并能在任何环境下操作。5. 在 Nginx 中配置证书让 HTTPS 生效证书已经到手现在需要配置你的 Web 服务器来使用它。我们以最流行的 Nginx 为例。假设你有一个简单的 Nginx 配置文件位于/etc/nginx/sites-available/example.com其 HTTP 配置如下server { listen 80; server_name example.com www.example.com api.example.com; root /var/www/html; index index.html index.htm; location / { try_files $uri $uri/ 404; } }我们的目标是将其改造为 HTTPS。编辑此文件使用sudo nano或sudo vimsudo nano /etc/nginx/sites-available/example.com将其修改为如下配置server { listen 80; server_name example.com www.example.com api.example.com *.example.com; # 强制将所有 HTTP 请求重定向到 HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; # 启用 SSL 和 HTTP/2 server_name example.com www.example.com api.example.com *.example.com; root /var/www/html; index index.html index.htm; # 指定 SSL 证书和私钥路径 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 强化的 SSL 配置参考 Mozilla 现代兼容性配置 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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; location / { try_files $uri $uri/ 404; } }配置关键点解析第一个server块监听 80 端口通过return 301永久重定向将所有 HTTP 流量跳转到对应的 HTTPS 地址。这是确保网站完全 HTTPS 化的标准做法。第二个server块监听 443 端口并启用ssl。ssl_certificate指向fullchain.pem这是证书链文件包含你的证书和中间 CA 证书。ssl_certificate_key指向privkey.pem这是你的私钥文件必须严格保密。ssl_protocols禁用老旧不安全的 TLSv1.0 和 TLSv1.1只启用 TLSv1.2 和 TLSv1.3。ssl_ciphers定义一组安全的加密套件优先使用前向保密Forward Secrecy的套件。server_name这里我们列出了具体的子域名也包含了通配符*.example.com。Nginx 会正确匹配。修改完成后检查 Nginx 配置语法是否正确sudo nginx -t如果输出syntax is ok和test is successful就可以重新加载 Nginx 使配置生效sudo systemctl reload nginx # 或者 sudo nginx -s reload6. 验证与测试确保一切就绪配置完成后必须进行验证确保 HTTPS 工作正常并且所有子域名都受到保护。1. 浏览器直接访问 打开浏览器访问https://example.com、https://www.example.com、https://api.example.com。你应该在地址栏看到绿色的锁标志点击锁标志可以查看证书详情确认证书颁发者为 “Let‘s Encrypt”并且证书的“使用者可选名称”中包含了*.example.com和example.com。2. 使用在线 SSL 检测工具 访问 SSL Labs Server Test 输入你的域名进行测试。目标是获得A 或 A的评级。该工具会详细分析你的 SSL/TLS 配置指出任何潜在的安全问题如弱加密套件、不安全的协议等。我们之前的 Nginx 配置模板已经为获得 A 评级打下了基础。3. 测试不存在的子域名 这是验证通配符证书是否生效的终极测试。尝试访问一个你从未在 Nginx 配置中显式声明过的子域名例如https://random123.example.com。只要你的 Nginx 的server_name包含了*.example.com并且该 DNS 记录指向你的服务器Nginx 就会使用同一张证书来处理这个请求。你可能会看到默认的 Nginx 页面或你的主站内容但关键是SSL 握手会成功浏览器不会报证书错误。你可以使用curl命令快速测试curl -I https://random123.example.com观察输出应该能成功建立连接返回 HTTP 头信息而不是 SSL 证书错误。7. 常见问题与排查思路在部署过程中你可能会遇到一些问题。下表列出了常见现象、原因及解决方法问题现象可能原因排查方式解决方案Certbot 报错DNS problem: NXDOMAIN looking up TXT for _acme-challenge.example.comDNS 的 TXT 记录未生效或记录名填写错误。1. 使用dig -t txt _acme-challenge.example.com检查记录值是否正确返回。2. 检查域名控制台确认记录名是_acme-challenge不是_acme-challenge.example.com。等待更长时间DNS 传播可能需要几分钟到几小时或检查并修正 DNS 记录。Nginx 重启失败nginx: [emerg] cannot load certificate证书或私钥文件路径错误或文件权限问题。1. 运行sudo nginx -t查看具体错误行。2. 使用ls -la /etc/letsencrypt/live/example.com/检查文件是否存在及权限。确保ssl_certificate和ssl_certificate_key路径完全正确。证书文件通常对 root 用户只读权限应为 644。浏览器访问 HTTPS 显示“连接不安全”或证书错误1. 证书域名不匹配。2. 证书链不完整。3. 服务器时间不正确。1. 点击浏览器锁标志查看证书详情核对域名。2. 使用在线 SSL 检测工具检查链完整性。3. 在服务器运行date命令检查时间。1. 确保证书包含你访问的域名。2. Nginx 配置中应使用fullchain.pem。3. 使用ntpdate同步服务器时间。HTTP 没有自动跳转到 HTTPSNginx 配置中缺少 80 端口的重定向规则或重定向规则有误。检查 Nginx 配置文件中是否有一个监听 80 端口的server块并包含return 301 https://$server_name$request_uri;。添加上述重定向规则并确保server_name与你的域名匹配。通配符子域名访问返回 404Nginx 配置中虽然server_name匹配但root目录下没有对应内容且未配置默认处理。检查访问日志sudo tail -f /var/log/nginx/access.log。在location /块中配置合理的默认行为如返回一个默认页面或根据$host变量代理到不同的后端应用。8. 自动化续期与最佳实践Let‘s Encrypt 证书只有 90 天有效期但这正是为了鼓励自动化。手动续期虽然可行但极易遗忘。以下是确保服务持续安全的实践。1. 手动测试续期 在证书到期前如剩余30天时你可以手动测试续期流程是否畅通sudo certbot renew --dry-run--dry-run参数会模拟续期过程而不真正签发新证书。这是检查你的续期配置尤其是 DNS 验证是否仍能工作的安全方式。2. 配置自动化续期 Certbot 安装时会自动创建一个 systemd timer 或 cron 作业。在 Ubuntu 上通常位于/etc/cron.d/certbot。你可以查看并确认它存在cat /etc/cron.d/certbot内容通常类似# /etc/cron.d/certbot: crontab entries for the certbot package 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system perl -e sleep int(rand(43200)) certbot -q renew这个 cron 作业会每天两次每12小时检查证书是否需要续期并在到期前30天内自动续期。3. 续期后重载 Nginx 自动续期成功后需要让 Nginx 重新加载新的证书文件。Certbot 可以通过--post-hook参数或修改配置文件来实现。编辑 Certbot 的续期配置文件sudo nano /etc/letsencrypt/renewal/example.com.conf在文件末尾找到[renewalparams]部分确保或添加post_hook指令post_hook systemctl reload nginx这样每次证书成功续期后Nginx 都会自动重载配置。4. 监控与告警 不要完全依赖自动化。建议将证书过期日期加入你的日历提醒。使用服务器监控工具如 Prometheus Blackbox Exporter定期探测网站的 SSL 证书有效期并在过期前特定天数如21天发送告警。定期手动执行sudo certbot renew --dry-run以确保自动化流程没有因系统变更而失效。5. 安全最佳实践私钥保护/etc/letsencrypt/live/目录下的privkey.pem文件权限应为 600 (-rw-------)且所有者是 root。配置备份备份你的 Nginx 配置和/etc/letsencrypt/目录。仅限 HTTPS确保所有子域名都通过上述重定向规则强制使用 HTTPS避免内容混合Mixed Content问题。定期更新保持 Certbot、Nginx 和操作系统处于最新稳定版以获取安全补丁。通过以上步骤你不仅快速获得了一张免费的通配符 SSL 证书更建立了一套可持续、可监控的 HTTPS 服务基础。这张证书提供的加密强度与 Google 等大型网站使用的商业证书在技术上没有本质区别它为你所有的子域名服务构建了统一、坚固的安全边界。