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

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忽悠证书无效的情况下&#xff0c; 仍然希望获取结果下列代码便是忽略异常的Https CA证书&#xff0c;下面对原理进行简单的讲解首先, 需要设置Https忽略需要用到如下结果函数与参数Interne…...

哪款笔记软件支持电脑和手机互通数据?

上班族在日常工作中&#xff0c;随手记录工作笔记已成为司空见惯的场景。例如&#xff1a;从快节奏的会议记录到灵感迸发的创意&#xff1b;跟踪项目进展&#xff0c;记录每个阶段的成果、问题和下一步计划&#xff1b;记录、更新工作任务清单等&#xff0c;工作笔记承载了职场…...

部署PXE高效批量网络装机

部署PXE高效批量网络装机 因在Cisco3850核心交换机中已开启DHCP 服务&#xff0c;因此不需要在配置DHCP服务。如果您的网络环境中也已有DHCP服务&#xff0c;也不用再配置DHCP服务了&#xff0c;直接部署PXE相关服务即可。 找一台linux系统的服务器&#xff0c;这本次试验用的是…...

【JavaEE】UDP协议与TCP协议

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…...

Leetcode—1828. 统计一个圆中点的数目【中等】

2024每日刷题&#xff08;一零五&#xff09; Leetcode—1828. 统计一个圆中点的数目 实现代码 class Solution { public:vector<int> countPoints(vector<vector<int>>& points, vector<vector<int>>& queries) {vector<int> a…...

新概念英语第二册(47)

New words and expressions】生词和短语&#xff08;9&#xff09; thirsty adj. 贪杯的 ghost n. 鬼魂 haunt v. &#xff08;鬼&#xff09;来访&#xff0c;闹鬼 block …...

抽象类(Java)、模板方法设计模式

一、概念 在Java中有abstract关键字&#xff0c;就是抽象的意思&#xff0c;可用来修饰类和成员方法。 用abstract来修饰类&#xff0c;那这个类就是抽象类&#xff1b;修饰方法&#xff0c;那这个方法就是抽象方法。 修饰符 abstract class 类名{修饰符 abstract 返回值类型…...

【Delphi】IDE 工具栏错乱恢复

由于经常会在4K和2K显示器上切换Delphi开发环境(IDE)&#xff0c;导致IDE工具栏错乱&#xff0c;咋样设置都无法恢复&#xff0c;后来看到红鱼儿的博客&#xff0c;说是通过操作注册表的方法&#xff0c;能解决&#xff0c;试了一下&#xff0c;果真好用&#xff0c;非常感谢分…...

自动化报告的前奏|使用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 美赛比赛日期和时间 比赛开始时间&#xff1a;北京时间2024年2月2日&#xff08;周五&#xff…...

JDBC 结构优化2

JDBC 结构优化2 文章目录 JDBC 结构优化2结构优化2 - ATM系统(存,取,转,查)1 Service2 事务3 ThreadLocal4 事务的封装 结构优化2 - ATM系统(存,取,转,查) 1 Service 什么是业务? 代表用户完成的一个业务功能&#xff0c;可以由一个或多个DAO的调用组成。软件所提供的一个功…...

大模型相关术语

AGI&#xff08;Artificial General Intelligence&#xff09; 指通用人工智能&#xff0c;专注于研制像人一样思考、像人一样从事多种用途的机器。它与一般的特定领域智能&#xff08;如机器视觉、语音识别等&#xff09;相区分。 AIGC&#xff08;AI-Generated Content&…...

数据库之九 流程控制、存储过程和函数

【零】数据准备 【1】创建用户信息表 &#xff08;1&#xff09;创建表 id&#xff1a;编号name&#xff1a;用户名sex&#xff1a;性别&#xff0c;默认男balance&#xff1a;余额register_time&#xff1a;注册时间 drop table if exists user; create table user( id in…...

DolphinDB学习(2):增删改查数据表(分布式表的基本操作)

文章目录 创建数据表1. 创建数据表全流程2. 核心&#xff1a;创建table3. 在已有的数据表中追加新的数据 数据表自身的操作1. 查询有哪些数据表2. 删除某张数据表3. 修改数据表的名称 博客里只介绍最常见的分区表&#xff08;createPartitionedTable&#xff09;的创建方法&…...

100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)

文章目录 专栏导读案例说明一、smtplib模块是什么&#xff1f;1.1 模块介绍1.2 SMTP参数说明1.3 SMTP常用方法 二、email模块是什么&#xff1f;1.1 模块介绍1.2 常用类说明 三、案例实战3.1 获取授权码3.2 代码步骤3.3 发送文本格式邮件3.4 发送图片格式邮件3.5 发送指定文件夹…...

redisTemplate.opsForValue()

redisTemplate ​在Spring Data Redis中&#xff0c;redisTemplate 是一个非常重要的组件&#xff0c;它为开发者提供了各种操作 Redis 的方法。对于 opsForValue() 方法&#xff0c;它是用来获取一个操作字符串值的操作对象。这意味着你可以使用它来执行各种字符串相关的操作…...

多线程事务如何回滚?

背景介绍 1&#xff0c;最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一些其他修改操作&#xff0c;然后在执行插入操作&#xff0c;由于插入数据可能会很多&#xff0c;用到多线程去拆分数据并行处理来提高响应时间&#xff0c;如果有一个线程执行失败&am…...

医院如何筛选安全合规的内外网文件交换系统?

医院内外网文件交换系统是专为医疗机构设计的&#xff0c;用于在内部网络&#xff08;内网&#xff09;和外部网络&#xff08;外网&#xff09;之间安全、高效地传输敏感医疗数据和文件的解决方案。这种系统对于保护患者隐私、遵守医疗数据保护法规以及确保医疗服务的连续性和…...

C51 单片机学习(一):基础外设

参考 51单片机入门教程 1. 单片机简介 1.1 定义 单片机&#xff08;Micro Controller Unit&#xff0c;简称 MCU&#xff09; 内部集成了 CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集&#xff08;依靠传感器&#xff09;、处…...

Docker容器引擎镜像创建

目录 一、镜像的创建 &#xff08;一&#xff09;基于现有镜像创建 1.启动一个镜像&#xff0c;在容器里做修改 2.将修改后的容器提交为新的镜像 &#xff08;二&#xff09;基于本地模板创建 &#xff08;三&#xff09;基于Dockerfile 创建 1.联合文件系统&#xff08…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...