当前位置: 首页 > news >正文

libcurl使用默认编译的winssl进行https的双向认证

双向认证:

1.服务器回验证客户端上报的证书

2.客户端回验证服务器的证书

而证书一般分为:1.受信任的根证书,2不受信任的根证书。

但是由于各种限制不想在libcurl中增加openssl,那么使用默认的winssl也可以完成以上两种证书的双向认证,以下是亲测代码:

static int http_write(char* data, size_t size, size_t nmemb, std::string* writerData)
{unsigned long sizes = size * nmemb;if (writerData == NULL)return-1;writerData->append(data, sizes);return sizes;
}int main_curl(void)
{CURL* curl;CURLcode res = CURLE_OK;const char* pPassphrase = NULL;    //password for private keystatic const char* pCACertFile = "C:\\ca.crt"; //CA root certificatstatic const char* pCertFile = "C:\\client.p12"; //client certificatestatic const char* pKeyName = "C:\\client.key";        // private.keystatic const char* pHeaderFile = "dumpit";const char* pKeyType;const char* pEngine;pKeyType = "PEM";pEngine = NULL;std::string sRes;char* url = "https://xxx.com";curl = curl_easy_init();if (curl) {curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);/* what call to write: */curl_easy_setopt(curl, CURLOPT_URL, url);do { /* dummy loop, just to break out from */if (pEngine) {/* use crypto engine */if (curl_easy_setopt(curl, CURLOPT_SSLENGINE, pEngine) != CURLE_OK) {/* load the crypto engine */fprintf(stderr, "can't set crypto engine\n");break;}if (curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1L) != CURLE_OK) {/* set the crypto engine as default *//* only needed for the first time you load*              a engine in a curl object... */fprintf(stderr, "can't set crypto engine as default\n");break;}}//winssl 必须是P12证书类型,不能设置其参数,openssl下可以设置//curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");/* 客户端证书 */curl_easy_setopt(curl, CURLOPT_SSLCERT, pCertFile);/* 设置客户端证书的key和类型*/curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, "PEM");curl_easy_setopt(curl, CURLOPT_SSLKEY, pKeyName);            /* 验证服务器需要的根证书 */curl_easy_setopt(curl, CURLOPT_CAINFO, pCACertFile);       /* 自签名证书不要验证对端 */curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_write);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &sRes);/* Perform the request, res will get the return code */res = curl_easy_perform(curl);/* Check for errors */if (res != CURLE_OK)fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));} while (0);/* always cleanup */curl_easy_cleanup(curl);}std::cout<<"RESPONSE HTML:" << sRes;return (res == CURLE_OK);
}

以上的代码如果根证书是受信任的,设置

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);

自签证书设置:

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);

即可完成winssl的双向认证;

http://www.lryc.cn/news/281006.html

相关文章:

  • MySQL运维实战(3.3) 管理数据库(database)
  • Web3去中心化存储:重新定义云服务
  • 纸尿裤行业调研:预计到2024年提高至68.1%
  • 目标检测数据集 - 行人检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • 重磅!巨匠纺品鉴正式签约“体坛冠军程晨”为品牌形象代言人
  • 亚信安慧AntDB超融合框架——数智化时代数据库管理的新里程碑
  • 设计模式之命令模式【行为型模式】
  • 肯尼斯·里科《C和指针》第6章 指针(4)实例
  • diffusers flask streamlit 简洁可视化文生图页面
  • ubuntu 使用VNC链接树莓派
  • 水利部:加大北斗、无人机等安全监测新技术的应用推广
  • 如何定位和优化程序CPU、内存等性能之巅
  • 一体机旅游景区污水处理设备工艺说明
  • java返回文件时为图片或pdf等设置在线预览或下载
  • 微信公众号对接--客服消息
  • 花几分钟整点jmeter花活,轻松超越90%软件测试
  • 类脑研究之脑组成及神经系统相关理论!大脑是什么?大脑和脑有什么区别?大脑皮层和脑膜什么关系?人的神经系统有哪些?
  • 【Vue按键修饰符详细介绍】
  • url 地址中的敏感信息脱敏处理
  • 慢速 HTTP 攻击 Slow HTTP Attack
  • 2024年“计算机视觉处理设计开发工程师”最后几天报考中!
  • 基于ssm的教务信息平台的设计与实现+jsp论文
  • 哪种护眼灯对眼睛好?五款高品质考研台灯推荐
  • 安防视频云平台/可视化监控云平台ARM版EasyCVR无法下载录像文件,如何解决?
  • 如何用Docker部署Nacos服务并结合内网穿透实现公网访问管理界面?
  • Logback框架基本认识
  • 移动安全-certutil
  • 【HarmonyOS4.0】第九篇-ArkUI布局容器组件(一)
  • 在macos上查看当前进程的栈信息
  • 医院患者满意度调查指标设计