Mac升级curl后访问站点报SSL错误,如何建立安全/不安全连接
问题原因
你遇到的错误error:0A000152:SSL routines::unsafe legacy renegotiation disabled是因为升级后的Mac端curl依赖OpenSSL 3.0版本,该版本默认禁用了不符合RFC 5746标准的不安全旧版SSL重协商机制。你请求的目标站点未实现安全重协商扩展,即使加了--insecure跳过证书校验,也会被OpenSSL的默认安全策略拦截。
旧版本Ubuntu上的curl依赖OpenSSL 1.1.1,该版本默认允许旧版重协商,所以可以正常拿到返回结果。浏览器能正常访问是因为浏览器对部分老旧公共站点做了特殊兼容降级处理。
解决方案
命令行curl请求
单次临时解决
执行curl命令前临时指定OpenSSL配置,允许不安全重协商:
OPENSSL_CONF=<(echo -e "openssl_conf = default_conf [default_conf] ssl_conf = ssl_sect [ssl_sect] system_default = system_default_sect [system_default_sect] Options = UnsafeLegacyRenegotiation") curl --insecure --head https://www.ahpra.gov.au
全局生效(不推荐,会降低全局安全等级)
修改你设备上的OpenSSL 3.0配置文件(MacPorts安装的路径一般为/opt/local/etc/openssl-3/openssl.cnf),在[system_default_sect]段落下添加如下配置:
Options = UnsafeLegacyRenegotiation
保存后所有依赖OpenSSL 3.0的程序都会允许旧版重协商。
Guzzle适配修改
在你的Guzzle客户端配置的curl参数数组中,新增CURLOPT_SSL_OPTIONS项,指定允许旧版重协商即可:
<?php ... $client = new Client([ 'cookies' => TRUE, 'verify' => FALSE, 'curl' => [ CURLOPT_NOBODY => TRUE, CURLOPT_SSL_VERIFYSTATUS => FALSE, CURLOPT_SSL_VERIFYHOST => FALSE, CURLOPT_SSL_VERIFYPEER => FALSE, CURLOPT_SSL_OPTIONS => CURLSSLOPT_ALLOW_LEGACY_RENEGOTIATION, CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', ]]);
如果你的PHP curl扩展版本过低不识别CURLSSLOPT_ALLOW_LEGACY_RENEGOTIATION常量,可以直接替换为对应的数值0x20000。
内容的提问来源于stack exchange,提问作者pgee70
相关产品推荐
相关产品推荐

