Let's Encrypt 无法生成 SSL 证书
如果您使用的是 Coolify 代理的默认设置,且您的网站突然显示不安全连接的警告,那么很可能是您的网站正在使用 Coolify 代理生成的自签名证书。本指南将帮助您解决此问题。
1. 理解域名所有权验证挑战
Coolify 使用 Let's Encrypt 为您的域名生成 SSL 证书。
默认情况下,Let's Encrypt 使用 HTTP 验证挑战 来验证域名所有权,但部分用户可能会使用 TLS-ALPN-01 验证挑战。具体说明如下:
- HTTP 验证挑战:
- Let's Encrypt 向您的服务器端口 80 发送一个包含唯一令牌的 HTTP 请求。如果您的服务器返回正确的令牌,即确认了域名所有权,随后颁发证书。
- TLS-ALPN-01 验证挑战:
- Let's Encrypt 通过端口 443 (HTTPS) 验证您的域名。在 TLS 握手过程中,Let's Encrypt 期望您的服务器提供特殊的响应。如果服务器返回正确的响应,则验证域名并颁发证书。
- 如果此步骤失败,您将遇到 SSL 握手错误。
2. 检查端口可访问性
确保相应的端口对各自的验证挑战方法开放:
-
对于 HTTP 验证挑战:端口 80 (HTTP) 需要开放并可从互联网访问。如果端口 80 关闭或被防火墙阻止,Let's Encrypt 无法验证您的域名并生成 SSL 证书。
-
对于 TLS-ALPN-01 验证挑战:端口 443 (HTTPS) 需要开放并可从互联网访问。如果端口 443 关闭或被防火墙阻止,Let's Encrypt 无法验证您的域名并生成 SSL 证书。
3. 第三方代理的使用
如果您通过 Cloudflare 等第三方服务代理您的网站,Let's Encrypt 可能会因为代理干扰了 HTTP 或 TLS-ALPN-01 验证挑战而无法验证您的域名。在这种情况下,您必须使用 DNS 验证挑战,或者停止通过第三方服务代理您的域名。
4. 检查 Let's Encrypt 服务状态
有时,Let's Encrypt 自身可能会遇到问题。请从 此处 检查 Let's Encrypt 的状态。如果存在问题,请等待其修复,并在问题解决后重试。
5. 关于证书有效期的说明
Let's Encrypt 证书有效期为 90 天。如果您的证书仍然有效,即使所需的端口 80 已关闭或您的域名正在被代理,您的域名可能仍能正常工作。这是因为 Coolify 会继续使用现有的有效证书,直到其过期。
但是,如果您的域名通过 HTTPS 正常工作了几个月,却突然无法生成新的 SSL 证书,这很可能是现有证书已过期。此时,由于前述问题(如端口 80 关闭或代理干扰),Coolify 将无法生成新证书。
6. 强制重新生成证书
如果服务器上的证书损坏或过时,您可以删除它们并强制 Coolify 生成新证书。
- 打开服务器终端并运行:
rm /data/coolify/proxy/acme.json - 然后,通过仪表板点击“重启代理”按钮重启 Coolify 代理。
7. 检查您的 WAF 设置
如果您正在使用 Web 应用防火墙 (WAF),如 Cloudflare WAF,请确保它没有阻止 Let's Encrypt 的请求。
8. 检查 Coolify 代理日志
在 Coolify 代理日志中检查错误消息。
-
如果您看到状态码为 429 的错误消息,这意味着 Let's Encrypt 已对您的服务器 IP 地址进行了速率限制。
- 在这种情况下,请等待一段时间,然后再次检查您的域名。大多数用户不会遇到此问题,但如果您使用的是共享 IP 地址,则可能会发生。
-
如果您看到状态码为 403 的错误消息,这意味着来自 Let's Encrypt 的请求被 Web 应用防火墙 (WAF) 等东西阻止了。
9. 验证 DNS 记录
Let's Encrypt 会执行 DNS 查找以解析您服务器的 IP 地址。如果您同时配置了指向服务器的 IPv4 (A 记录) 和 IPv6 (AAAA 记录),Let's Encrypt 将在域名所有权验证挑战期间验证这两个记录。
- 如果同时存在 IPv4 和 IPv6,Let's Encrypt 可能倾向于使用 IPv6 进行验证挑战,但 IPv4 和 IPv6 都应能完成验证挑战。
为什么这很重要:
如果 IPv4 或 IPv6 地址配置错误,验证挑战可能会失败。例如:
- 如果您的域名解析到 IPv4 和 IPv6,但 IPv6 (AAAA) 记录 的 端口 80 已关闭,则 HTTP 验证挑战将失败。同样,如果 IPv6 的 端口 443 已关闭,即使 IPv4 通过了验证挑战,TLS-ALPN 验证挑战也会失败。
为确保验证成功:
- IPv4 (A 记录) 和 IPv6 (AAAA 记录) 都必须能够正确提供验证挑战文件。
如果您不需要 IPv6,可以从 DNS 配置中删除 AAAA 记录。这将使 Let's Encrypt 使用 IPv4 进行验证挑战。
支持
如果上述步骤均无效,请尝试以下其他选项:
- 社区帮助: 加入我们的 Discord 社区 并在支持论坛频道发帖。
- 需要分享的内容: 包括您对问题的描述、任何错误消息以及您已经尝试过的步骤。
