ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

免费申请Let‘s Encrypt通配符SSL证书:自动化部署与Nginx配置全攻略

免费申请Let‘s Encrypt通配符SSL证书:自动化部署与Nginx配置全攻略 在实际 Web 项目部署和运维中将 HTTP 服务升级为 HTTPS 是保障数据传输安全、提升用户信任度的基础步骤。然而对于个人开发者、初创团队或内部系统而言购买商业 SSL/TLS 证书可能是一笔不小的开销尤其是在需要支持多个子域名通配符证书的场景下。幸运的是目前存在由非营利性证书颁发机构CA提供的免费 SSL 证书服务其中最知名的就是 Let‘s Encrypt。它不仅能签发单域名证书也支持签发通配符证书这为管理大量子域名的场景提供了极大的便利。本文将围绕如何免费申请、部署和管理 Let’s Encrypt 的通配符 SSL 证书展开涵盖从概念理解、环境准备、自动化申请、到 Nginx 配置、证书续期以及常见问题排查的全流程。无论你是需要在 CentOS、Ubuntu 等 Linux 服务器上为个人博客、测试环境还是内部应用启用 HTTPS都可以按照本文的步骤操作。1. 理解免费 SSL 证书与 Let‘s Encrypt 工作机制在开始动手之前需要先厘清几个核心概念这有助于理解后续操作步骤的设计原理并在出现问题时能快速定位。1.1 SSL/TLS 证书、HTTPS 与 CASSL安全套接层及其继任者 TLS传输层安全是一种加密协议用于在网络通信中提供隐私和数据完整性。HTTPS 就是在 HTTP 协议基础上加入了 SSL/TLS 加密层。SSL/TLS 证书是一个数字文件它绑定了域名或 IP与一个公钥并由一个受信任的第三方机构——证书颁发机构CA进行数字签名。浏览器、操作系统等客户端内置了这些受信任 CA 的根证书因此可以验证由它们签发的服务器证书的真实性从而建立安全连接。免费证书如 Let‘s Encrypt与付费商业证书在加密强度上通常没有区别核心差异在于验证方式、有效期、售后支持和保险等方面。Let’s Encrypt 采用自动化的 DV域名验证方式证书有效期仅为 90 天旨在推动自动化安全管理。1.2 通配符证书与单域名证书单域名证书仅保护一个完全限定域名FQDN例如www.example.com。对blog.example.com无效。通配符证书保护一个域名及其所有同级子域名。证书主题中的通用名称CN或主题备用名称SAN会使用星号*表示例如*.example.com。它可以用于a.example.com、b.example.com等但不能用于多级子域如*.a.example.com。对于拥有多个功能子域如api.、static.、admin.的项目通配符证书可以极大简化证书管理。Let‘s Encrypt 支持签发通配符证书但验证机制与单域名证书不同。1.3 Let’s Encrypt 与 ACME 协议Let‘s Encrypt 通过 ACME自动证书管理环境协议实现证书的自动化申请、验证和续期。ACME 协议定义了一套客户端运行在你的服务器上与 CA 服务器之间的交互流程核心是验证你对域名的控制权。对于通配符证书Let’s Encrypt只支持使用 DNS-01 挑战方式进行验证。这意味着在申请证书时ACME 客户端需要在你的域名 DNS 记录中添加一条特定的 TXT 记录以证明你拥有该域名的管理权限。这与单域名证书常用的 HTTP-01在网站根目录放置特定文件挑战方式不同。2. 环境准备与工具选择申请和管理 Let‘s Encrypt 证书需要一个 ACME 客户端。acme.sh是一个广泛使用、纯 Shell 编写的客户端它依赖少功能强大支持通配符证书和自动 DNS API 集成非常适合自动化运维。2.1 服务器环境要求操作系统本文以 CentOS 7.9 为例同样适用于 Ubuntu、Debian 等主流 Linux 发行版。权限需要 root 或具有 sudo 权限的用户。域名拥有一个已注册的域名例如yourdomain.com并且能够管理其 DNS 解析添加/修改 TXT 记录。网络服务器需要能够访问互联网与 Let‘s Encrypt 服务器通信。Web 服务器以 Nginx 为例进行配置同样适用于 Apache 等。2.2 安装 acme.shacme.sh的安装过程非常简单它会自动安装到用户主目录下并创建定时任务。# 切换到 root 用户或使用 sudo sudo su - # 安装必要的依赖如 curl yum install -y curl # 通过 curl 下载并安装 acme.sh curl https://get.acme.sh | sh -s emailyour-emailexample.com将your-emailexample.com替换为你自己的邮箱该邮箱用于接收证书到期提醒等通知。安装完成后需要重新加载 Shell 配置文件或新开一个终端以使acme.sh命令生效。source ~/.bashrc # 或者直接使用绝对路径~/.acme.sh/acme.sh验证安装acme.sh --version2.3 配置 DNS API关键步骤由于通配符证书必须使用 DNS-01 挑战我们需要配置acme.sh自动操作 DNS 记录。acme.sh支持众多 DNS 服务商的 API如 Cloudflare、阿里云Alibaba Cloud、腾讯云DNSPod、GoDaddy 等。这里以Cloudflare为例其他服务商流程类似具体参数请参考acme.sh的 Wiki 文档。获取 Cloudflare API Token登录 Cloudflare 控制台。进入 “My Profile” - “API Tokens”。点击 “Create Token”选择 “Edit zone DNS” 模板。选择需要管理的域名区域Zone然后创建 Token。复制生成的 Token。在服务器上配置 API 凭证 Cloudflare 的 Token 可以直接作为环境变量使用。export CF_Token你的_API_Token_字符串 export CF_Account_ID你的_Account_ID # 在控制台首页右侧获取 export CF_Zone_ID你的_Zone_ID # 在域名概述页面获取为了永久生效可以将这些变量添加到acme.sh的配置文件中echo ‘export CF_Token“你的_API_Token_字符串”’ ~/.acme.sh/account.conf echo ‘export CF_Account_ID“你的_Account_ID”’ ~/.acme.sh/account.conf echo ‘export CF_Zone_ID“你的_Zone_ID”’ ~/.acme.sh/account.conf注意务必妥善保管 API Token它拥有修改你域名 DNS 的权限。建议在服务器上设置严格的文件权限。3. 申请通配符 SSL 证书环境配置妥当后申请证书就是一行命令的事情。3.1 执行申请命令假设你的域名是example.com你想要申请*.example.com的通配符证书。acme.sh --issue --dns dns_cf -d ‘*.example.com‘ -d ’example.com‘命令参数解释--issue签发证书。--dns dns_cf指定使用 DNS-01 挑战方式并采用 Cloudflare 的 API 模块 (dns_cf)。如果你用阿里云则是dns_ali。-d ‘*.example.com‘指定通配符域名。-d ’example.com‘同时指定根域名。这是一个好习惯因为有些场景下如直接访问根域名需要根域名的证书。acme.sh会签发一个包含这两个域名的 SAN 证书。执行命令后acme.sh会自动完成以下步骤向 Let‘s Encrypt 服务器发起证书申请。在 Cloudflare 上为你的域名_acme-challenge.example.com添加一条临时的 TXT 记录其值为挑战字符串。等待 DNS 记录在全球生效acme.sh会自动检测。Let‘s Encrypt 服务器验证该 TXT 记录。验证通过后签发证书。acme.sh自动清理刚才添加的临时 TXT 记录。整个过程通常是全自动的等待时间取决于 DNS 传播速度一般在一两分钟内完成。3.2 证书文件说明申请成功后证书和相关文件会保存在~/.acme.sh/*.example.com/目录下。关键文件有*.example.com.cer或fullchain.cer证书链文件包含服务器证书和中间 CA 证书。Nginx 配置中ssl_certificate指令通常需要这个文件。*.example.com.key证书的私钥文件。ssl_certificate_key指令需要它。此文件必须严格保密。ca.cer中间 CA 证书。*.example.com.conf该域名的acme.sh配置。acme.sh默认使用 ECC椭圆曲线密钥比 RSA 密钥更安全且性能更好。如果需要 RSA 密钥可以在申请时加上--keylength 2048参数。4. 安装与配置证书到 Web 服务器证书文件不能直接放在~/.acme.sh/目录下使用因为该目录内部可能会被acme.sh更新。我们需要将证书“安装”或复制到 Web 服务器常用的位置例如/etc/nginx/ssl/。4.1 创建 SSL 目录并安装证书# 为 Nginx 创建 SSL 证书存储目录 sudo mkdir -p /etc/nginx/ssl/example.com # 使用 acme.sh 的 install-cert 命令安装证书 # 此命令会复制证书文件到目标位置并设置好后续的自动更新钩子 acme.sh --install-cert -d ‘*.example.com‘ \ --key-file /etc/nginx/ssl/example.com/privkey.pem \ --fullchain-file /etc/nginx/ssl/example.com/fullchain.pem \ --reloadcmd “systemctl reload nginx”参数解释--install-cert执行安装操作。-d指定域名。--key-file指定私钥文件的目标路径。--fullchain-file指定完整证书链文件的目标路径。--reloadcmd指定证书自动续期后需要执行的命令。这里设置为重载 Nginx 配置使新证书生效。这是实现“一次配置永久自动续期”的关键。执行后证书和私钥就被复制到了/etc/nginx/ssl/example.com/目录下并且acme.sh会记录这个安装位置。4.2 配置 Nginx 启用 HTTPS编辑你的 Nginx 站点配置文件例如/etc/nginx/conf.d/example.com.conf或/etc/nginx/sites-available/example.com。下面是一个支持 HTTP 自动跳转 HTTPS并配置了 SSL 的基本示例server { listen 80; server_name example.com www.example.com api.example.com; # 将所有 HTTP 请求重定向到 HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; # 启用 HTTP/2 以提升性能 server_name example.com www.example.com api.example.com; # 指定证书和私钥路径使用上一步安装的路径 ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem; # 强化的 SSL 配置 ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的 TLSv1.0/1.1 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:!aNULL:!MD5:!RC4:!3DES; # 推荐的安全套件 ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 其他站点配置... root /var/www/html; index index.html index.htm; location / { try_files $uri $uri/ 404; } # 可选的 HSTS 头告诉浏览器强制使用 HTTPS生产环境谨慎使用 # add_header Strict-Transport-Security “max-age63072000; includeSubDomains; preload” always; }4.3 测试并重载 Nginx在重载 Nginx 之前务必检查配置文件语法是否正确。sudo nginx -t如果输出syntax is ok和test is successful则可以安全地重载配置。sudo systemctl reload nginx # 或者 sudo nginx -s reload现在你可以通过浏览器访问https://example.com或https://api.example.com应该能看到安全的 HTTPS 连接地址栏有小锁标志。5. 自动化续期与监控Let‘s Encrypt 证书只有 90 天有效期手动续期是不可行的。acme.sh的核心优势就在于自动化。5.1 自动续期原理acme.sh在安装时会自动为你创建一个 cron 定时任务。你可以通过以下命令查看crontab -l | grep acme.sh通常会看到类似这样的条目0 0 * * * “/root/.acme.sh”/acme.sh --cron --home “/root/.acme.sh” /dev/null这个任务每天凌晨检查所有由它管理的证书如果证书距离过期小于 30 天就会自动执行续期操作。续期过程会重新进行 DNS 挑战使用之前配置好的 API获取新证书然后自动执行你在--install-cert时通过--reloadcmd指定的命令例如systemctl reload nginx从而实现无缝更新。5.2 手动测试续期你不必等待证书快过期。可以手动运行 cron 任务来测试续期流程是否正常。acme.sh --cron如果一切正常你会看到证书更新成功的日志。由于证书有效期还很长实际并不会签发新证书但会模拟检查流程。5.3 证书监控建议虽然自动化程度很高但仍建议建立监控日志监控定期检查acme.sh的执行日志~/.acme.sh/acme.sh.log或系统 cron 日志看是否有续期失败的错误。证书过期监控使用如 Nagios、Zabbix、Prometheus 等监控工具添加对证书过期时间的监控告警。可以使用openssl命令检查openssl x509 -in /etc/nginx/ssl/example.com/fullchain.pem -noout -dates服务健康检查监控你的 HTTPS 服务端口443是否可用以及 SSL 握手是否成功。6. 常见问题与排查路径在申请、安装和续期过程中可能会遇到各种问题。下面列出典型问题及其排查思路。6.1 申请阶段失败问题现象可能原因检查方式处理建议Create new order error. Le_OrderFinalize not found或网络超时1. 服务器网络无法访问 Let‘s Encrypt 服务器acme-v02.api.letsencrypt.org。2. 系统时间不正确。1.curl -v https://acme-v02.api.letsencrypt.org2.date查看时间。1. 检查防火墙/安全组开放出站流量。2. 使用ntpdate或chronyd同步时间。Verify error:Invalid response from https://acme-v02.api.letsencrypt.org/...DNS 挑战未通过。TXT 记录未设置或未生效。1. 使用dig TXT _acme-challenge.example.com 8.8.8.8查询全球 DNS。2. 检查acme.sh日志看是否成功添加/删除了记录。1. 确认 DNS API Token 权限足够。2. 等待更长时间让 DNS 生效。3. 手动在 DNS 控制台检查 TXT 记录。Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html通常是 libcurl 库的 SSL 连接问题。检查系统根证书是否过时。更新系统的 CA 证书包yum update ca-certificates。6.2 配置 Nginx 后 HTTPS 无法访问问题现象可能原因检查方式处理建议浏览器提示 “不安全连接”、“无效证书”1. 证书域名不匹配。2. 证书链不完整。3. 系统时间错误。1. 检查浏览器证书详情中的“颁发给”域名。2. 使用在线 SSL 检测工具如 SSL Labs。3.openssl x509 -in fullchain.pem -text -noout查看证书信息。1. 确保证书包含你访问的域名。2. Nginx 的ssl_certificate必须指向fullchain.pem文件。3. 同步服务器和客户端时间。ERR_SSL_VERSION_OR_CIPHER_MISMATCHNginx SSL 协议或加密套件配置过严与老旧客户端不兼容。检查 Nginx 配置中的ssl_protocols和ssl_ciphers。临时放宽配置仅用于测试或引导用户升级浏览器。生产环境应平衡安全与兼容性。连接被拒绝1. Nginx 未监听 443 端口。2. 防火墙/安全组未开放 443 端口。1. sudo netstat -tlnpgrep :443br2.sudo firewall-cmd --list-all(firewalld) 或iptables -L -n。6.3 自动续期失败问题现象可能原因检查方式处理建议续期 cron 任务执行但证书未更新1.--reloadcmd命令执行失败。2. DNS API 凭证失效。3. 证书离过期超过 30 天acme.sh不会续期。1. 查看acme.sh日志文件。2. 手动执行acme.sh --renew -d ‘*.example.com‘ --force测试。3. 检查 API Token 是否被撤销或过期。1. 确保--reloadcmd中的命令路径正确且可执行。2. 更新 DNS API 凭证并重新配置account.conf。3. 使用--force参数强制续期测试。6.4 其他常见错误SSL: certificate_verify_failed客户端如 Python 的 requests、curl无法验证服务器证书。通常是客户端缺少 Let‘s Encrypt 的中间根证书ISRG Root X1。服务器端应提供完整证书链fullchain.pem。客户端可以更新 CA 证书包。unable to establish ssl connection通用 SSL 连接失败。从网络连通性、端口、协议兼容性、证书有效性逐层排查。idm ssl connect error某些下载管理器可能不兼容较新的 TLS 协议或加密套件。尝试在 Nginx 配置中调整ssl_ciphers为更兼容的套件。7. 生产环境最佳实践与扩展在学习和测试环境跑通后部署到生产环境还需要考虑更多因素。7.1 安全强化配置上述 Nginx SSL 配置是一个基础安全配置。对于生产环境建议参考 Mozilla SSL Configuration Generator 生成更严谨的配置并定期更新。关键点包括只启用 TLSv1.2 和 TLSv1.3。使用强加密套件优先使用前向保密Forward Secrecy的套件。启用 OCSP Stapling 以减少客户端验证证书时的延迟。考虑启用 HSTSHTTP Strict Transport Security但要注意一旦启用在有效期内无法降级回 HTTP。7.2 多域名与混合证书管理一个证书覆盖多个主域acme.sh支持在一条命令中为多个完全不同的域名申请证书例如-d ‘*.a.com‘ -d ’*.b.com‘ -d ’c.com‘。混合使用对于核心主域和大量动态子域可以使用一张通配符证书。对于少数几个重要的、独立的服务子域也可以单独为它们申请证书实现证书隔离。7.3 密钥与证书存储安全私钥文件.key或.pem权限应设置为600仅所有者可读写。证书存储目录的权限应严格控制避免 Web 用户进程如nginx用户以外的用户读取。考虑使用硬件安全模块HSM或云平台的密钥管理服务KMS来存储私钥但这超出了免费证书的常见使用场景。7.4 备份与灾难恢复定期备份/etc/nginx/ssl/目录下的证书和私钥文件。记录并备份acme.sh的配置~/.acme.sh/account.conf和各域名的.conf文件。在新的服务器上部署时除了复制证书文件还需要重新安装acme.sh并配置相同的 DNS API 凭证以恢复自动续期能力。7.5 扩展到其他服务证书不仅可用于 Nginx也可用于Apache配置类似需要SSLCertificateFile和SSLCertificateKeyFile指令。Postfix/Dovecot为邮件服务启用加密。内部微服务为 Kubernetes Ingress、Spring Boot 内置容器、Node.js 的 HTTPS 服务器等配置证书。通常只需要将fullchain.pem和privkey.pem文件提供给相应服务的配置即可。通过acme.sh和 Let‘s Encrypt你可以以几乎为零的成本为所有自有域名和服务实现全站 HTTPS 化并将繁琐的证书管理任务完全自动化。这套流程的核心在于正确配置 DNS API一旦完成初始设置后续的续期和维护工作将大大减少。对于任何面向公众或需要内部加密通信的服务这都是一项值得投入时间搭建的基础设施。
返回列表