WINHTTP忽略HTTPS证书

2024-02-02 14:04
文章标签 https 证书 忽略 winhttp

本文主要是介绍WINHTTP忽略HTTPS证书,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

        • WINHTTP忽略HTTPS证书
        • WINHTTP使用TLS协议版本

WINHTTP忽略HTTPS证书
发布了Wininet库忽略Https证书文章之后有朋友问我如果使用WINHTTP发起忽略证书的方法,
下列粘出代码可以看到跟Wininet是一样的不在过多赘述,不懂的朋友可以看我发的链接说明。

C++发起Https请求

#include <Windows.h>
#include <Winhttp.h>
#include <stdio.h>#pragma comment(lib, "winhttp.lib")#define TRANSFER_SIZE 1024bool PerformHttpRequest() {HINTERNET hSession = WinHttpOpen(L"", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);if (!hSession) {return false;}//lpszServerName 是IP或者域名LPCWSTR lpszServerName = L"192.168.99.99";//nServerPort 端口INTERNET_PORT nServerPort = 443;HINTERNET hConnect = WinHttpConnect(hSession, lpszServerName, nServerPort, 0);if (!hConnect) {WinHttpCloseHandle(hSession);return false;}HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/Login", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);if (!hRequest) {WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}BOOL bResult = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);if (!bResult && GetLastError() == ERROR_WINHTTP_SECURE_FAILURE) {//忽略所有异常Https CA证书问题// SECURITY_FLAG_IGNORE_ALL_CERT_ERRORS 也可以DWORD dwFlags =SECURITY_FLAG_IGNORE_UNKNOWN_CA |SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE |SECURITY_FLAG_IGNORE_CERT_CN_INVALID |SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;WinHttpSetOption(hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));bResult = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);}if (!bResult) {WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}bResult = WinHttpReceiveResponse(hRequest, NULL);if (!bResult) {WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}wchar_t szBuff[TRANSFER_SIZE];DWORD dwReadSize;bResult = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, szBuff, &dwReadSize, WINHTTP_NO_HEADER_INDEX);if (!bResult) {WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}wprintf(L"%ws\n", szBuff);DWORD dwBytesAvailable;bResult = WinHttpQueryDataAvailable(hRequest, &dwBytesAvailable);if (!bResult) {WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}if (dwBytesAvailable > TRANSFER_SIZE) {wprintf(L"Data too long %d /b\n", GetLastError(), dwBytesAvailable);WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}DWORD dwBytesRead;ZeroMemory(szBuff, TRANSFER_SIZE);bResult = WinHttpReadData(hRequest, szBuff, dwBytesAvailable, &dwBytesRead);if (!bResult) {WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}printf("%s\n", szBuff);WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return true;
}int main() {if (PerformHttpRequest()) {return 0;}else {return 1;}
}
WINHTTP使用TLS协议版本
详细很多朋友使用WINHTTP是为了在低版本系统运行比如WIN7或2008这些系统使用TLS 1.0/1.1
无法使用Wininet库的TLS 1.2因此使用WINHTTP下面粘出代码是低版本修改了TLS的库代码
#include <Windows.h>
#include <Winhttp.h>
#include <stdio.h>#pragma comment(lib, "winhttp.lib")#define TRANSFER_SIZE 1024bool PerformHttpRequest() {HINTERNET hSession = WinHttpOpen(L"", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);if (!hSession) {return false;}// 设置要使用的协议 TLS 1.1,需要注意服务端也需要支持TLS 1.1否则无法使用DWORD dwFlags = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1;if (!WinHttpSetOption(hSession, WINHTTP_OPTION_SECURE_PROTOCOLS, &dwFlags, sizeof(dwFlags))) {WinHttpCloseHandle(hSession);return false;}//lpszServerName 是IP或者域名LPCWSTR lpszServerName = L"192.168.99.99";//nServerPort 端口INTERNET_PORT nServerPort = 443;HINTERNET hConnect = WinHttpConnect(hSession, lpszServerName, nServerPort, 0);if (!hConnect) {WinHttpCloseHandle(hSession);return false;}HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/Login", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);if (!hRequest) {WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}BOOL bResult = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);if (!bResult && GetLastError() == ERROR_WINHTTP_SECURE_FAILURE) {//忽略所有异常Https CA证书问题// SECURITY_FLAG_IGNORE_ALL_CERT_ERRORS 也可以DWORD dwFlags =SECURITY_FLAG_IGNORE_UNKNOWN_CA |SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE |SECURITY_FLAG_IGNORE_CERT_CN_INVALID |SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;WinHttpSetOption(hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));bResult = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);}if (!bResult) {WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}bResult = WinHttpReceiveResponse(hRequest, NULL);if (!bResult) {WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}wchar_t szBuff[TRANSFER_SIZE];DWORD dwReadSize;bResult = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, szBuff, &dwReadSize, WINHTTP_NO_HEADER_INDEX);if (!bResult) {WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}wprintf(L"%ws\n", szBuff);DWORD dwBytesAvailable;bResult = WinHttpQueryDataAvailable(hRequest, &dwBytesAvailable);if (!bResult) {WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}if (dwBytesAvailable > TRANSFER_SIZE) {wprintf(L"Data too long %d /b\n", GetLastError(), dwBytesAvailable);WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}DWORD dwBytesRead;ZeroMemory(szBuff, TRANSFER_SIZE);bResult = WinHttpReadData(hRequest, szBuff, dwBytesAvailable, &dwBytesRead);if (!bResult) {WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return false;}printf("%s\n", szBuff);WinHttpCloseHandle(hRequest);WinHttpCloseHandle(hConnect);WinHttpCloseHandle(hSession);return true;
}int main() {if (PerformHttpRequest()) {return 0;}else {return 1;}
}

这篇关于WINHTTP忽略HTTPS证书的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/670926

相关文章

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

nginx生成自签名SSL证书配置HTTPS的实现

《nginx生成自签名SSL证书配置HTTPS的实现》本文主要介绍在Nginx中生成自签名SSL证书并配置HTTPS,包括安装Nginx、创建证书、配置证书以及测试访问,具有一定的参考价值,感兴趣的可... 目录一、安装nginx二、创建证书三、配置证书并验证四、测试一、安装nginxnginx必须有"-

nginx部署https网站的实现步骤(亲测)

《nginx部署https网站的实现步骤(亲测)》本文详细介绍了使用Nginx在保持与http服务兼容的情况下部署HTTPS,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录步骤 1:安装 Nginx步骤 2:获取 SSL 证书步骤 3:手动配置 Nginx步骤 4:测

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

python忽略warnings的几种方法

《python忽略warnings的几种方法》本文主要介绍了几种在Python忽略警告信息的方法,,可以使用Python内置的警告控制机制来抑制特定类型的警告,下面就来介绍一下,感兴趣的可以了解一下... 目录方法 1: 使用 warnings 模块过滤特定类型和消息内容的警告方法 2: 使用 warnin

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文