PHP调用HTTPS服务证书校验怎关_PHPHTTPS关证书校验调用法【跳过】

8次阅读

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

PHP调用HTTPS服务证书校验怎关_PHPHTTPS关证书校验调用法【跳过】

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.capathcurl.cainfo 也一样 —— 这些只是指定证书源,不是开关

常见错误现象与兼容性注意点

跳过校验后仍报错?很可能是其他问题干扰判断:

  • PHP 5.6+ 默认启用证书校验,若没显式关闭,常见错误:cURL Error 60: SSL certificate problem: unable to get local issuer certificatePeer'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 链,临时跳过只是调试手段,上线前必须撤掉。

text=ZqhQzanResources