C++发起Https请求
Wininet库忽略Https证书
相信很多朋友使用C++ WINAPI开发的时候网络模块的时候遇到Https忽悠证书无效的情况下,
仍然希望获取结果下列代码便是忽略异常的Https CA证书,下面对原理进行简单的讲解首先,
需要设置Https忽略需要用到如下结果函数与参数InternetQueryOptionA/InternetSetOptionA
参数需要SECURITY_FLAG_IGNORE_UNKNOWN_CA,下面建议先阅读下代码可以发现忽略Https证书
是发生在HttpSendRequestA之后设置这是因为InternetConnect主要负责主要负责建立与服务器
的连接,而涉及到CA(Certificate Authority)的验证通常是在建立连接后的HTTP请求阶段进行的,
CA的验证是在SSL/TLS握手过程中完成的,而握手过程通常是在 HttpSendRequestA被调用时发生。
因此,在建立连接时,我们还没有进入HTTP请求的阶段,所以无法在 InternetConnect 之前
处理CA验证的问题,因此下列代码是进行这样忽略的首先HttpSendRequestA返回ERROR_INTERNET_INVALID_CA
出现CA证书异常这个时候需要忽略证书无效,InternetQueryOptionA获取当前的安全选项然后
追加上SECURITY_FLAG_IGNORE_UNKNOWN_CA忽略证书无效CA将设置后的值通过InternetSetOptionA
函数应用再次发起HttpSendRequestA即可忽略CA证书进行下一步操作。
#include <Windows.h>
#include <Wininet.h>
#include <stdio.h>
#pragma comment(lib, "wininet.lib")#define TRANSFER_SIZE 1024// 定义一个函数来执行HTTP请求
bool PerformHttpRequest() {// 设置用户代理字符串LPCSTR lpszAgent = "";// 初始化WinINet会话HINTERNET hInternet = InternetOpenA(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);if (!hInternet) {return false; // 如果InternetOpen失败,返回false}// 服务器详情LPCSTR lpszServerName = "192.168.99.111"; // 设置服务器IP地址INTERNET_PORT nServerPort = INTERNET_DEFAULT_HTTPS_PORT; // HTTPS端口443LPCSTR lpszUserName = NULL; // 无登录用户名LPCSTR lpszPassword = NULL; // 无登录密码DWORD dwConnectFlags = 0;DWORD dwConnectContext = 0;// 连接到服务器HINTERNET hConnect = InternetConnectA(hInternet,lpszServerName, nServerPort,lpszUserName, lpszPassword,INTERNET_SERVICE_HTTP,dwConnectFlags, dwConnectContext);if (!hConnect) {InternetCloseHandle(hInternet);return false; // 如果连接失败,返回false}// 请求详情LPCSTR lpszVerb = "GET";LPCSTR lpszObjectName = "/Login";LPCSTR lpszVersion = NULL; // 默认.LPCSTR lpszReferrer = NULL; // 没有引用页LPCSTR* lplpszAcceptTypes = NULL; // Accpet所有类型.DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |INTERNET_FLAG_KEEP_CONNECTION |INTERNET_FLAG_NO_AUTH |INTERNET_FLAG_NO_COOKIES |INTERNET_FLAG_NO_UI |// 设置启用HTTPSINTERNET_FLAG_SECURE |INTERNET_FLAG_IGNORE_CERT_CN_INVALID |INTERNET_FLAG_RELOAD;DWORD dwOpenRequestContext = 0;// 初始化请求HINTERNET hRequest = HttpOpenRequestA(hConnect, lpszVerb, lpszObjectName, lpszVersion,lpszReferrer, lplpszAcceptTypes,dwOpenRequestFlags, dwOpenRequestContext);if (!hRequest) {InternetCloseHandle(hConnect);InternetCloseHandle(hInternet);return false; // 如果初始化请求失败,返回false}// 发送请求BOOL bResult = HttpSendRequestA(hRequest, NULL, 0, NULL, 0);if (!bResult && GetLastError() == ERROR_INTERNET_INVALID_CA) {// 处理HTTPS证书无效的情况DWORD dwFlags;DWORD dwBuffLen = sizeof(dwFlags);InternetQueryOptionA(hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;InternetSetOptionA(hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));bResult = HttpSendRequestA(hRequest, NULL, 0, NULL, 0);}if (!bResult) {InternetCloseHandle(hRequest);InternetCloseHandle(hConnect);InternetCloseHandle(hInternet);return false; // 如果发送请求失败,返回false}// 获取HTTP响应头信息char szBuff[TRANSFER_SIZE];DWORD dwReadSize = TRANSFER_SIZE;bResult = HttpQueryInfoA(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, szBuff, &dwReadSize, NULL);if (!bResult) {InternetCloseHandle(hRequest);InternetCloseHandle(hConnect);InternetCloseHandle(hInternet);return false; // 如果获取响应头信息失败,返回false}szBuff[dwReadSize] = '\0';printf("%s\n", szBuff);// HTTP响应的正文DWORD dwBytesAvailable;bResult = InternetQueryDataAvailable(hRequest, &dwBytesAvailable, 0, 0);if (!bResult) {InternetCloseHandle(hRequest);InternetCloseHandle(hConnect);InternetCloseHandle(hInternet);return false; // 如果查询可用数据失败,返回false}if (dwBytesAvailable > TRANSFER_SIZE) {printf("数据太长 %d /b", GetLastError(), dwBytesAvailable);InternetCloseHandle(hRequest);InternetCloseHandle(hConnect);InternetCloseHandle(hInternet);return false; // 如果可用数据太长,返回false}DWORD dwBytesRead;bResult = InternetReadFile(hRequest, szBuff, dwBytesAvailable, &dwBytesRead);if (!bResult) {InternetCloseHandle(hRequest);InternetCloseHandle(hConnect);InternetCloseHandle(hInternet);return false; // 如果读取数据失败,返回false}szBuff[dwBytesRead] = '\0';printf("%s\n", szBuff);InternetCloseHandle(hRequest);InternetCloseHandle(hConnect);InternetCloseHandle(hInternet);return true; // 成功执行HTTP请求,返回true
}int main() {if (PerformHttpRequest()) {return 0;}else {return 1;}
}相关文章:
C++发起Https请求
Wininet库忽略Https证书 相信很多朋友使用C WINAPI开发的时候网络模块的时候遇到Https忽悠证书无效的情况下, 仍然希望获取结果下列代码便是忽略异常的Https CA证书,下面对原理进行简单的讲解首先, 需要设置Https忽略需要用到如下结果函数与参数Interne…...
哪款笔记软件支持电脑和手机互通数据?
上班族在日常工作中,随手记录工作笔记已成为司空见惯的场景。例如:从快节奏的会议记录到灵感迸发的创意;跟踪项目进展,记录每个阶段的成果、问题和下一步计划;记录、更新工作任务清单等,工作笔记承载了职场…...
部署PXE高效批量网络装机
部署PXE高效批量网络装机 因在Cisco3850核心交换机中已开启DHCP 服务,因此不需要在配置DHCP服务。如果您的网络环境中也已有DHCP服务,也不用再配置DHCP服务了,直接部署PXE相关服务即可。 找一台linux系统的服务器,这本次试验用的是…...
【JavaEE】UDP协议与TCP协议
作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…...
Leetcode—1828. 统计一个圆中点的数目【中等】
2024每日刷题(一零五) Leetcode—1828. 统计一个圆中点的数目 实现代码 class Solution { public:vector<int> countPoints(vector<vector<int>>& points, vector<vector<int>>& queries) {vector<int> a…...
新概念英语第二册(47)
New words and expressions】生词和短语(9) thirsty adj. 贪杯的 ghost n. 鬼魂 haunt v. (鬼)来访,闹鬼 block …...
抽象类(Java)、模板方法设计模式
一、概念 在Java中有abstract关键字,就是抽象的意思,可用来修饰类和成员方法。 用abstract来修饰类,那这个类就是抽象类;修饰方法,那这个方法就是抽象方法。 修饰符 abstract class 类名{修饰符 abstract 返回值类型…...
【Delphi】IDE 工具栏错乱恢复
由于经常会在4K和2K显示器上切换Delphi开发环境(IDE),导致IDE工具栏错乱,咋样设置都无法恢复,后来看到红鱼儿的博客,说是通过操作注册表的方法,能解决,试了一下,果真好用,非常感谢分…...
自动化报告的前奏|使用python-pptx操作PPT(一)
自动化报告先从python-pptx开始 文章目录 1 python-pptx的基础属性1.1 新建幻灯片1.1.1 幻灯片布局的样式1.1.2 修改pptx模版大小1.1.3 指定模版生成1.1.4 创建幻灯片背景1.1.5 创建幻灯片备注信息1.1.6 设置幻灯片标题1.2 一些ppt元素/组件1.2.1 特殊符号1.2.2 placeholders1.…...
2024美赛数学建模D题思路+代码
文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间:北京时间2024年2月2日(周五ÿ…...
JDBC 结构优化2
JDBC 结构优化2 文章目录 JDBC 结构优化2结构优化2 - ATM系统(存,取,转,查)1 Service2 事务3 ThreadLocal4 事务的封装 结构优化2 - ATM系统(存,取,转,查) 1 Service 什么是业务? 代表用户完成的一个业务功能,可以由一个或多个DAO的调用组成。软件所提供的一个功…...
大模型相关术语
AGI(Artificial General Intelligence) 指通用人工智能,专注于研制像人一样思考、像人一样从事多种用途的机器。它与一般的特定领域智能(如机器视觉、语音识别等)相区分。 AIGC(AI-Generated Content&…...
数据库之九 流程控制、存储过程和函数
【零】数据准备 【1】创建用户信息表 (1)创建表 id:编号name:用户名sex:性别,默认男balance:余额register_time:注册时间 drop table if exists user; create table user( id in…...
DolphinDB学习(2):增删改查数据表(分布式表的基本操作)
文章目录 创建数据表1. 创建数据表全流程2. 核心:创建table3. 在已有的数据表中追加新的数据 数据表自身的操作1. 查询有哪些数据表2. 删除某张数据表3. 修改数据表的名称 博客里只介绍最常见的分区表(createPartitionedTable)的创建方法&…...
100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)
文章目录 专栏导读案例说明一、smtplib模块是什么?1.1 模块介绍1.2 SMTP参数说明1.3 SMTP常用方法 二、email模块是什么?1.1 模块介绍1.2 常用类说明 三、案例实战3.1 获取授权码3.2 代码步骤3.3 发送文本格式邮件3.4 发送图片格式邮件3.5 发送指定文件夹…...
redisTemplate.opsForValue()
redisTemplate 在Spring Data Redis中,redisTemplate 是一个非常重要的组件,它为开发者提供了各种操作 Redis 的方法。对于 opsForValue() 方法,它是用来获取一个操作字符串值的操作对象。这意味着你可以使用它来执行各种字符串相关的操作…...
多线程事务如何回滚?
背景介绍 1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败&am…...
医院如何筛选安全合规的内外网文件交换系统?
医院内外网文件交换系统是专为医疗机构设计的,用于在内部网络(内网)和外部网络(外网)之间安全、高效地传输敏感医疗数据和文件的解决方案。这种系统对于保护患者隐私、遵守医疗数据保护法规以及确保医疗服务的连续性和…...
C51 单片机学习(一):基础外设
参考 51单片机入门教程 1. 单片机简介 1.1 定义 单片机(Micro Controller Unit,简称 MCU) 内部集成了 CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(依靠传感器)、处…...
Docker容器引擎镜像创建
目录 一、镜像的创建 (一)基于现有镜像创建 1.启动一个镜像,在容器里做修改 2.将修改后的容器提交为新的镜像 (二)基于本地模板创建 (三)基于Dockerfile 创建 1.联合文件系统(…...
别再只建网站了!宝塔面板的‘Node项目’功能,让你的Express/Koa后端服务上线更简单
解锁宝塔面板的隐藏技能:Node.js后端服务一键部署实战指南 你是否还在为Node.js项目的繁琐部署流程而头疼?手动配置PM2、Nginx反向代理、环境变量设置...这些操作不仅耗时耗力,还容易出错。其实,你每天都在使用的宝塔面板早已内置…...
三菱现代自动擦窗机器人PLC软件:后发产品介绍及技术细节
三菱 现代自动擦窗机器人PLC软件 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面 界面多种组态可供选择上周刚帮一个三菱现代贴牌擦窗机的小客户把新软件迭代完,顺便攒了一套带人话解释的梯形图、不…...
RMBG-2.0镜像免配置部署:无需配置Python环境,开箱即用Web交互界面
RMBG-2.0镜像免配置部署:无需配置Python环境,开箱即用Web交互界面 你是不是也遇到过这样的烦恼?想用AI模型给图片换个背景,结果光是安装Python环境、配置依赖库就折腾了大半天,最后还可能因为版本冲突、CUDA不兼容等问…...
Companion Object - 伴生对象 类比java中的什么?
这是一个非常经典且准确的对比问题。简单来说,Kotlin 中的 companion object(伴生对象)核心类比的是 Java 中的 static(静态)成员。在 Java 中,如果你想让一个成员(方法或变量)属于类…...
KT0803K FM发射芯片Arduino驱动开发与射频工程实践
1. KT0803系列FM发射芯片Arduino库深度解析与工程实践指南1.1 芯片定位与系统级约束KT0803及其衍生型号(KT0803K/L/M)是高度集成的单芯片FM广播发射器,专为低功耗、小体积音频广播应用设计。该系列芯片内部集成了PLL频率合成器、立体声编码器…...
腾讯云轻量服务器+宝塔面板:新手零代码搭建个人网站的保姆级避坑指南
腾讯云轻量服务器宝塔面板:新手零代码搭建个人网站的保姆级避坑指南 你是否曾经想过拥有一个属于自己的网站,却因为不懂代码和服务器运维而望而却步?现在,即使你没有任何技术背景,也能轻松实现这个梦想。本文将带你一步…...
TEMOS
TEMOS(Text-conditioned Motion Synthesis)是2022年提出的一个文本驱动动作生成模型,核心设计是:文本编码器 动作编码器 动作解码器输入文本描述 → 生成对应的3D动作序列训练时用 KL 散度损失让文本和动作的隐空间分布对齐&…...
StreamlabsArduinoAlerts:嵌入式设备接入Twitch直播事件
1. StreamlabsArduinoAlerts 库深度解析:嵌入式设备接入 Twitch 直播事件的完整实现方案 StreamlabsArduinoAlerts 是一个专为资源受限嵌入式平台设计的轻量级 C 库,其核心目标是让 Arduino、ESP8266、ESP32、Particle 及基于 ATmega/STM32 的 MCU 能够直…...
ESP32 ILI9341高性能驱动:64字节DMA突发传输优化
1. 项目概述ILI9341_ESP32 是一款专为 ESP32 平台深度优化的 ILI9341 TFT LCD 显示驱动库。其核心设计目标并非简单实现显示功能,而是在硬件能力边界内榨取极致帧率与响应性能。该库直面 ESP32 的 SPI 总线特性——支持 64 字节一次性突发传输(burst tra…...
Windows驱动存储深度管理:从问题诊断到系统优化的完整解决方案
Windows驱动存储深度管理:从问题诊断到系统优化的完整解决方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 问题发现:驱动管理中的隐形痛点与风险 系…...
