ARTICLE DETAIL

资讯详情

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

三分钟搞定SSL通配符证书:Let‘s Encrypt + Nginx全攻略

三分钟搞定SSL通配符证书:Let‘s Encrypt + Nginx全攻略 在项目部署和网站运维中HTTPS加密已成为标配而管理多个子域名的证书常常让人头疼。每次新增一个api.yourdomain.com或blog.yourdomain.com都要重复申请、部署证书流程繁琐。本文将为你彻底解决这个问题手把手教你如何快速获取并部署SSL通配符证书实现一个证书保护主域名下的所有子域名无论是个人博客、测试环境还是微服务架构都能轻松应对。1. SSL通配符证书核心概念与价值在深入实操之前我们有必要厘清几个关键概念理解为什么通配符证书是提升运维效率的利器。1.1 什么是SSL/TLS证书SSL安全套接层及其继任者TLS传输层安全证书是一种数字证书用于在客户端如浏览器和服务器之间建立加密链接。它的核心作用有三个加密传输对传输的数据进行加密防止中间人窃听和篡改。身份验证向访问者证明你正在访问的网站确实是其声称的那个网站而不是钓鱼网站。数据完整性确保数据在传输过程中未被修改。当你在浏览器地址栏看到一把“小锁”标志和以https://开头的网址时就表示该网站使用了SSL/TLS证书。1.2 单域名、多域名与通配符证书的区别这是选择证书类型时的核心决策点。单域名证书仅保护一个完全限定域名FQDN。例如为www.example.com申请的证书不能用于example.com或api.example.com。这是最基础的证书类型。多域名证书SAN证书一张证书可以保护多个完全不同的域名。例如一张证书可以同时保护example.com、blog.example.net和shop.another.org。适合管理多个不相关的域名。通配符证书这是本文的重点。一张证书可以保护一个主域名及其所有同级子域名。它使用星号*作为通配符。例如一张为*.example.com颁发的证书可以用于www.example.comapi.example.comblog.example.comdev.example.com...任何其他子域名.example.com重要提示通配符证书只保护一级子域名。*.example.com不能保护二级子域名如test.api.example.com。如需保护二级子域名需要申请*.api.example.com这样的证书。1.3 为什么选择通配符证书Google等大厂也在用观察像google.com这样的网站你会发现其众多服务如mail.google.com,drive.google.com,maps.google.com都使用了HTTPS且证书有效。管理如此庞大的子域名体系通配符证书是必然选择。其核心优势在于简化管理只需申请、部署和续期一张证书即可覆盖当前和未来新增的所有同级子域名极大减少了运维工作量。降低成本虽然通配符证书价格通常高于单域名证书但当你需要保护多个子域名时其总体成本远低于为每个子域名单独购买证书。提升灵活性在开发测试环境中可以随时创建新的子域名如feature-123.your-test.com而无需等待证书申请加速开发和部署流程。避免证书错误统一管理减少了因某个子域名证书过期或配置错误导致的安全警告提升用户体验和专业度。2. 环境准备与工具选择“三分钟搞定”并非虚言但前提是做好准备工作。我们将使用业界最流行的免费证书自动化工具——Let‘s Encrypt的客户端Certbot来实现。Let‘s Encrypt 是一个免费、自动化、开放的证书颁发机构CA已被广泛信任。2.1 系统与环境要求操作系统本文以Ubuntu 22.04 LTS为例进行演示。Certbot 同样支持 CentOS、Debian、Windows、macOS 等主流系统命令稍有差异。Web服务器我们使用最普遍的Nginx。如果你使用 Apache整体流程类似配置部分需调整。域名与DNS你需要拥有一个自己的域名例如yourdomain.com并且能够管理其DNS解析记录。我们将为*.yourdomain.com申请证书。服务器权限需要对服务器具有root或sudo权限以便安装软件和修改配置。网络服务器80和443端口需要对外开放因为Let‘s Encrypt在验证域名所有权时需要通过HTTP80端口或TLS443端口进行挑战Challenge。2.2 安装Certbot与Nginx插件在Ubuntu系统上安装过程非常简单。首先更新软件包列表然后安装Certbot及其用于Nginx的插件。# 更新本地软件包索引 sudo apt update # 安装 Certbot 和 Nginx 插件 sudo apt install certbot python3-certbot-nginx -ypython3-certbot-nginx这个插件至关重要它允许Certbot自动读取Nginx的配置并完成证书的安装和配置更新实现全自动化。2.3 确认Nginx配置确保你的Nginx已经安装并运行并且有一个基本的服务器块Server Block配置指向你的域名。例如你可能有一个这样的配置文件/etc/nginx/sites-available/yourdomain.com# /etc/nginx/sites-available/yourdomain.com server { listen 80; server_name yourdomain.com www.yourdomain.com; # 目前只配置了主域名 root /var/www/yourdomain.com/html; index index.html index.htm; location / { try_files $uri $uri/ 404; } }这个配置目前只监听HTTP80端口。我们的目标是在获取证书后让Certbot帮我们将其修改为监听HTTPS443端口并自动配置重定向。3. 申请通配符证书的核心流程与原理通配符证书的申请验证方式与单域名证书略有不同。Let‘s Encrypt 主要支持两种验证方式HTTP-01挑战在网站的Web根目录下放置一个特定的验证文件Let‘s Encrypt通过HTTP访问该文件来验证你对域名的控制权。这种方式不支持通配符证书。DNS-01挑战在你的域名DNS记录中添加一条特定的TXT记录Let‘s Encrypt通过查询DNS来验证所有权。这是申请通配符证书唯一支持的方式。这意味着申请通配符证书需要你能够操作域名的DNS解析。整个过程是半自动的Certbot会生成一个验证字符串你需要手动或通过支持自动化的DNS API将其添加到DNS记录中然后Certbot完成验证并颁发证书。4. 实战三分钟获取通配符证书接下来我们进入核心实战环节。请将以下命令中的yourdomain.com替换为你自己的域名。4.1 使用Certbot发起DNS挑战申请运行以下命令开始申请流程sudo certbot certonly --manual --preferred-challengesdns --server https://acme-v02.api.letsencrypt.org/directory --agree-tos --manual-public-ip-logging-ok -d *.yourdomain.com -d yourdomain.com参数详解certonly仅获取证书不尝试自动安装因为DNS挑战需要手动干预。--manual启用手动模式用于DNS挑战。--preferred-challengesdns指定使用DNS挑战方式。--server指定使用Let‘s Encrypt的ACME v2 API端点这是支持通配符证书所必需的。--agree-tos自动同意Let‘s Encrypt的服务条款。--manual-public-ip-logging-ok同意在手动模式下记录公网IP。-d *.yourdomain.com -d yourdomain.com指定要保护的域名。这里我们同时申请了通配符*.yourdomain.com和根域名yourdomain.com这样根域名也能获得保护。4.2 完成DNS验证执行命令后Certbot会引导你完成以下步骤它会提示你输入邮箱用于接收续期提醒等。接着它会输出类似以下的重要信息Please deploy a DNS TXT record under the name _acme-challenge.yourdomain.com with the following value: gfj9Xq...R7boM # 这里是一长串随机字符串 Before continuing, verify the record is deployed.现在你需要登录到你的域名注册商或DNS服务商的管理后台如阿里云、腾讯云DNSPod、Cloudflare等。为域名yourdomain.com添加一条TXT记录。主机记录填写_acme-challenge记录类型选择TXT记录值粘贴Certbot提供的那一长串随机字符串。TTL保持默认或设置为较短时间如600秒。以阿里云云解析DNS为例添加记录的位置如下注实际博文可配图此处用文字描述等待DNS记录生效。DNS传播需要时间通常几秒到几分钟。你可以打开一个新的终端窗口使用dig或nslookup命令来验证记录是否生效dig -t txt _acme-challenge.yourdomain.com当命令返回的结果中包含你设置的TXT值时说明记录已生效。回到Certbot的窗口按回车键继续。Certbot会去查询DNS记录进行验证。如果验证成功你将看到如下输出Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/yourdomain.com/fullchain.pem /etc/letsencrypt/live/yourdomain.com/privkey.pem Your certificate will expire on 2024-07-01. ...恭喜你的通配符证书已经申请成功并保存在服务器上。证书有效期为90天Let‘s Encrypt鼓励自动续期。4.3 证书文件说明生成的证书位于/etc/letsencrypt/live/yourdomain.com/目录下其中最重要的两个文件是fullchain.pem证书链文件包含你的证书和中间CA证书。Nginx配置中的ssl_certificate指令需要它。privkey.pem证书的私钥文件。Nginx配置中的ssl_certificate_key指令需要它。务必保证此文件的安全切勿泄露。该目录下的cert.pem是你的证书chain.pem是中间证书通常我们直接使用fullchain.pem即可。5. 在Nginx中配置通配符证书证书到手后我们需要配置Nginx来使用它。我们将修改之前的配置文件启用HTTPS并设置HTTP到HTTPS的重定向。5.1 编辑Nginx配置文件打开你的Nginx站点配置文件sudo nano /etc/nginx/sites-available/yourdomain.com将其修改为如下内容# /etc/nginx/sites-available/yourdomain.com # HTTP 服务器块强制重定向到 HTTPS server { listen 80; listen [::]:80; server_name yourdomain.com www.yourdomain.com *.yourdomain.com; # 注意这里添加了通配符 # 将所有HTTP请求重定向到HTTPS return 301 https://$host$request_uri; } # HTTPS 服务器块 server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name yourdomain.com www.yourdomain.com *.yourdomain.com; # 通配符匹配所有子域名 # 指定证书和私钥的路径 ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 启用SSL会话复用提升性能 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 推荐的安全SSL协议和加密套件 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers off; root /var/www/yourdomain.com/html; index index.html index.htm; location / { try_files $uri $uri/ 404; } # 可选配置HSTS告诉浏览器强制使用HTTPS生产环境谨慎开启 # add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload always; }关键点说明第一个server块监听80端口通过return 301永久重定向将所有HTTP流量跳转到HTTPS。第二个server块监听443端口并启用ssl和http2。server_name中使用了*.yourdomain.com这使得该配置块可以处理任何指向该服务器的yourdomain.com的子域名的HTTPS请求。ssl_certificate和ssl_certificate_key指向了我们刚才申请到的证书文件。5.2 测试配置并重载Nginx在重启Nginx之前务必测试配置文件语法是否正确sudo nginx -t如果输出syntax is ok和test is successful则说明配置无误。现在重新加载Nginx配置使其生效sudo systemctl reload nginx # 或者使用 sudo nginx -s reload5.3 验证HTTPS访问打开浏览器访问以下网址确认它们都显示安全锁标志https://yourdomain.comhttps://www.yourdomain.com你可以尝试配置一个A记录将test.yourdomain.com解析到你的服务器IP然后访问https://test.yourdomain.com它应该也能使用同一张证书正常工作。6. 自动化续期与最佳实践Let‘s Encrypt证书只有90天有效期手动续期是不可接受的。幸运的是Certbot让自动化续期变得非常简单。6.1 测试自动续期Certbot安装后会自动创建一个定时任务cron job或systemd timer。你可以使用以下命令手动测试续期流程是否正常工作sudo certbot renew --dry-run--dry-run参数模拟续期过程而不真正更新证书。如果看到 “Congratulations, all renewals succeeded” 之类的消息说明自动续期配置正常。6.2 自动化DNS挑战续期进阶我们申请证书时使用了手动DNS挑战这对于续期是个障碍。为了实现完全自动化你需要使用你的DNS服务商提供的API。Certbot支持许多DNS插件如certbot-dns-cloudflare,certbot-dns-aliyun等。以阿里云万网为例大致流程如下在阿里云RAM访问控制中创建子用户并授予其管理DNS的权限AliyunDNSFullAccess。为该子用户创建AccessKey ID和Secret。在服务器上安装对应的DNS插件sudo apt install certbot-dns-aliyun如果可用或使用pip安装。配置AccessKey到Certbot的配置文件中。使用certbot certonly --dns-aliyun ...命令来申请和续期之后就不再需要手动干预DNS了。由于不同DNS服务商API差异较大具体操作请查阅Certbot官方文档或对应DNS插件的README。6.3 安全与运维最佳实践私钥保护确保/etc/letsencrypt/目录及其中私钥文件的权限严格通常应为root只读。监控证书过期尽管有自动续期但仍建议设置监控告警如使用Nagios, Prometheus等监控/etc/letsencrypt/live/yourdomain.com/cert.pem的过期时间。备份定期备份/etc/letsencrypt/目录。虽然可以重新申请但备份有助于快速恢复。禁用旧协议在Nginx配置中确保只启用TLSv1.2和TLSv1.3禁用SSLv2、SSLv3、TLSv1.0和TLSv1.1它们已被证实不安全。证书透明度浏览器要求所有公开信任的证书都记录在证书透明度CT日志中。Let‘s Encrypt会自动处理如果你使用其他CA请确保他们支持CT。不要滥用Let‘s Encrypt有速率限制每周每个注册域名最多签发50张证书重复申请相同证书有重复证书限制。对于测试可以使用其 staging 环境--server https://acme-staging-v02.api.letsencrypt.org/directory避免触发限制。7. 常见问题与排查思路在申请和配置过程中你可能会遇到以下问题问题现象可能原因排查思路与解决方案Certbot命令执行失败提示找不到命令Certbot未正确安装。检查安装步骤确认系统包管理器apt/yum已更新并重新运行安装命令。DNS挑战验证失败Timeout during connectDNS记录未生效DNS传播慢防火墙阻断了出站DNS查询。1. 使用dig -t txt _acme-challenge.yourdomain.com 8.8.8.8从公共DNS验证记录是否生效。2. 等待更长时间最多72小时通常几分钟。3. 检查服务器防火墙/安全组是否允许出站UDP 53端口。验证失败Invalid response from https://acme-v02...你之前可能为同一个主机名设置了不同的TXT记录值造成冲突。登录DNS管理台删除旧的_acme-challengeTXT记录只保留最新的一个值。Nginx配置测试失败nginx: [emerg] open() “/etc/letsencrypt/.../fullchain.pem” failed证书文件路径错误或权限不足。1. 检查路径是否正确特别是域名目录名。2. 使用sudo ls -la /etc/letsencrypt/live/yourdomain.com/确认文件存在且Nginx进程用户通常是www-data或nginx有读取权限。浏览器访问显示“不安全连接”或证书错误证书域名不匹配证书链不完整服务器时间不正确。1. 点击浏览器锁图标查看证书详情确认颁发给Subject的域名是否包含你访问的域名。2. 确保Nginx配置中ssl_certificate指向的是fullchain.pem而非cert.pem。3. 使用在线SSL检查工具如 SSL Labs Server Test诊断。4. 检查服务器系统时间是否准确。自动续期失败DNS挑战未自动化Certbot定时任务被修改或禁用磁盘空间不足。1. 运行sudo certbot renew --dry-run查看具体错误。2. 检查/etc/cron.d/certbot或systemctl list-timers确认定时任务存在。3. 考虑迁移到支持API的DNS挑战插件实现全自动续期。Nginx reload后新子域名仍使用旧证书或不生效Nginx配置中server_name未更新本地DNS缓存浏览器缓存。1. 确认Nginx配置文件中server_name包含了通配符*.yourdomain.com。2. 清除本地DNS缓存sudo systemd-resolve --flush-caches浏览器使用无痕模式访问。通过以上步骤你不仅能在短时间内为你的所有子域名披上HTTPS的安全外衣还能建立起一套自动化、可持续的证书管理流程。这套方法尤其适合拥有多个子域名的开发者、运维人员和小型团队能有效提升安全水平和运维效率。
返回列表