php跳过https证书校验需显式设置curl的curlopt_ssl_verifypeer=false和curlopt_ssl_verifyhost=0,或stream_context_create中ssl.verify_peer=false与verify_peer_name=false;仅限开发环境临时使用,生产环境必须启用证书验证。

PHP 调用 HTTPS 服务时默认校验证书,跳过校验不是“关掉”某个开关,而是通过 cURL 配置显式禁用验证 —— 但必须清楚后果:这会让请求暴露在中间人攻击风险下,仅限开发或内网可信环境临时使用。
curl_setopt 设置 CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST
这是最直接、最常用的跳过方式,适用于 curl_init() 发起的 HTTPS 请求:
-
CURLOPT_SSL_VERIFYPEER设为false:不验证服务器证书是否由受信任 CA 签发 -
CURLOPT_SSL_VERIFYHOST设为0(注意是整数 0,不是布尔 false):不验证证书中的域名是否匹配请求主机名(PHP 7.0.16+ 已废弃该选项,但设为 0 仍生效;设为 2 是严格模式,1 已被忽略) - 二者必须同时设置,否则可能报错或行为不一致(例如只关
VERIFYPEER但保留VERIFYHOST= 2,仍会因域名不匹配失败)
示例:
$ch = curl_init('https://example.com/api');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$response = curl_exec($ch);
curl_close($ch);
stream_context_create 中禁用 SSL 验证(file_get_contents 场景)
当用 file_get_contents() 或 fopen() 调用 HTTPS URL 时,需通过 stream_context_create() 传入上下文:
立即学习“PHP免费学习笔记(深入)”;
- SSL 上下文选项中,
verify_peer必须设为false -
verify_peer_name设为false(等效于CURLOPT_SSL_VERIFYHOST = 0) - 若不设
verify_peer_name,PHP 7.4+ 默认为 true,仍会校验域名,导致连接失败
示例:
$context = stream_context_create([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
]
]);
$result = file_get_contents('https://example.com/api', false, $context);
为什么不能用 ini_set('openssl.cafile', '') 或类似方式“关闭”?
这类操作无效,原因如下:
-
openssl.cafile是 PHP 的全局配置项,用于指定 CA 证书路径;设为空字符串或 null 不等于“跳过校验”,而是让 OpenSSL 尝试用内置默认路径(如系统 cert store),实际效果不可控 - PHP 的 HTTPS 流封装器和 cURL 都不读取该 ini 设置来决定是否校验,它们各自依赖自己的上下文或选项
- 试图修改
openssl.capath或curl.cainfo也一样 —— 这些只是指定证书源,不是开关
常见错误现象与兼容性注意点
跳过校验后仍报错?很可能是其他问题干扰判断:
- PHP 5.6+ 默认启用证书校验,若没显式关闭,常见错误:
cURL error 60: SSL certificate problem: unable to get local issuer certificate或Peer's Certificate issuer is not recognized - PHP 7.0.7+ 对
CURLOPT_SSL_VERIFYHOST的值更严格:设为false会触发警告并降级为 2;必须用整数0 - 某些 Linux 发行版(如 CentOS)的 PHP 编译时未链接系统 OpenSSL,或 ca-bundle 路径异常,即使跳过校验,也可能因 TLS 握手失败而报
Unknown SSL protocol error—— 此时应优先检查 OpenSSL 版本和 TLS 协议支持(如服务端只支持 TLS 1.3,而 PHP 7.2- 不原生支持)
真正要跳过校验,就老老实实设那两个选项;别指望绕过它们还能安全又稳定。生产环境务必用真实证书 + 正确 CA 链,临时跳过只是调试手段,上线前必须撤掉。











