必须同时设 curlopt_ssl_verifypeer => 0l 和 curlopt_ssl_verifyhost => 0l 才能跳过 ssl 证书验证,仅设其一无效;该方式等效于命令行 curl -k,仅限调试,生产环境严禁使用。

直接设两个选项就能跳过验证,但别在生产环境用
curl_easy_setopt 设置 CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST
libcurl 默认开启 SSL 证书校验,出错时常见返回 CURL_SSL_CACERT(错误码 60)或日志里提示 SSL peer certificate or SSH remote key was not OK。要临时绕过,必须同时关闭两项检查:
-
CURLOPT_SSL_VERIFYPEER设为0L:跳过 CA 证书链验证(即不检查证书是否由可信根签发、是否过期、是否被吊销) -
CURLOPT_SSL_VERIFYHOST设为0L:跳过主机名匹配验证(即不检查证书里的Subject Alternative Name或Common Name是否与请求域名一致)
注意:CURLOPT_SSL_VERIFYHOST 在 libcurl 7.66.0+ 中设为 1L 已等效于 2L(严格模式),但设为 0L 才真正禁用;旧版本如 7.28.1 中设 1L 实际无效,必须用 0L。
命令行 curl -k 与代码中等效行为
命令行的 curl -k https://example.com 就是底层调用了和上面一样的选项组合。它本质等价于:
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
不是只关一个就行——如果只关 CURLOPT_SSL_VERIFYPEER 而保留 CURLOPT_SSL_VERIFYHOST 为默认值 2L,遇到自签名证书或域名不匹配时仍会失败。
为什么不能只指定 CURLOPT_CAINFO 就行?
有人试过加 curl_easy_setopt(curl, CURLOPT_CAINFO, "cacert.pem") 却还是报错,原因通常是:
- 下载的
cacert.pem过期(比如用的是 2021 年的老版本,而当前很多证书链依赖新中间 CA) - 服务器没下发完整的证书链,而你的
cacert.pem缺少对应中间证书(mbedTLS 后端对此尤其敏感) - 路径写错或文件权限不足,libcurl 根本没读到证书(可加
CURLOPT_VERBOSE看调试输出确认)
所以,当快速验证连通性时,-k 或双 0L 是最直接的手段;但只要涉及真实数据交互,就必须回归证书链本身——更新 cacert.pem、补全中间证书、或改用系统级证书存储(如 Windows 的 WinSSL 后端自动信任系统根证书)。
真正容易被忽略的点是:不同 TLS 后端(OpenSSL / mbedTLS / WinSSL)对证书缺失的报错表现不一致,同一份代码在 Linux 和 Windows 上可能一个成功一个失败——别只盯着选项,先 curl --version 看清你链接的是哪个后端。










