PHP的cURL选项CURLOPT_SSL_VERIFYPEER详解

在开发微信支付的过程中,遇到了关于cURL加密传输的问题,做下记录方便今后查阅。

提交数据到https时,需要pem证书来加密。
我们使用浏览器访问https的时候,浏览器会自动加载网站的安全证书进行加密。但是你用curl请求https时,没有通过浏览器,就只有自己手动增加一个安全证书进行加密。


private function httpGet($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
    // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
    curl_setopt($curl,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');//这是根据http://curl.haxx.se/ca/cacert.pem 下载的证书,添加这句话之后就运行正常了
    curl_setopt($curl, CURLOPT_URL, $url);

    $res = curl_exec($curl);
    curl_close($curl);

    return $res;

}

知识点摘要:
CURLOPT_SSL_VERIFYPEER 设置为FALSE 禁止 cURL 验证对等证书(peer’s certificate)。要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录。

CURLOPT_CAINFO 一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义。可能需要绝对路径。

CURLOPT_CAPATH 一个保存着多个CA证书的目录。这个选项是和CURLOPT_SSL_VERIFYPEER一起使用的。

CURLOPT_SSL_VERIFYHOST 设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。 设置成 2,会检查公用名是否存在,并且是否与提供的主机名匹配。 在生产环境中,这个值应该是 2(默认值)。

相关阅读:
数字证书及CA的扫盲介绍:http://kb.cnblogs.com/page/194742/
ca证书:http://baike.baidu.com/view/565507.htm
CA数字证书:http://baike.baidu.com/view/3902964.htm
PHP手册curl_setopt:http://php.net/manual/zh/function.curl-setopt.php

转自:http://www.3mu.me/php%E7%9A%84curl%E9%80%89%E9%A1%B9curlopt_ssl_verifypeer%E8%AF%A6%E8%A7%A3/

<think>好的,用户想了解curl_easy_perform函数的返回值含义和可能的错误情况。首先,我需要回忆一下libcurl的相关知识。curl_easy_perform是libcurl中执行传输的核心函数,返回值为CURLcode类型,每个值代表不同的状态或错误。 我应该先整理常见的错误码,比如CURLE_OK表示成功,而其他如CURLE_COULDNT_CONNECT、CURLE_OPERATION_TIMEDOUT等需要解释。用户提到的引用中有关于SSL错误的例子,比如CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER的设置,这可能涉及CURLE_SSL_CONNECT_ERROR或CURLE_PEER_FAILED_VERIFICATION等错误码。 另外,引用[4]提到系统时间不正确导致证书问题,这可能对应CURLE_SSL_CACERT或类似的错误。需要将错误码和可能的原因对应起来,比如网络问题、SSL配置、超时、资源问题等。 还要注意用户可能遇到的典型错误场景,并提供解决方法。例如,返回60(CURLE_SSL_CACERT)时,检查CA证书路径或系统时间是否正确。同时,提醒用户不要在生产环境中禁用SSL验证,引用中的例子虽然解决了问题,但存在安全隐患。 需要确保覆盖主要的错误码,并分类说明,比如连接问题、SSL/TLS错误、协议错误等。最后,生成相关问题,帮助用户进一步学习,如错误处理的最佳实践或SSL验证的详细配置。</think>### curl_easy_perform函数返回值详解 #### 一、返回值基本含义 `curl_easy_perform`函数的返回值类型为`CURLcode`,用于表示HTTP请求执行状态: - **0(CURLE_OK)**:操作成功完成 - **非零值**:表示具体错误类型,可通过`curl_easy_strerror()`转换为可读错误信息 #### 二、常见错误码分类解析 1. **连接类错误**: - **7(CURLE_COULDNT_CONNECT)**:无法建立TCP连接,检查目标地址/端口或防火墙设置[^2] - **28(CURLE_OPERATION_TIMEDOUT)**:操作超时,可通过`CURLOPT_TIMEOUT`调整超时时间 - **6(CURLE_COULDNT_RESOLVE_HOST)**:DNS解析失败,检查域名有效性或DNS配置 2. **SSL/TLS错误**: - **60(CURLE_SSL_CACERT)**:SSL证书验证失败(常见CA证书问题),参考[^1][^4] - **35(CURLE_SSL_CONNECT_ERROR)**:SSL握手失败,可能协议版本不兼容 - **51(CURLE_PEER_FAILED_VERIFICATION)**:对端证书验证失败 3. **协议错误**: - **22(CURLE_HTTP_RETURNED_ERROR)**:HTTP响应码>=400,可通过`CURLOPT_FAILONERROR`控制 - **55(CURLE_SEND_ERROR)**:发送数据失败,检查网络连接或发送缓冲区 4. **资源相关错误**: - **23(CURLE_WRITE_ERROR)**:写入回调函数返回错误 - **27(CURLE_OUT_OF_MEMORY)**:内存分配失败 #### 三、错误处理建议 ```c CURLcode res = curl_easy_perform(curl); if(res != CURLE_OK) { fprintf(stderr, "请求失败: %s\n", curl_easy_strerror(res)); // 特定错误处理 if(res == CURLE_SSL_CACERT) { // 检查CA证书路径或系统时间 } } ``` #### 四、调试技巧 1. 启用详细日志: ```c curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); ``` 2. SSL验证临时禁用(仅限调试): ```c curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); // curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值