PHP控制台无法连接WSDL:Yii调用SOAP接口SSL证书验证失败
问题现象
调用SRI(厄瓜多尔税务总局)的离线发票接收WebService时,持续出现以下错误:
Handler捕获到错误2:'SoapClient::SoapClient(): SSL操作失败,错误代码1。OpenSSL错误信息:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed'
Handler捕获到错误2:'SoapClient::SoapClient(): Failed to enable crypto'
Handler捕获到错误2:'SoapClient::SoapClient(https://cel.sri.gob.ec/comprobantes-electronicos-ws/RecepcionComprobantesOffline?wsdl): 无法打开流:操作失败'
Handler捕获到错误2:'SoapClient::SoapClient(): I/O警告:无法加载外部实体"https://cel.sri.gob.ec/comprobantes-electronicos-ws/RecepcionComprobantesOffline?wsdl"'
Error en la Conexión al SRI (Validación), no hay servicio disponible
已确认PHP 7.4/8.1/8.2版本均存在该问题,且openssl、soap模块已启用,WebService本身处于在线状态。
解决方案
1. 配置SRI官方根证书(生产环境推荐)
SRI的SSL证书需要对应的根证书才能通过验证,步骤如下:
- 从SRI官方渠道获取根证书,保存到项目目录(例如
@app/config/sri_root_cert.pem) - 创建
SoapClient时,通过stream_context指定CA证书路径:
// Yii框架中创建SoapClient的示例代码 $contextOptions = [ 'ssl' => [ 'cafile' => Yii::getAlias('@app/config/sri_root_cert.pem'), 'verify_peer' => true, 'verify_peer_name' => true, ] ]; $streamContext = stream_context_create($contextOptions); try { $soapClient = new SoapClient( 'https://cel.sri.gob.ec/comprobantes-electronicos-ws/RecepcionComprobantesOffline?wsdl', [ 'stream_context' => $streamContext, 'cache_wsdl' => WSDL_CACHE_NONE, // 可选,禁用WSDL缓存避免旧文件影响 ] ); } catch (\SoapFault $e) { // 处理连接错误 Yii::error('SRI WebService连接失败:' . $e->getMessage()); }
2. 临时跳过证书验证(仅测试环境使用)
如果是测试环境快速排查问题,可以临时关闭证书验证,但生产环境绝对禁止使用,存在中间人攻击风险:
$contextOptions = [ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true, ] ]; $streamContext = stream_context_create($contextOptions); $soapClient = new SoapClient( 'https://cel.sri.gob.ec/comprobantes-electronicos-ws/RecepcionComprobantesOffline?wsdl', ['stream_context' => $streamContext] );
3. 更新服务器系统CA证书库
部分服务器的系统CA证书库过时,导致无法识别SRI的新证书,可通过以下命令更新:
- Debian/Ubuntu系统:
sudo apt-get update && sudo apt-get install ca-certificates && sudo update-ca-certificates
- CentOS/RHEL系统:
sudo yum install ca-certificates && sudo update-ca-trust
注意事项
- 生产环境必须使用根证书验证的方式,禁止跳过证书检查
- 确保获取的SRI根证书为官方发布,避免使用第三方来源的证书引发安全问题
- 若使用Yii2框架,可将证书路径配置到
params.php中,便于统一管理
内容的提问来源于stack exchange,提问作者Diego Galarza

