在使用 LinkAce(一个基于 Laravel 的自托管书签管理工具)过程中,不少用户会遇到这样的问题:
添加书签时提示「链接已添加,但在尝试请求 URL 时发生错误,例如无效的证书」。
这种情况往往发生在 Windows + Nginx + PHP 的运行环境里,本质原因是 —— PHP 没有正确找到 SSL 根证书(CA 证书),导致在请求目标网站时无法完成证书验证。
本文记录一次完整的排查与解决过程。
一、问题背景
-
系统环境:Windows
-
Web 服务器:Nginx
-
PHP 版本:8.4.x (NTS)
-
应用:LinkAce
症状:
-
添加某些 https 链接时,提示 证书无效。
-
storage/logs/laravel.log
中能看到类似报错:SSL certificate problem: unable to get local issuer certificate
二、原因分析
-
Windows 下的 PHP 默认不使用系统证书库
与 Linux 不同,Windows 上 PHP 并不会自动读取系统的受信任根证书。 -
cURL/Guzzle 需要明确指定 CA 文件路径
LinkAce 在抓取网页元数据时,使用了 PHP 的 Guzzle(基于 cURL),必须依赖cacert.pem
来验证对方网站的 SSL 证书。 -
php.ini 中路径配置错误
如果在php.ini
里路径写成:curl.cainfo = "D:\php\cacert.pem"
有可能因为反斜杠被当成转义字符而找不到文件。
三、解决步骤
1. 下载最新 CA 根证书
从官方获取最新证书文件:https://curl.se/ca/cacert.pem
保存到本地,例如:
D:/program/php/php-8.4.10-nts-Win32-vs17-x64/cacert.pem
2. 修改 php.ini 配置
编辑 php.ini
,找到以下配置项:
[curl]
curl.cainfo = "D:/program/php/php-8.4.10-nts-Win32-vs17-x64/cacert.pem"
[openssl]
openssl.cafile = "D:/program/php/php-8.4.10-nts-Win32-vs17-x64/cacert.pem"
⚠️ 注意事项:
-
路径必须是 绝对路径。
-
推荐使用 正斜杠
/
或 双反斜杠\\
。 -
在
php.ini
中,其实单反斜杠\
也可以工作,例如:curl.cainfo ="D:\program\php\php-8.4.10-nts-Win32-vs17-x64\cacert.pem" openssl.cafile="D:\program\php\php-8.4.10-nts-Win32-vs17-x64\cacert.pem"
因为
php.ini
的解析器对路径中的\
容忍度较高。
3. php.ini 与 PHP 代码路径写法对比
场景 | 推荐写法 | 可用但不推荐写法 |
---|---|---|
php.ini | D:/php/path/cacert.pem 或 D:\\php\\path\\cacert.pem |
D:\php\path\cacert.pem (通常也能用) |
PHP 代码 | D:/php/path/cacert.pem 或 D:\\php\\path\\cacert.pem |
❌ D:\php\path\cacert.pem (可能被当转义,出错) |
👉 总结:
-
在
php.ini
中,/
、\\
、\
基本都能用; -
在 PHP 脚本里,必须用
/
或\\
,不能直接写单个\
。
4. 重启服务
修改完 php.ini
后,重启:
-
PHP-FPM / PHP-CGI
-
Nginx
5. 验证配置是否生效
新建 phpinfo.php
文件:
<?php phpinfo(); ?>
访问后检查:
-
curl.cainfo
-
openssl.cafile
是否显示了刚才配置的路径。
6. 测试 LinkAce
重新添加书签,之前提示「证书无效」的站点现在应该能正常获取元数据了。
四、特别情况:自签名 / 内网证书
如果目标网站用的是自签名证书,仍然会报错。这时有两种方案:
-
将证书导入 Windows 受信任根证书
-
双击
.crt
文件 → 安装到「受信任的根证书颁发机构」。
-
-
在 LinkAce 中禁用 SSL 验证(不推荐生产环境)
在app/Helpers/Bookmark/BookmarkService.php
里修改 Guzzle 配置:$client = new \GuzzleHttp\Client([ 'verify' => false, ]);
五、总结
-
Windows 环境下运行 PHP,需要手动指定
cacert.pem
。 -
php.ini
中的路径可以写成/
、\\
,甚至\
,但在 PHP 代码里必须用/
或\\
。 -
配置完成后,通过
phpinfo()
验证,再测试 LinkAce。 -
自签名证书需额外处理,否则依旧会报错。
这样,就能彻底解决 LinkAce 在 Windows + Nginx + PHP 下的 SSL 证书问题。 🚀