Yii2站点Gmail登录报stream_get_contents SSL错误如何排查

问题根因
- 系统存在多版本OpenSSL冲突:PHP扩展链接的是OpenSSL 3.0.2,系统全局命令调用的是老旧的OpenSSL 1.0.1f,库文件加载混乱会导致SSL握手异常。
- OpenSSL 3.0.2存在已知兼容bug:该版本对SSL连接的EOF处理逻辑有缺陷,会在正常连接场景下误报
unexpected eof while reading错误。 - SSL配置不符合要求:当前配置未强制指定TLS版本,Google OAuth接口已废弃TLS1.0/1.1,旧版本协议连接会被直接断开;同时CA证书路径配置不全,
openssl.capath为空,证书校验流程异常。 - 原生StreamTransport兼容性不足:Yii2的StreamTransport依赖PHP原生流封装,在OpenSSL3环境下的适配不如cURL扩展稳定。
解决步骤
- 清理OpenSSL版本冲突
执行以下命令卸载旧版本OpenSSL残留,重装匹配的依赖和证书库:
执行完成后运行apt remove --purge openssl1.0 libssl1.0* apt install --reinstall openssl libssl3 ca-certificates update-ca-certificatesopenssl version,确认输出版本和PHP中加载的OpenSSL版本一致,均为3.0.2。 - 修正PHP的OpenSSL配置
找到Nginx对应PHP-FPM使用的php.ini文件(路径通常为/etc/php/{你的PHP版本号}/fpm/php.ini),修改openssl配置段:
保存后重启PHP-FPM生效:openssl.cafile = "/etc/ssl/certs/ca-certificates.crt" openssl.capath = "/etc/ssl/certs/"systemctl restart php{你的PHP版本号}-fpm - 调整HttpClient的SSL参数
不要直接修改vendor下的源码,在实例化yii-httpclient时添加如下SSL配置,强制使用合规的TLS版本,兼容OpenSSL3的校验逻辑:$client = new \yii\httpclient\Client([ 'transport' => \yii\httpclient\StreamTransport::class, 'requestConfig' => [ 'options' => [ 'ssl' => [ 'verify_peer' => true, 'verify_peer_name' => true, 'allow_self_signed' => false, 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT, 'ciphers' => 'DEFAULT@SECLEVEL=1' ] ] ] ]); - 可选稳定方案
若调整后仍有异常,直接将传输层换成CurlTransport,cURL扩展的SSL握手逻辑稳定性远高于PHP原生流,配置时指定transport即可:
注意提前确认服务器已安装对应版本的php-curl扩展。$client = new \yii\httpclient\Client([ 'transport' => \yii\httpclient\CurlTransport::class, // 其余配置保持不变 ]);
注:原代码中
verify_peer => false属于不安全配置,会导致SSL证书校验失效,存在中间人攻击风险,修复问题时请改回开启状态。
内容的提问来源于stack exchange,提问作者pradip.parkar
相关产品推荐
相关产品推荐

