关于Libcurl双向认证请求Https

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/github_37567324/article/details/79851454

之前通过libcurl开发只是做http请求,这次公司项目需要请求https,所以就研究了一下,其实用libcurl做http请求是非常简单的,所有底层实现都被封装到了libcurl里面(默认编译的libcurl是没有附加SSL的,也就是说默认的libcurl是不带https功能的,因此需要自己重新编译,这里是一个libcurl支持https,可以直接用),具体关于https的实现如下:

int CHttpClient::sendRequest(std::string strRequestType, 
 std::string strUrl, 
 std::string &strReport, 
 std::string &strRetHeader,
 std::vector<std::string> vecHeader, 
 std::string strParam/* ="" */, 
 std::string strCookie/* ="" */, 
 std::string strCaPath/* ="" */, 
 int nTimeOut/* =0 */)
{
CURL * curl;
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());

if ( strRequestType.compare("post")==0 || strRequestType.compare("POST") == 0 )
{
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(strParam.c_str()));//post内容长度
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strParam.c_str());
}
else
{
curl_easy_setopt(curl, CURLOPT_POST, 0);//get请求
}

//设置http头
curl_slist * headers = NULL;
for ( int i=0; i<vecHeader.size(); i++ )
{
if (!vecHeader.at(i).empty())
{
headers = curl_slist_append(headers, vecHeader.at(i).c_str());
}
}
if (headers != NULL)
{
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
}

curl_easy_setopt(curl,CURLOPT_SSLVERSION,1);

//判断是否有证书
if(strCaPath.empty())
{
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
}
else
{
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, true);
curl_easy_setopt(curl,CURLOPT_CAINFO,"C:/ssl/cacert.pem");


curl_easy_setopt(curl,CURLOPT_SSLCERT,"C:/ssl/client.pem");  
curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"11111111");  
curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");  
curl_easy_setopt(curl,CURLOPT_SSLKEY,"C:/ssl/clientkey.pem");  
curl_easy_setopt(curl,CURLOPT_SSLKEYPASSWD,"11111111");  
curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM");
}

//Web服务器一般会重定向链接,比如访问http:/xxx/x1.do自动转到http:/xxx/x2.do  
//所以一定要设置CURLOPT_FOLLOWLOCATION为1,否则重定向后的数据不会返回。  
//curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION,1); 

curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); //可以看到调试信息
curl_easy_setopt(curl,CURLOPT_HEADERFUNCTION,_CURL_::write_data);
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, &strRetHeader);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _CURL_::write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &strReport); 
if ( nTimeOut > 0  )
{
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, nTimeOut);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, nTimeOut);
}


if (!strCookie.empty())
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, strCookie.c_str());
}

CURLcode code = curl_easy_perform(curl);

if(code != CURLE_OK)

        {  

printf("curl_wasy_perform error = %s",curl_easy_strerror(code));  
}  
if ( headers != NULL )
{
curl_slist_free_all(headers);
}
curl_easy_cleanup(curl);
return code;
}


展开阅读全文

没有更多推荐了,返回首页