Typo3设HTTP verify=false仍报SSL certificate not found排查
配置的$GLOBALS['TYPO3_CONF_VARS']['HTTP']['verify'] = false不生效,核心原因无外乎三类:配置加载顺序问题导致参数被覆盖、Guzzle老版本逻辑bug、系统/PHP层cURL配置硬编码了无效证书路径,按以下顺序排查即可解决:
1. 先确认配置实际加载值
很多时候配置写了但没生效,是因为写入位置不对被后续逻辑覆盖,先做校验:
- 在站点根目录建临时调试文件
check_http_config.php,写入以下内容:
<?php define('TYPO3_MODE', 'BE'); require __DIR__ . '/typo3/sysext/core/Build/DefaultConfiguration.php'; require __DIR__ . '/typo3conf/LocalConfiguration.php'; if (file_exists(__DIR__ . '/typo3conf/AdditionalConfiguration.php')) { require __DIR__ . '/typo3conf/AdditionalConfiguration.php'; } echo '<pre>'; var_dump($GLOBALS['TYPO3_CONF_VARS']['HTTP']); echo '</pre>';
- 浏览器访问这个文件,看输出的HTTP配置数组中
verify值是否真的为false。如果不是,检查你的配置是不是写在了配置文件的return结构外、或者被文件后半段的其他配置覆盖,AdditionalConfiguration里的自定义配置要放在文件最末尾,避免被覆盖。 - 校验完成立刻删除这个临时文件,避免泄露站点敏感配置。
2. 修复Guzzle版本逻辑bug
TYPO3 10.4.26绑定的Guzzle版本存在逻辑问题:哪怕verify设为false,只要配置数组里存在cert参数且对应文件不存在,就会先抛出你遇到的报错,根本走不到禁用证书校验的逻辑。
直接在AdditionalConfiguration.php中补全配置,清空无效的证书路径参数:
$GLOBALS['TYPO3_CONF_VARS']['HTTP']['verify'] = false; $GLOBALS['TYPO3_CONF_VARS']['HTTP']['cert'] = ''; $GLOBALS['TYPO3_CONF_VARS']['HTTP']['ssl_key'] = '';
如果是生产环境不建议长期关闭证书校验,可以把certbot生成的CA证书绝对路径填到verify参数里,Debian10下certbot生成的证书链默认路径为/etc/letsencrypt/live/你的实际域名/chain.pem,提前给PHP运行用户(一般是www-data)加该路径的读权限即可。
3. 修正PHP层cURL的硬编码配置
如果改完上面配置还是报错,大概率是PHP的cURL扩展硬编码了不存在的CA证书路径,这个配置优先级高于Guzzle的传入参数。
- 先在phpinfo页面搜索
curl.cainfo项,看配置的路径是否真实存在。Debian10系统自带的全局CA证书包路径为/etc/ssl/certs/ca-certificates.crt,先执行ls -l /etc/ssl/certs/ca-certificates.crt确认文件存在。 - 编辑当前PHP版本对应的php.ini文件,HostEurope的WebServer Basic虚拟主机一般是用户目录下
etc/php7.4/php.ini,加入以下两行配置:
curl.cainfo = "/etc/ssl/certs/ca-certificates.crt" openssl.cafile = "/etc/ssl/certs/ca-certificates.crt"
- 保存后在HostEurope主机面板触发PHP配置重载,没有面板权限的话重启PHP-FPM或Apache服务即可。
4. 兼容CLI场景的配置差异
TYPO3后台执行升级、扩展更新时,部分操作会调用CLI模式的PHP执行,CLI模式加载的php.ini文件和Web访问模式不通用,配置不互通:
- 执行
php -i | grep "Loaded Configuration File"查看CLI模式加载的php.ini路径,按上一步的方法把CA证书配置也加到CLI的php.ini中。 - 可以直接跳过Web后端,用TYPO3原生CLI命令执行升级、扩展更新操作,绕过后端的HTTP请求逻辑:
# 先切到站点根目录再执行 php typo3/sysext/core/bin/typo3 upgrade:run php typo3/sysext/core/bin/typo3 extension:update --all
临时应急方案
如果以上方法都没来得及调试,要紧急完成升级,可以直接修改报错的CurlFactory.php文件,在文件存在性判断里加个校验条件,verify为false时跳过证书文件检查:
// 找到原449行的判断逻辑,修改为 if (!empty($cert) && !file_exists($cert)) { throw new \InvalidArgumentException( "SSL certificate not found: {$cert}" ); }
注意这个方案是临时修改核心依赖文件,后续更新TYPO3核心、更新Guzzle包时修改会被覆盖,不建议长期使用。
生产环境不要长期开启
verify=false配置,会存在HTTPS中间人攻击风险,优先配置正确的CA证书路径解决问题。
内容的提问来源于stack exchange,提问作者user3779029

