FrankenPHP 1.4 HTTPS 证书颁发失败的核心原因是 Caddy 自动申请 Let’s Encrypt 证书的三大前提未同时满足:DNS 解析正确、80 端口公网可达、域名未被限速;内网环境需关闭自动 HTTPS 并手动配置证书。

FrankenPHP 1.4 HTTPS 证书颁发失败,核心原因不是版本升级导致的兼容问题,而是 Caddy 自动申请 Let’s Encrypt 证书的三大硬性前提未同时满足。只要逐项排查并修复,基本都能恢复自动签发。
先看终端最后一行 stderr 报错
FrankenPHP 启动时的证书错误不会写进日志文件,全部实时输出在终端 stderr 中。关键线索就在最后一行,例如:
- “Domain name does not resolve to this server” → DNS 解析未指向当前服务器 IP
- “timeout during connect” → 80 端口无法从公网访问(防火墙、云厂商安全组、NAT 映射未放行)
- “rate limit exceeded” → 同一域名 7 天内失败超 5 次,被 Let’s Encrypt 临时限速
必须同时满足的三个前提条件
Caddy(FrankenPHP 底层)申请证书依赖 HTTP-01 挑战,缺一不可:
- DNS A/AAAA 记录已生效:运行 dig your-domain.com +short 必须返回你服务器的真实公网 IP
- 80 端口对外可达:Caddy 需监听并响应 ACME 的验证请求,云服务器安全组、本地防火墙(如 firewalld)、路由器端口映射都需放行 TCP 80
- 域名未被限速:若刚批量测试失败,换子域名(如 test.your-domain.com)或等 24–48 小时再试
内网或本地开发环境不能用自动 HTTPS
localhost、192.168.x.x、10.x.x.x 或公司内网部署时,Let’s Encrypt 不接受申请。此时必须:
立即学习“PHP免费学习笔记(深入)”;
- 关闭自动 HTTPS:CADDY_AUTO_HTTPS=off(Docker Compose 中 environment 下设置)
- 手动准备证书:将 fullchain.pem 重命名为 your-domain.com.crt,privkey.pem 重命名为 your-domain.com.key
- 放入正确路径并设权限:复制到宿主机 ./caddy_data/certificates/,执行 chmod 600 *.key
- 确认加载成功:启动后终端日志出现 Using provided certificate 字样,且容器内 ls -l /data/certificates/ 显示权限为 -rw-------
检查 Caddyfile 是否干扰自动流程
FrankenPHP 1.4 仍基于 Caddy 2.8+,默认启用 automatic_https。以下配置会破坏自动申请和续期:
- 在 server 块中写了 tls /path/to/cert.pem /path/to/key.pem → 手动指定路径会跳过 ACME
- 全局或局部写了 automatic_https off → 直接禁用整个机制
- 监听写成 :80 或 localhost → 自动 HTTPS 只对合法域名生效,如 your-domain.com { ... }



















