跳转到内容

网页空间中的 Let's Encrypt:证书、续期与故障排查

Christopher Sakel  ·   ·  1 分钟 阅读时间

更新与新闻 · 分钟 1 阅读时间 · Christopher Sakel

网页空间中的 Let's Encrypt:证书、续期与故障排查
简而言之
  • Let's Encrypt 证书是免费的,有效期为 90 天,在我们的网页空间中会在后台自动续期
  • 如果续期失败,几乎总是因为端口 80、错误的 DNS 记录,或拦截请求的反向代理
  • 对于通配符证书(*.deine-domain.de),你需要使用 DNS-01 Challenge,而不是 HTTP-01

浏览器里的红色锁形图标吓跑的访客,比任何缓慢的加载时间都多。上面写着“不安全”,落在下单页面上的访客会在输入信用卡号之前就点击离开。Let's Encrypt 通过让证书免费,解决了网络上大部分场景中的这个问题——但“免费”不等于“一切自动搞定”,而这正是我们经常收到的支持请求的来源。

Let's Encrypt 的基本工作原理

Let's Encrypt 是一个证书颁发机构,它通过 ACME 协议自动验证你是否真的对某个域名拥有控制权,并据此为你签发一张域名验证型证书(DV)。不需要商业登记摘录,不需要电话沟通,也不需要像传统付费证书那样等待数天。验证通过所谓的 Challenge 完成,而 Challenge 的选择恰恰决定了之后的续期是能顺利完成,还是会因为一条晦涩的错误信息而中断。

Challenge验证方式适用场景
HTTP-01在你的域名下放置一个文件,Let's Encrypt 通过端口 80 读取它端口 80 可正常访问的标准网页空间,每个域名/子域名对应一张证书
DNS-01你在域名的 DNS 中创建一条 TXT 记录,Let's Encrypt 会查询它通配符证书、端口 80 未开放的服务器、内部系统
TLS-ALPN-01直接通过端口 443 借助 TLS 扩展进行验证较少使用,通常是端口 80 必须长期保持关闭的情况

我们的网页空间中证书是如何运作的

如果你的域名已通过客户中心与你的网页空间关联,Plesk 会自行完成证书的签发和续期——你无需手动申请证书。前提是该域名确实指向我们的服务器,否则 HTTP-01 验证会失败,因为 Let's Encrypt 会到你的旧服务商那里而不是我们这里获取响应。关于如何正确设置相应的 DNS 记录,请参见文章《将域名与网页空间关联》。

  1. 在客户中心将域名与网页空间套餐关联,并设置 DNS 记录(A 记录或域名服务器)
  2. 在 Plesk 面板中打开“网站和域名” → “SSL/TLS 证书”,选择“Let's Encrypt”
  3. 选择域名变体(带 www 和不带 www),然后签发证书
  4. 在“托管设置”中启用从 HTTP 到 HTTPS 的跳转,避免旧流量停留在未加密的页面上

在自己的搭载网页空间的 Root 服务器上,原理是一样的,只是 ACME 客户端需要你自己负责。最常用的客户端是 Certbot:

apt install certbot python3-certbot-nginx
certbot --nginx -d deine-domain.de -d www.deine-domain.de

Certbot 会自动创建一个 Cronjob 或 systemd Timer,每天检查两次是否需要续期。续期不会等到临近过期才进行,而是提前很多——这样即使出现问题,也有足够时间在页面真正带着过期证书上线之前发现它。

你可以随时安全地测试自动续期是否能正常工作,而不会消耗真实的证书配额:
certbot renew --dry-run
如果这次演练顺利通过,真正的续期也会顺利完成。

续期失败时该怎么办

几乎每一次续期失败,都可以归结为以下几个原因之一:

  • 端口 80 被阻挡 —— 防火墙规则或过于严格的安全插件根本不放行 Let's Encrypt 的验证请求
  • DNS 不再指向正确的服务器 —— 例如更换服务商后忘记了旧的 A 记录
  • 反向代理或 CDN 拦截了请求 —— /.well-known/acme-challenge/ 下的文件从未被真正的服务器返回
  • 网站根目录权限不正确 —— ACME 客户端无法写入验证文件,或者网页服务器无法读取它
  • 短时间内失败尝试过多 —— Let's Encrypt 限制了同一域名在一段时间内可申请新证书的次数,因此测试时更适合先使用 Staging 模式
如果你在调试时一次次“死马当活马医”地反复申请新证书,可能会触发 Let's Encrypt 的速率限制。测试时请使用 Staging 服务器(certbot --staging)——它不会计入真实证书的限额。

一个典型的错误信息是“Invalid response from ... : 404”——这几乎总是意味着 Challenge 文件没有出现在 Let's Encrypt 期望的位置。首先检查该域名是否确实解析到我们这里,然后检查是否有代理或跳转规则对 /.well-known/ 路径的处理方式与网站其余部分不同。

通配符证书

对于一次性覆盖所有子域名的证书(*.deine-domain.de),HTTP-01 是不够的——Let's Encrypt 在这种情况下强制要求使用 DNS-01,因为通配符无法通过单一可访问的 URL 来验证。因此你需要拥有域名 DNS 管理的访问权限,并能够在其中设置 TXT 记录,无论是每次续期时手动设置,还是通过 ACME 客户端的 DNS 插件自动完成。

优点
  • 免费,没有反复出现的证书费用
  • 可以完全自动化,无需手动续期
  • 在 Plesk、Nginx、Apache 以及所有主流浏览器中都得到广泛支持
缺点
  • 仅提供域名验证,没有像 EV 证书那样的组织验证
  • 90 天的短有效期让你依赖于一套正常运作的自动化机制
  • 通配符证书需要 DNS-01,也就是需要对 DNS 管理的 API 访问权限
一张没有人续期的证书,不过是绕了个弯的过期日期。

检查是否成功

签发或续期之后,只需简单检查一下:

echo | openssl s_client -connect deine-domain.de:443 -servername deine-domain.de 2>/dev/null | openssl x509 -noout -dates

输出会显示 notBeforenotAfter——如果 notAfter 大约在 90 天后,就说明一切都是最新的。此外也值得直接在浏览器中查看:点击锁形图标,查看证书详情,颁发者应该是“Let's Encrypt”或“R-某某”(当前的中间 CA)。如果加密是你合规要求的一部分,也可以看看我们关于德国境内网页空间的合规背景介绍文章《在德国进行网页空间托管——安全、灵活且符合 GDPR》。

常见问题

Let's Encrypt 证书的有效期是多久?我需要自己续期吗?
Let's Encrypt 证书的有效期为 90 天。在我们的网页空间中,续期通过 Plesk 自动完成,你无需手动操作。在自行管理的 Root 服务器上,这项工作由你的 ACME 客户端的 Cronjob 或 Timer 负责,前提是它配置正确。
为什么签发证书时会提示 Challenge 验证失败?
多数情况下是因为 Let's Encrypt 无法访问 /.well-known/acme-challenge/ 下的验证文件。最常见的原因是:端口 80 被防火墙阻挡、域名的 DNS 记录仍指向旧服务商,或者反向代理在请求到达网页服务器之前就拦截了该路径。
我可以用 Let's Encrypt 获取涵盖所有子域名的通配符证书吗?
可以,但只能通过 DNS-01 Challenge,而不能用 HTTP-01。为此你需要拥有域名 DNS 管理的访问权限,以便设置所需的 TXT 记录。
我的证书是有效的,但浏览器仍显示“不安全”,这是为什么?
大多数情况下是混合内容(Mixed Content)问题:页面本身通过 HTTPS 加载,但仍通过 http:// 引入了个别图片、脚本或样式表。检查页面源代码或浏览器控制台中的相应警告即可确认。
在你们的网页空间中,SSL 证书是否需要额外付费?
不需要,Let's Encrypt 本身就是免费签发的,并且已经包含在网页空间套餐中。