Chrome 报 ERR_CERT_INVALID 是因 phpEnv 默认证书缺 SAN、密钥弱、有效期超 825 天、未正确导入系统根证书库,且 macOS 与 Windows 信任机制不同,任一环节缺失均导致不信任。

Chrome 对 phpEnv 的自签名 HTTPS 域名直接报 ERR_CERT_INVALID,不是配置漏了,而是默认生成的证书根本不符合现代浏览器要求——缺 SAN、密钥弱、没证书链,光改 host 或配 vhost 没用。
为什么 phpEnv 生成的证书在 Chrome 里总显示“不安全”
phpEnv 自带的 OpenSSL 脚本(如 ssl_create.bat)通常只填 CN=localhost,不写 SAN(Subject Alternative Name)。Chrome 从 2017 年起就强制要求 HTTPS 证书必须含 SAN,否则直接拒绝信任,哪怕你把它导入系统根证书也不行。另外常见问题还有:
-
keytool或旧版 OpenSSL 生成的 RSA 密钥小于 2048 位,被 Chrome 标记为弱加密 - 证书有效期设成 10 年(
-days 3650),超出了 Chrome 当前上限(825 天) - 证书没绑定具体域名(比如
test.local),只绑了localhost,而你在 hosts 里配的是127.0.0.1 test.local - Windows 下证书导入到了「当前用户」而非「本地计算机」的「受信任的根证书颁发机构」
用 OpenSSL 手动重生成合规证书(支持自定义域名)
别依赖 phpEnv 自带脚本。进到 phpEnv 的 ssl 目录(通常是 C:\phpEnv\ssl\),新建一个 test.local.ext 文件,内容如下:
subjectAltName = DNS:test.local, IP:127.0.0.1 keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth
然后执行三步命令(替换 test.local 为你实际配的域名):
立即学习“PHP免费学习笔记(深入)”;
openssl req -x509 -sha256 -nodes -days 825 -newkey rsa:2048 -keyout test.local.key -out test.local.crt -subj "/CN=test.local" -extfile test.local.ext- 把生成的
test.local.crt双击导入 Windows 证书管理器 → 「本地计算机」→ 「受信任的根证书颁发机构」→ 「证书」→ 右键导入 - 重启 phpEnv 的 Apache,并确认
httpd-vhosts.conf里对应站点启用了SSLCertificateFile和SSLCertificateKeyFile指向新证书
Chrome 启动参数临时绕过(仅限开发机)
如果你只是想快速验证 PHP 逻辑,不想折腾证书,可为 Chrome 创建专用快捷方式,目标栏末尾加:
--test-type --ignore-certificate-errors --unsafely-treat-insecure-origin-as-secure="https://test.local" --user-data-dir=C:\temp\chrome-test
注意两点:
- 必须加
--user-data-dir,否则参数无效;路径不能是已存在的 Chrome 用户目录 -
--unsafely-treat-insecure-origin-as-secure后面的地址要和你浏览器访问的 URL 完全一致(包括https://和端口) - 该方式下所有 HTTPS 请求都跳过校验,
thisisunsafe快捷键在新版 Chrome(≥105)中对非localhost域名已失效
macOS 下必须走钥匙串 + 全信任设置
Chrome on macOS 不读取 Windows 那套 certmgr,它完全依赖系统钥匙串。即使你用 OpenSSL 生成了带 SAN 的证书,也得手动设为「始终信任」:
- 双击
test.local.crt→ 钥匙串访问自动打开 → 存入「系统」钥匙串 - 在钥匙串中找到该证书 → 右键「显示简介」→ 展开「信任」→ 「使用此证书时」选「始终信任」
- 关闭所有 Chrome 窗口(Cmd+Q),再重新打开,否则信任不生效
- 如果仍报错,运行
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain test.local.crt强制注入
真正卡住人的地方,往往不是不会生成证书,而是生成后没意识到 Chrome 已经不认「单证书」了——它要的是完整链、明确 SAN、正确存储位置,且 macOS 和 Windows 的信任路径完全不同。漏掉任一环,都会回到那个红色警告页。



















