github_37567324
RuningPigNO1
2018-04-08 01:54
采纳率: 41.7%
浏览 4.0k
已采纳

libcurl 进行HTTPS进行双向认证返回CURLE_SSL_CONNECT_ERROR失败

最近公司项目需要SSL双向认证,我就用libcurl来实现,但是在做Demo的时候请求是没问题的,可是吧代码放到主程序(windows下 Unicode字符集)里面,返回的总是 CURLE_SSL_CONNECT_ERROR不知道是哪里出问题了,下面是源码
int CUrlHttp::Request(std::string strRequestType,
std::string strUrl,
std::string &strReport,
std::string &strRetHeader,
std::vectorstd::string vecHeader,
std::string strParam/* ="" /,
std::string strCookie/
="" /,
std::string strCaPath/
="" /,
int nTimeOut/
=0 */)
{
strUrl = "https://192.168.5.176:4433/ipass00/http/localhost/welcome";
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);
//打印出来

// std::string strReportData;
// strReportData.append(strReportHeader);
// strReportData.append(strReport);
// TRACE("request:%s url:%s report:%s", strRequestType.c_str(), strUrl.c_str(), strReportData.c_str());
return code;
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • github_37567324
    RuningPigNO1 2018-04-10 01:37
    已采纳

    无奈自己结帖,其实原因很简单,项目中之前用到过libcurl,之前的版本和现在的版本冲突了才导致请求不成功

    点赞 评论
  • github_37567324
    RuningPigNO1 2018-04-08 01:58

    虚心求教,还望大神不吝赐教

    点赞 评论
  • oyljerry
    oyljerry 2018-04-08 12:14

    看看是不是什么字符是Unicode定位。而你定位程序应该都是处理的单字节字符串

    点赞 评论

相关推荐