Windows10环境下Laravel调用API遇cURL error 35问题求助
问题原因及解决方法
核心原因
这个错误的本质是PHP 8.x配套的OpenSSL 3.0+版本默认禁用了不安全的旧版SSL协商机制,而IBGE的API服务器目前仍在使用这类不符合RFC 5746标准的协商方式。
PHP 7.4通常搭配的是OpenSSL 1.x版本,该版本没有强制启用这种安全限制,所以能正常完成请求。
解决方法
方法1:在请求中添加cURL参数(推荐,无需修改全局配置)
在Laravel的HTTP客户端请求里,通过自定义cURL选项放宽SSL安全等级:
// Laravel HTTP客户端示例 $response = Http::withOptions([ 'curl' => [ CURLOPT_SSL_CIPHER_LIST => 'DEFAULT@SECLEVEL=1', CURLOPT_SSL_ENABLE_ALPN => false, ], ])->get('https://servicodados.ibge.gov.br/api/v1/localidades/estados');
如果是用原生cURL函数,写法如下:
$ch = curl_init('https://servicodados.ibge.gov.br/api/v1/localidades/estados'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 放宽SSL安全等级,允许旧版协商 curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'DEFAULT@SECLEVEL=1'); // 禁用ALPN协商(部分旧服务器不支持) curl_setopt($ch, CURLOPT_SSL_ENABLE_ALPN, false); $response = curl_exec($ch); curl_close($ch);
方法2:修改全局OpenSSL配置(影响所有PHP请求)
找到PHP安装目录下的openssl.cnf(Windows下可能是openssl.cfg),定位到[system_default_sect]区块,添加或修改以下配置:
MinProtocol = TLSv1.2 CipherString = DEFAULT@SECLEVEL=1
修改完成后,重启你的Web服务(Apache、Nginx或PHP-FPM)即可生效。
方法3:降级OpenSSL版本(不推荐)
如果上述方法都无法解决,可以考虑将PHP 8.x配套的OpenSSL降级到1.x版本,但这会降低整体的SSL安全性,仅作为临时应急方案。
内容的提问来源于stack exchange,提问作者Bruno Silva
相关产品推荐
相关产品推荐

