内网无法直接启用frankenphp自动https,因其依赖caddy的acme客户端向let’s encrypt申请证书,而let’s encrypt不支持内网地址(如192.168.x.x、localhost、intranet),会返回http 400错误;正确做法是使用openssl生成带san的自签名证书并手动安装到系统根证书存储,再在caddyfile中显式指定证书路径。

内网用 FrankenPHP 为什么不能直接开自动 HTTPS
FrankenPHP 的 auto HTTPS 依赖 Caddy 内置的 ACME 客户端,而 Let’s Encrypt 要求能从公网访问你的域名(80/443 端口 + DNS 或 HTTP 挑战),内网地址如 https://192.168.1.100、https://intranet、https://localhost 全部不被支持。Caddy 尝试申请时会直接报错 HTTP 400 urn:ietf:params:acme:error:rejectedIdentifier,根本走不到证书签发那步。
本地自签名证书 + 手动信任是最可行方案
对纯内网环境,最稳定的做法是生成自签名证书,再让客户端(主要是浏览器)明确信任它。FrankenPHP 本身不拦你换证书,它只管加载——关键在怎么配、怎么装、怎么避免反复报错。
- 用 OpenSSL 生成带 SAN 的证书(必须含
subjectAltName,否则现代浏览器直接拒):openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ -keyout cert.key \ -out cert.crt \ -subj "/CN=intranet" \ -addext "subjectAltName = DNS:intranet, IP:192.168.1.100"
- 把
cert.crt和cert.key放进 FrankenPHP 工作目录,Caddyfile 显式指定:https://intranet { tls cert.crt cert.key php_server } - 双击
cert.crt→ “安装证书” → “本地计算机” → “受信任的根证书颁发机构” → 完成;Windows/macOS/Linux 各有对应导入方式,但必须进系统级根存储,浏览器自己的证书管理器无效。
Edge/Chrome 访问仍报错?先清两级 SSL 缓存
即使证书已装好,Edge 和 Chrome 常因缓存残留继续报 NET::ERR_CERT_AUTHORITY_INVALID。这不是 FrankenPHP 的问题,而是客户端状态没刷新。
- Edge:访问
edge://settings/clearBrowserData→ 勾选“SSL 状态”+“Cookie 及其他网站数据” → 清除后彻底关闭所有 Edge 窗口(包括后台进程)再重开 - Windows 系统级:按
Win + R→ 输入inetcpl.cpl→ “内容”页 → “清除 SSL 状态” - macOS:钥匙串访问 → 登录钥匙串 → 搜索证书名 → 右键“显示简介”→ “信任”→ 设为“始终信任”→ 关闭并输入密码确认
开发调试时可临时禁用证书校验(仅限 CLI 场景)
如果你的 PHP 代码本身要通过 curl 或 Guzzle 请求这个内网 FrankenPHP 接口(比如做内部 API 调用),而服务器没装 CA 包,就会遇到 SSL certificate problem: unable to get local issuer certificate。这时不是改 FrankenPHP,而是改调用方:
- 在
php.ini中补上 CA 包路径:curl.cainfo = "/path/to/cacert.pem" openssl.cafile = "/path/to/cacert.pem"
(cacert.pem可从 curl.haxx.se 下载) - 或在代码里临时关校验(仅限可信内网、非生产):
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
注意:FrankenPHP 自身作为服务端不参与这个校验过程;出问题的是它下游的 PHP 客户端请求行为。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











