LinkAce 在 Windows + Nginx + PHP 环境下解决 SSL 证书问题实战

 

在使用 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
    

二、原因分析

  1. Windows 下的 PHP 默认不使用系统证书库
    与 Linux 不同,Windows 上 PHP 并不会自动读取系统的受信任根证书。

  2. cURL/Guzzle 需要明确指定 CA 文件路径
    LinkAce 在抓取网页元数据时,使用了 PHP 的 Guzzle(基于 cURL),必须依赖 cacert.pem 来验证对方网站的 SSL 证书。

  3. 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.pemD:\\php\\path\\cacert.pem D:\php\path\cacert.pem(通常也能用)
PHP 代码 D:/php/path/cacert.pemD:\\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

重新添加书签,之前提示「证书无效」的站点现在应该能正常获取元数据了。


四、特别情况:自签名 / 内网证书

如果目标网站用的是自签名证书,仍然会报错。这时有两种方案:

  1. 将证书导入 Windows 受信任根证书

    • 双击 .crt 文件 → 安装到「受信任的根证书颁发机构」。

  2. 在 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 证书问题。 🚀

No comments

公司简介

 

自1996年以来,公司一直专注于域名注册、虚拟主机、服务器托管、网站建设、电子商务等互联网服务,不断践行"提供企业级解决方案,奉献个性化服务支持"的理念。作为戴尔"授权解决方案提供商",同时提供与公司服务相关联的硬件产品解决方案。
备案号: 豫ICP备05004936号-1

联系方式

地址:河南省郑州市经五路2号

电话:0371-63520088

QQ:76257322

网站:800188.com

电邮:该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。