本地PHP环境配HTTPS主要为绕过浏览器对非localhost HTTP地址的API限制及测试强制HTTPS场景,推荐用mkcert生成并信任自签名证书,再通过Apache/Nginx配置,PHP内置服务器不支持HTTPS。

本地 PHP 环境配 HTTPS 不是为了“上线安全”,而是为了绕过浏览器对 localhost 以外的 http:// 地址的限制(比如调用 getUserMedia、service worker、Geolocation API),或者测试 OAuth2 回调、微信 JS-SDK 等强制要求 HTTPS 的场景。直接用自签名证书 + 本地信任是最可行的路径。
生成自签名证书(OpenSSL 方式)
PHP 自带的 php -S 内置服务器不支持 HTTPS,必须借助 Apache 或 Nginx。这里以最轻量、跨平台兼容性好的 mkcert 工具为主流推荐——它比手敲 openssl req 更可靠,且能自动适配现代浏览器信任链。
-
mkcert会为你本地生成一个根证书(rootCA.pem),并把它加入系统钥匙串(macOS / Windows)或ca-certificates(Linux),之后签发的域名证书才不会被标记为“不安全” - 运行
mkcert -install一次即可,后续所有证书都基于这个可信根 - 为
localhost生成证书:mkcert localhost 127.0.0.1 ::1
输出两个文件:localhost+2-key.pem(私钥)和localhost+2.pem(证书) - 别用
openssl req -x509手动生成:默认不带subjectAltName,Chrome 会直接拒绝,报错NET::ERR_CERT_INVALID
Apache 配置 HTTPS(Windows/macOS/Linux 通用)
确认已启用 mod_ssl 和 ssl_module。在 httpd.conf 或虚拟主机配置中添加:
ServerName localhost DocumentRoot "/path/to/your/php/project" SSLEngine on SSLCertificateFile "/path/to/localhost+2.pem" SSLCertificateKeyFile "/path/to/localhost+2-key.pem" Require all granted AllowOverride All
- 确保
Listen 443已在主配置中启用 -
SSLCertificateFile必须是 PEM 格式证书(不是 CRT 或 CER);如果用 OpenSSL 生成,需确保含完整证书链(通常单文件即可) - 重启 Apache 后访问
https://localhost,首次会提示“您的连接不是私密连接”——点击“高级”→“继续前往 localhost(不安全)”即可(仅首次,因证书已由mkcert -install信任) - 若仍报错,检查 Apache 错误日志:
tail -f logs/error_log,常见问题是路径错误或权限不足(尤其 macOS 上私钥需chmod 600)
PHP 内置服务器无法直接跑 HTTPS
别折腾 php -S 加 HTTPS:它压根不支持 TLS。有人用 stunnel 或反向代理(如 nginx 做前端 HTTPS,转发到 php -S :8000),但复杂度陡增,且失去热重载便利性。
系统易学易懂,用户只需会上网、不需学习编程及任何语言,只要使用该系统平台,只要会打字,即可在线直接完成建站所有工作。本程序适合不懂php环境配置的新手用来在本机调试智能SiteSEO网站优化软件,安装过程极其简单。您的网站地址:http://localhost您的网站后台:登录地址: http://localhost/admin.php密 码: admin服务器套件所包含的软件:nginx-0.7
立即学习“PHP免费学习笔记(深入)”;
- 开发阶段更推荐:用 Nginx/Apache 跑 HTTPS,同时用 IDE 或命令行启动 PHP CLI 脚本调试逻辑,静态资源和路由交由 Web 服务器处理
- 若坚持用内置服务器,可临时降级需求:Chrome 从 94 版起允许
localhost使用http://调用部分敏感 API(如mediaDevices),但serviceWorker仍强制 HTTPS - VS Code 的
PHP Server插件、PhpStorm 的内置服务器,底层仍是php -S,同样不支持 HTTPS
验证 HTTPS 是否生效且被信任
打开 Chrome 访问 https://localhost,地址栏左侧应显示锁形图标,点击后能看到“连接是安全的”,证书颁发者是 mkcert development CA。
- 若显示“不安全”或红色警告,右键 → “检查” → 切换到
Security标签页,点“View certificate”确认证书是否由你本地安装的根证书签发 - 用
curl -k https://localhost测试服务可达性(-k跳过证书校验);若要严格校验,加--cacert rootCA.pem - PHP 中调用外部 HTTPS 接口时,若遇到
cURL error 60: SSL certificate problem,说明 cURL 默认未信任你本地的根证书,需设置curl_setopt($ch, CURLOPT_CAINFO, '/path/to/rootCA.pem')或全局配置curl.cainfoini 项
最难的一步其实是让系统信任那个根证书——mkcert -install 成功与否,直接决定后续所有步骤是否白忙。很多问题表面是 Apache 配置错,实际是根证书没装进钥匙串或没刷新信任链。










