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;
}

0

3个回答

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

0

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

0

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

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于Libcurl双向认证请求Https
之前通过libcurl开发只是做http请求,这次公司项目需要请求https,所以就研究了一下,其实用libcurl做http请求是非常简单的,所有底层实现都被封装到了libcurl里面(默认编译的libcurl是没有附加SSL的,也就是说默认的libcurl是不带https功能的,因此需要自己重新编译,这里是一个libcurl支持https,可以直接用),具体关于https的实现如下:int C...
在windows平台用libcurl做双向认证
在windows平台用libcurl做双向认证。对这个问题需要调研一下:查找到两篇文章如下:libcurl使用认证证书 https认证https://blog.csdn.net/chary8088/article/details/22950843libcurl库的使用支持http、https、ftp(上传、下载、远端目录列表获取)https://blog.csdn.net/wu110112/art...
解决了一个 curl 库导致的 https 访问错误
n n n 来源:http://i.am.simonkuang.com/post/resolved-a-https-handshake-problem-against-curl/n使用 EasyWeChat 库调用微信服务的时候,在 laravel tinker 里面调试,发现每次进入 tinker 之后,第一次调用接口没有问题,第二次之后,就会报一个很诡异的错误。n...
使用HttpClient4.5实现HTTPS的双向认证
 说明:本文主要是在平时接口对接开发中遇到的为保证传输安全的情况特要求使用https进行交互的情况下,使用httpClient4.5版本对HTTPS的双向验证的  功能的实现n    首先,老生常谈,文章将按照哲学三部曲来解答什么是https,为什么要使用https,httpClient怎么实现https及双向验证。n    问题1:什么是https?n    https:安全的超文本传输协议;其...
golang与java通过自建ca证书进行https双向验证通讯
原创文章,转发请注明出处java的keytool、单向验证、https等网上有很多教程,这里不再讲述,本篇文章着重讲述:1、go如何使用openssl生产的证书(crt文件)建立https服务器与客户端进行双向验证2、go如何与java的https服务进行通讯生成证书:第一步、生成根证书:opensslgenrsa -out ca.key 2048 opensslreq -x509 -new -n...
Retrofit2 配置双向https认证
1 .运维工程师从阿里云导出的证书.rn服务器端证书rnrnrn客户端证书rnrnrn如果不清楚每种证书是干什么用的可以自己查查.https://www.chinassl.net/ssltools/convert-ssl.htmlrn2.转换证书rn服务器端证书里我们需要214410367490223.pfx,pfx类型的证书是携带私钥的,我们需要转换成cer类型把私钥删除.rn我用的是linux
java https双向认证实现
1----servernkeytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 3650 -alias www.cpsys.com -keystore cpsystem.keystore//创建库(直接给服务器用就可以了)nkeytool -certreq -alias www.cpsys.com
libcurl进行HTTP GET获取解析JSON数据
功能 n在Mac下,利用libcurl库进行HTTP GET操作,循环获取json数据并解析。n依赖库nboostnlibcurln代码n#include <curl/curl.h>n#include <curl/easy.h>n#include <curl/curlbuild.h>n#include <sstream>n#include <iostream>n#include <boost/pro
java tomcat 搭建SSL双向认证以及httpclient 代码
最近一直在尝试搭建apache+tomcat的单向认证ssl环境。网上看了很多令我眼花缭乱的资料。先开始用mod_jk的方式始终不能成功。后来还是用mod_proxy方式来实现。但这种方式貌似性能不是太好,这里如果有朋友知道确实可行的资料。可以告诉小弟一声。rn然后又开始研究apache+tomcat的双向认证环境。没找到apache+tomcat的解决方案。倒是找到只是基于tomcat的双向认证...
从http到https简介,tomcat和nginx的https配置,单向认证和双向认证简介,对称加密和非对称加密简介,RSA算法简介
HttpnHyperText Transfer Protocol,超文本传输协议,是互联网上使用最广泛的一种协议,所有WWW文件必须遵循的标准。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。n使用TCP端口为:80。n是浏览器默认的协议。n也就是:n如果在地址栏输入:rainbow.dingding.com,n浏览器会认为真正的地址是:h
c++使用curl库发送https请求
c++使用curl库发送https请求
Nginx+Tomcat配置SSL双向验证示例
本资源是一个 CentOS 下对 Nginx + Tomcat 配置 SSL 实现服务器 / 客户端双向认证配置示例。详细如何配置请参考博客《图文:CentOS 下对 Nginx + Tomcat 配置 SSL 实现服务器 / 客户端双向认证》,地址是:http://blog.csdn.net/defonds/article/details/44410359。
原生安卓访问Https单向认证和双向认证接口
1、了解原生安卓访问Https接口rnrn1.使用HttpsUrlConnection访问rn进行Https请求时,需要把需要把HttpUrlConnection换成HttpsUrlConnectionrnHttpsUrlConnection与HttpUrlConnection相比多了两个方法rnsetHostnameVerifier(HostnameVerifier v);//验证主机名称rns
两台Tomcat服务器之间进行SSL双向认证
这个东西困扰了我得有两个星期的时间。下面直接上过程吧。nn一,制作证书nn首先我们准备两个项目(没有问题可访问的)及两台Tomcat服务器(未经修改的)并测试相互访问(http请求即可)n 1,生成服务器证书库n keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore G:\ssl\server.keystore...
libcurl库简单封装,支持https
libcurl库简单封装,支持https,资源里面有https的demo以及http的lib库
libcurl库的使用支持http、https、ftp(上传、下载、远端目录列表获取)
http调用如图:nnnnFTP调用如图:nnnnFTP效果如图:nnnn头文件:nnn#pragma oncen#include &amp;lt;string&amp;gt;n#include &amp;lt;vector&amp;gt;n#include &quot;include/curl.h&quot;n#include &quot;include/easy.h&quot;n#pragma comment(lib,&quot;curl/lib/libcurl.lib&quot;)...
使用libcurl在内存中验证https证书
校验CA证书n/***************************************************************************n * _ _ ____ _n * Project ___| | | | _ \| |n * ...
Qt 与java服务器的双向认证https通信
第一次做qt和java服务端的https双向认证通信,感觉啥都一头雾水最终还是在强大的搜索引擎和好友的帮助下完成,现在做个一个简单的总结:(有可能有些概念描述不正确)rnrnrnqt 环境 centos6.5 +  qt5.5.1 rnrnrn1.java服务端给我丢过来两个证书相关的文件 client1.p12(包含证书和私钥),client1.truststore (包含信任库),首先必须要说
Android Retrofit HTTPS 单向认证 双向认证
由于最近要做一个安全性比较高的项目,因此需要用到HTTPS进行双向认证。客户端基于Retrofit + Rxjava+EventBus来实现
国密SSL协议的JSSE包-大宝CA版本 SSL身份识别与双向认证
系统要求n1. Windows系统、Linux系统、Mac系统n2. JDK7及以上n3. JDK使用无限制的安全策略文件nnnn服务端核心代码n Security.addProvider(new DoubleCA());n Security.addProvider(dcsse);n // 密钥管理器n KeyStore sm2Server...
使用Tomcat 9验证Https单向认证和双向认证
一、生成根证书颁发机构的密钥库rnrnrnrnrnkeytool -genkeypair -v -keystore root.p12 -storetype pkcs12 -storepass 123456 -alias 我是根证书 -keyalg RSA -keysize 2048 -validity 36500rnrnrnrn二、生成服务器密钥库rnrnrnrnkeytool -genkeypa
SSL Tomcat 双向认证
基本逻辑:n1、生成服务端密钥库并导出证书;n2、生成客户端密钥库并导出证书;n3、根据服务端密钥库生成客户端信任的证书;n4、将客户端证书导入服务端密钥库;n5、将服务端证书导入浏览器。nn基本思路解析:通信双方在建立连接时,服务端会下发服务端证书,如果服务端证书所颁发的CA根证书在客户端的信任颁发列表中,客户端认证服务器通过,然后客户端发送自己的证书到服务端,如果该客户端证书在服务端证书信任列...
Apache 2 mod_jk tomcat 5 双向SSL认证传递证书信息
http://sblxw.iteye.com/blog/186453rn rn主要是apache配置中加:SSLOptions +StdEnvVars +ExportCertData rn 
IOS之https请求认证及双向认证
一、背景:rn苹果从IOS9.0以后就要求使用https,今年发布说的是在2017年1月1日后,所有上架的APP必须使用HTTPS(貌似目前推迟了)。不论怎么说,使用https时迟早的事情,之前通过在info.plist文件中设置 NSAppTransportSecurity为NSAllowsArbitraryLoads的方式不起作用了。这篇文章主要就是介绍在IOS中如何将http改造成https
ios AFNetworking https 双向证书验证实现
因为公司对接口做了安全处理,部分接口实现https 加密,双向验证就是 ,服务端要验证客户端,客户端也要验证服务器端,通过证书验证首先,因为用的是AFNetworking实现的网络请求,已经自带https 服务,只需要加以下代码 //设置https 请求n self.securityPolicy=[AFSecurityPolicypolicyWithPinningMode:AFSSLPi
TLS/SSL 协议详解 (25) https双向认证及常见问题总结
预备知识nnhttps://blog.csdn.net/mrpre/article/details/77867063nnhttp://blog.csdn.net/mrpre/article/details/77866856nnhttp://blog.csdn.net/mrpre/article/details/77868263nnhttp://blog.csdn.net/mrpre/article...
官方颁发的SSL证书与自签名证书结合实现网站双向认证
这是一个非常有趣的实验。rn大家已经知道,一些SSL证书颁发机构颁发的证书,只是装在服务器端,让访问者通过SSL链接访问网站,并且可以向访问者证实网站的真实地址。但是,如果要限制网站的访问者,也就需要验证客户端所拥有的证书,这样才能建立安全链接。而机构在颁发SSL证书的时候,并没有配套的客户端证书,因此无法在客户端安装,也就无法开启对客户端的认证了。rnAD CS的证书服务可以颁发服务器端SSL证
libcurl POST访问网页后,好像没有POST成功参数
实际上已经post成功了,网页应用有防外挂反爬判断,禁止直接访问n增加下面代码就好了n curl_easy_setopt(curl, CURLOPT_REFERER, "模拟一个服务器能接受的来源页面url");
libcurl实现https方式下载和访问
准备条件:nn编译好的libcurl库,如果要支持https,需要和openssl一起编译,网上教程较多nn示例代码:nnn// libcurtest.cpp : 定义控制台应用程序的入口点。n//nn#include &quot;stdafx.h&quot;n#include &amp;lt;iostream&amp;gt;n#include &amp;lt;windows.h&amp;gt;n#include &quot;curl.h&quot;nusing na...
Keytools Https双向认证(Android通用)
Https认证: 单向认证:保证服务器是可信任的,可以安全的访问的!n 客户端拿到服务器的证书,通过CA认证信任,然后取出公钥,加密对称密钥传给服务器,服务器用自己的私钥解密得到对称密钥,后续使用该对称密钥加解密数据!n 双向认证:客户端和服务器都是可以互相信任的!n 客户端向服务器发送一个请求时,服务器会把自己的证书,以及一些信息发送过来,客户端拿到服务器的证书通过CA进行验证,如
关于Https安全性问题、双向验证防止中间人攻击问题
版权声明:本文为博主原创文章,未经博主允许不得转载;如需转载,请保持原文链接。nnHTTPS中间人攻击及防御nnHTTPS也不是绝对安全的,在HTTPS握手的过程中,如果实施不当,还是会存在漏洞,很容被中间人攻击;nn什么是中间人攻击:nn中间人攻击(Man-in-the-middle attack,缩写:MITM)是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他...
java 通过Httpclient模拟https Post 请求,实现双向认证
package com.sumy.https;import java.io.File;nimport java.io.FileInputStream;nimport java.io.IOException;nimport java.net.SocketTimeoutException;nimport java.security.KeyManagementException;nimport java.
Jmeter测试HTTPS配置
google了一下有关SSLHandshakeException,网上有说可以用-D方式添加应用参数,于是打开了jmter启动文件,修改最后一句话为:rnrnjava $JVM_ARGS $ARGS -jar `dirname $0`/ApacheJMeter.jar-Djavax.net.ssl.trustStore=/home/flyerhzm/software/jakarta-jmeter-...
apache+openssl设置https单向认证和双向认证以及反向代理
闲话少说,下面介绍企业在项目开发过程中需要使用自己申请的域名通过https(单向或双向认证)访问应用服务器的实现方式。n1、域名申请,这个应该it人都知道。自己上网申请免费的,或者付费的域名。申请域名过程中,绑定自己企业的对外ip地址。n2、部署apache和openssl前置linux服务器。稍后详细说明n3、配置https单向和双向认证服务n4、配置反向代理服务nnn下面是对部署
Android使用Https请求,双向认证、app端配置
https介绍:
C++使用curl库发送https请求中文乱码问题
//在数据头设置字符集为UTF-8,解决中文乱码问题rn struct curl_slist *head = NULL;n head = curl_slist_append(head, "Content-Type:application/x-www-form-urlencoded;charset=UTF-8");n curl_easy_setopt(curl, CURLOPT_HTT
C/C++中libcurl的使用-Http GET方法使用详解
Curl是一个命令行工具,用于以特定的URL语法进行数据传输。libcrul是一个用于完成此项工作的curl库。借助libcurl,使用C/C++可以完成文件的下载,HTTP get,post等很多工作。本文介绍使用libcurl的C API完成HTTP中的GET操作。 n下面的代码用于使用HTTP get协议,发送请求到一个网址,当请求被正确响应后,将响应的结果页面内容写成一个文件,保存在本地磁
基于libcurl下载文件
n n n Linux 上使用libcurl下载http文件。n需要安装libcurnapt-get install libcurl4-openssl-devnn#include &amp;lt;stdio.h&amp;gt;n#include &amp;lt;stdlib.h&amp;gt;n#include &amp;lt;curl/curl.h&amp;gt;nn//判断文件是否存在nint checkRem...
spring boot配置Https单向认证和双向认证
 nnSpring boot中文参考文档地址:http://oopsguy.com/documents/springboot-docs/1.5.4/index.htmlnn nnSpring boot SSL配置部分文档:nn nn这里将server.pfx、trustore.p12拷贝到了src/main/resources/路径下nn单向认证:nnserver.port: 8443nserve...
http请求忽略证书、单向认证、双向认证、连接池范例(httpclient 4.3.x以上版本)
目录:nn加载证书单向认证n忽略证书n双向认证n连接池nn加载证书单向认证nnimport org.apache.http.HttpEntity;nimport org.apache.http.client.methods.CloseableHttpResponse;nimport org.apache.http.client.methods.HttpGet;nimport org.apache....
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 视频进行大数据处理 怎么进行区块链