libcurl库 curl_setopt函数 CURLOPT_SSL_VERIFYHOST参数分析

最近使用C++ libcurl库,能够构建一个HTTP请求以及其他协议请求。对curl_setopt函数进行一些知识总结以免忘记。

CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);

三个点号代表后面还有未知个参数,这个和printf函数是一样的,可以去网上查查看这个。

  1. 第一个参数:使用curl_init函数创建出来的对象。
  2. 第二个参数:属性。有很多种。
  3. 第三个参数:如果有,可能是属性的值,比如一些true或false,或者数字。

现在主要讲 CURLOPT_SSL_VERIFYHOST 选项,在libcurl早期版本中,这个参数的值,也就是第三个参数是bool型,后来又出现检查CN字段(SSL/TLS)中出现的。 在之后版本中,这个值就已经不够用了,而开发者也经常因为之前使用这个函数设置为True或False(之前死两个值)而出错(现在是三个值)。

0	:不检查证书
1	:检查证书不检查域名
2	:既检查证书又检查域名

曾经做过HTTPS请求分析,对这个三个状态还是比较熟悉,我来解释一下。

首先不检查证书,一些网站虽然在HTTP协议上加入了SSL和TLS加密,对服务器和客户端做中间人攻击,发现服务器端根本不会检查证书,也就是它空有一个加密协议,而没有校验你的证书;

下一步就是检查证书,而没有检查域名,也就是说你可以随意用一个假的证书,就能骗过服务器,与你中间程序交互,这种也不太可靠,随便用一些工具生成证书就能蒙混过关;

最后一种是既检查证书,又能要检测域名,第二种是空有一个证书的,是没有host域名的,而且这个域名是服务器相对应的,即使是一个合格证书,有一个域名,和服务器对不上,还是没有作用,欺骗不了服务器。

所以在做中间人攻击的时候,空有一个证书是吓唬不了人的,大家应该有信心,帮助互联网公司完成标准化,哈哈哈…

回到这个主题,新版本已经废除了为1的选项,现在只存在0或2的选值。(默认是2)

int cloud_https_post(const char *pUrl, const char *request, char **response, st_http_resinfo *pHttpResInfo) { CURLcode res; CURL* curl = NULL; struct curl_slist *headers = NULL; #ifdef CLOUD_HTTPS_DEBUG char errbuf[CURL_ERROR_SIZE]; memset(errbuf, '\0', CURL_ERROR_SIZE); #endif if (NULL == pUrl || NULL == request || NULL == response || NULL == pHttpResInfo) { return CURLE_FAILED_INIT; } res = curl_global_init(CURL_GLOBAL_ALL); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl global init fail and ret %d", res); return res; } curl = curl_easy_init(); if (NULL == curl) { res = CURLE_FAILED_INIT; HTTPS_LOG(LOG_LEVEL_ERROR, "curl init fail"); goto exit; } headers = curl_slist_append(headers, "Content-Type: application/json;charset=UTF-8"); if (NULL == headers) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl get header list fail"); goto exit; } #ifdef CLOUD_HTTPS_DEBUG //provide a buffer to store errors in res = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_ERRORBUFFER ret %d", res); goto exit; } #endif if (IS_SESSION_DEBUG_ON()) { HTTPS_LOG(LOG_LEVEL_DEBUG, "post sesstion debug on"); res = curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_VERBOSE ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_DEBUGFUNCTION ret %d", res); goto exit; } } res = curl_easy_setopt(curl, CURLOPT_URL, pUrl); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_URL ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_HTTPHEADER ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_POST, 1); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_POST ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_POSTFIELDS ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_READFUNCTION ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData_Post); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_WRITEFUNCTION ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)response); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_WRITEDATA ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_NOSIGNAL ret %d", res); goto exit; } if (IS_CA_PATH_NULL()) { res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_SSL_VERIFYPEER ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_SSL_VERIFYHOST ret %d", res); goto exit; } } else { res = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_SSL_VERIFYPEER ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_CAINFO, GET_CA_PATH()); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_CAINFO ret %d", res); goto exit; } if (GET_CA_TYPE()) { res = curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,GET_CA_TYPE()); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_SSLCERTTYPE ret %d", res); goto exit; } } else { //curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM"); } } res = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, GET_P_CONNECT_TIMEOUT()); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_CONNECTTIMEOUT ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_TIMEOUT, GET_P_TRANSFER_TIMEOUT()); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_TIMEOUT ret %d", res); goto exit; } res = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION,1); if (CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_ERROR, "curl set option CURLOPT_FOLLOWLOCATION ret %d", res); goto exit; } res = curl_easy_perform(curl); #ifdef CLOUD_HTTPS_DEBUG if(CURLE_OK != res) { HTTPS_LOG(LOG_LEVEL_DEBUG, "curl post return error: %s", errbuf); } #endif curl_easy_getinfo(curl, CURLINFO_HTTP_CODE, &(pHttpResInfo->status_code)); HTTPS_LOG(LOG_LEVEL_DEBUG, "cloud_https_post done. ret %d, http status code %ld", res, pHttpResInfo->status_code); exit: if (headers) { curl_slist_free_all(headers); } if (curl) { curl_easy_cleanup(curl); } curl_global_cleanup(); return res; }解析函数
最新发布
10-29
int https_post(char *ip,char *auth_key_value,char *data,int port) { //https:// ${IP}:10010/probe/status CURL *curl=NULL; CURLcode res; struct curl_slist *headers=NULL; char url[100]="https://"; char port_str[7]={0}; //获取ip //char ip[16]={0}; strcat(url,ip); snprintf(port_str,7, ":%d",port); strncat(url,port_str,6); strncat(url,"/probe/status",13); //设置解析类型 headers=curl_slist_append(headers,"Content-Type:application/json"); char auth[100]="authentication_key:"; //获取密钥 长度最大32 //char auth_key_value[33]={0}; strcat(auth,auth_key_value); // 设置密钥 headers=curl_slist_append(headers,auth); //char data[]={0}; curl_global_init(CURL_GLOBAL_ALL); curl=curl_easy_init(); if(!curl){ return 0; } curl_easy_setopt(curl,CURLOPT_POST,1); curl_easy_setopt(curl,CURLOPT_URL,url); curl_easy_setopt(curl,CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl,CURLOPT_POSTFIELDS,data); curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,0L); curl_easy_setopt(curl,CURLOPT_SSL_VERIFYHOST,0L); //超时时间为10秒 curl_easy_setopt(curl,CURLOPT_TIMEOUT, 10L); res=curl_easy_perform(curl); if(res != CURLE_OK) { switch (res) { case CURLE_COULDNT_CONNECT: fprintf(stderr,"res=%d can not connect remote host or proxy : %s \n",res,curl_easy_strerror(res)); break; case CURLE_HTTP_RETURNED_ERROR: fprintf(stderr,"res=%d http return error information : %s \n",res,curl_easy_strerror(res)); break; case CURLE_UNSUPPORTED_PROTOCOL: fprintf(stderr,"res=%d not support the protocol : %s \n",res,curl_easy_strerror(res)); break; default : fprintf(stderr,"res=%d curl_easy_perform() failed : %s \n",res,curl_easy_strerror(res)); } curl_slist_free_all(headers); curl_easy_cleanup(curl); curl_global_cleanup(); return 0; } curl_easy_perform卡死 curl_slist_free_all(headers); curl_easy_cleanup(curl); curl_global_cleanup(); return 1; } 执行到curl_easy_perform卡死
07-10
<?php // 启用所有错误报告,方便调试 ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // 接口 URL,from_id 可以根据需要修改 $url = "https://cloud.rongtonggold.com/api/future/goldlist?from_id="; // POST 数据 $postData = json_encode([ "page" => 1, "limit" => 6 ]); // 请求头(完整模拟小程序环境) $headers = [ "Accept-Language: zh-CN,zh;q=0.9", "Connection: keep-alive", "Content-Length: " . strlen($postData), "Content-Type: application/json", "Host: cloud.rongtonggold.com", "Referer: https://servicewechat.com/wxdaf66ea4f7982888/7/page-frame.html", "Sec-Fetch-Dest: empty", "Sec-Fetch-Mode: cors", "Sec-Fetch-Site: cross-site", "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090c37)XWEB/14185", "xweb_xhr: 1" ]; $ch = curl_init(); // 设置 cURL 选项 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回响应内容而不是直接输出 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); // 连接超时 30 秒 curl_setopt($ch, CURLOPT_TIMEOUT, 60); // 总执行超时 60 秒 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁用 SSL 验证 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 执行请求 $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 错误检查 if (curl_errno($ch)) { echo "cURL 错误: " . curl_error($ch) . "\n"; } else { echo "HTTP 状态码: " . $httpCode . "\n"; echo "响应内容:\n" . $response; } curl_close($ch);不能正常访问
09-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值