环境: window10_x64 & vs2022

python版本: 3.9.13

日常开发中,会遇到c/c++作为客户端访问http/https服务的情况,今天整理下windows10环境下c/c++使用winhttp访问http/https服务的笔记,并提供相关资源下载。

我将从以下几个方面展开:

  • http服务构建
  • https证书生成及服务构建
  • winhttp使用示例
  • 资源下载

一、模拟http服务端

1、构建http服务

这里使用tornado来构建http服务。

示例代码(httpServer1.py):

#! /usr/bin/env python3
#-*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
import tornado.httpserver
import json,time,datetime
settings = {
"debug" : False ,
}
def trace(reqType,reqBody):
msg = str(datetime.datetime.now()) + " , [" + reqType + "] , " + str(reqBody)
print(msg)
class MainHandler(tornado.web.RequestHandler):
def get(self):
trace("get",self.request.arguments)
#query = self.get_query_argument("query")
#print("query : %s" % query)
self.set_header('content-type', 'application/json')
#self.write(json.dumps({"result" : "test message"}))
self.finish(json.dumps({"result" : "get message"}))
def put(self):
trace("put",self.request.body)
self.finish(json.dumps({"result" : "put message"})) def post(self):
#trace("post",self.request.arguments)
trace("post",self.request.body)
self.set_header('Content-type', 'application/json')
#self.set_header('Transfer-Encoding', 'chunked')
self.finish(json.dumps({"result" : "post message %d" % time.time()}))
if __name__ == "__main__":
port = 8093
print("listen on port %d"%port)
application = tornado.web.Application([
(r"/.*", MainHandler),
],**settings) application.listen(port) #http_server = tornado.httpserver.HTTPServer(application)
#http_server.bind(port,"0.0.0.0")
#http_server.start(num_processes=0) tornado.ioloop.IOLoop.instance().start()

2、服务运行效果

curl测试命令如下:

curl -v  http://127.0.0.1:8093 && echo ""

运行效果如下:

二、模拟https服务端

构建https服务,需要使用证书,这里使用自签名证书来实现。

1、生成证书

生成自签名证书(genCertTest1.bat):

goto start
cat > openssl.cnf <<EOF
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no [req_distinguished_name]
C = CN
ST = ShangHai
L = ShangHai
O = MyCompany
OU = Mike_Zhang@live.com
CN = localhost [v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names [alt_names]
DNS.1 = localhost
DNS.2 = 127.0.0.1
IP.1 = 127.0.0.1
EOF
:start :: 生成包含SAN的证书
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes -config openssl.cnf -extensions v3_req

openssl.cnf文件内容如下:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = CN
ST = ShangHai
L = ShangHai
O = MyCompany
OU = Mike_Zhang@live.com
CN = localhost
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
DNS.2 = 127.0.0.1
IP.1 = 127.0.0.1

执行 genCertTest1.bat 脚本,会生产证书文件:

2、构建https服务

这里基于tornado来实现,添加ssl相关内容即可。

示例代码如下(httpsServer1.py):

#! /usr/bin/env python3
#-*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
import tornado.httpserver
import json,time,datetime
import ssl
settings = {
"debug" : False ,
}
def trace(reqType,reqBody):
msg = str(datetime.datetime.now()) + " , [" + reqType + "] , " + str(reqBody)
print(msg)
class MainHandler(tornado.web.RequestHandler):
def get(self):
trace("get",self.request.arguments)
#query = self.get_query_argument("query")
#print("query : %s" % query)
self.set_header('content-type', 'application/json')
#self.write(json.dumps({"result" : "test message"}))
self.finish(json.dumps({"result" : "get message"}))
def put(self):
trace("put",self.request.body)
self.finish(json.dumps({"result" : "put message"})) def post(self):
#trace("post",self.request.arguments)
trace("post",self.request.body)
self.set_header('Content-type', 'application/json')
self.finish(json.dumps({"result" : "post message %d" % time.time()}))
if __name__ == "__main__":
#ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_ctx.load_cert_chain(
certfile="server.crt",
keyfile="server.key"
)
ssl_ctx.options |= (
ssl.OP_NO_SSLv2 |
ssl.OP_NO_SSLv3 |
ssl.OP_NO_TLSv1 |
ssl.OP_NO_TLSv1_1 |
ssl.OP_NO_COMPRESSION
) # 设置现代加密套件
ssl_ctx.set_ciphers(
'ECDHE-ECDSA-AES256-GCM-SHA384:'
'ECDHE-RSA-AES256-GCM-SHA384:'
'ECDHE-ECDSA-CHACHA20-POLY1305:'
'ECDHE-RSA-CHACHA20-POLY1305:'
'DHE-RSA-AES256-GCM-SHA384'
) # 设置椭圆曲线
ssl_ctx.set_ecdh_curve('prime256v1') # 必需的安全设置 port = 8443
print("listen on port %d"%port)
app = tornado.web.Application([
(r"/.*", MainHandler),
],**settings) http_server = tornado.httpserver.HTTPServer(app, ssl_options=ssl_ctx)
#http_server.listen(port)
http_server.bind(port,"0.0.0.0")
http_server.start() tornado.ioloop.IOLoop.current().start()

3、服务运行效果

curl测试命令如下(忽略证书):

curl -vk  https://127.0.0.1:8443 && echo ""

运行效果如下:

三、使用WinHTTP实现客户端

1、WinHTTP说明

Microsoft Windows HTTP 服务 (WinHTTP) 提供 HTTP 客户端应用程序编程接口 (API),以便通过 HTTP 协议将请求发送到其他 HTTP 服务器。

该服务提供 C/C++ 应用程序编程接口 (API) ,支持HTTPS协议。

文档地址:

https://learn.microsoft.com/zh-cn/windows/win32/winhttp/winhttp-start-page

c/c++接口文档地址:

https://learn.microsoft.com/zh-cn/windows/win32/winhttp/using-the-winhttp-c-c---api

2、使用示例

关键点:

1)使用 WinHttpConnect 函数创建连接;

2)使用WinHttpOpenRequest设置get/post方法、http/https协议等参数;

3)WinHttpAddRequestHeaders 设置http自定义请求头;

4)WinHttpSendRequest发送数据;

示例代码如下(winhttpTest1.cpp):

完整代码可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20250709 获取。
 
运行效果如下:

四、资源获取

本文涉及资源可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20250709 获取。

C++使用WinHTTP访问http/https服务的更多相关文章

  1. 使用poco 的NetSSL_OpenSSL 搭建https 服务端,使用C++客户端,java 客户端访问,python访问(python还没找到带证书访问的代码.)

    V20161028 由于项目原因,需要用到https去做一些事情. 这儿做了一些相应的研究. 这个https 用起来也是折腾人,还是研究了一周多+之前的一些积累. 目录 1,java client 通 ...

  2. 国产化之银河麒麟.netcore3.1访问https服务的两个问题

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等. 考虑到这些基础产品对.NETCore的支持,最终选择了3.1版 ...

  3. 网络服务器之HTTPS服务

    import ssl, socket, time if __name__ == "__main__": context = ssl.SSLContext(ssl.PROTOCOL_ ...

  4. 架设证书服务器 及 让IIS启用HTTPS服务(转)

    无废话图文教程,教你一步一步搭建CA服务器,以及让IIS启用HTTPS服务. 一.架设证书服务器(CA服务) 1.在系统控制面板中,找到“添加/删除程序”,点击左侧的“添加/删除windows组件”, ...

  5. 为苹果ATS和微信小程序搭建 Nginx + HTTPS 服务

    昨天测试开发微信小程序,才发现微信也要求用HTTPS加密数据,想来是由于之前苹果的ATS审核政策的缘故吧,微信想在苹果上开放小程序必然也只能要求开发者必须使用HTTPS了,于是在服务器上测试安装Ngi ...

  6. .Net Core和jexus配置HTTPS服务

    花了几天时间,看了好多篇博客,终于搞定了网站的HTTPS服务,借此写篇博客,来让有需要的朋友少走弯路. 一.环境介绍 1.Linux下在Docker容器中部署好了一个网站,该网站需要通过外部提供程序访 ...

  7. 用keytool制作证书并在tomcat配置https服务(二 )

    用keytool制作证书并在tomcat配置https服务(一) 双向认证: 我们上边生成了服务端证书,并发送给客户端进行了验证. 双向认证是双向的,因此还差客户端证书. 1.为方便导入浏览器,生成p ...

  8. 用keytool制作证书并在tomcat配置https服务(一)

    https分为单项认证和双向认证. 一般https页面上的访问都是单项认证,服务端发送数字证书给客户端,客户单方面验证.而服务端不做验证. 而双向认证,需要双方都有证书,然后发送给对方进行验证.一般用 ...

  9. 使用Let's Encrypt搭建永久免费的HTTPS服务

    1.概述1.1 HTTPS概述HTTPS即HTTP + TLS,TLS 是传输层加密协议,它的前身是 SSL 协议.我们知道HTTP协议是基于TCP的.简而言之HTTPS就是在TCP的基础上套一层TL ...

  10. C#访问gsoap的服务--可用

    问题来源: C++开发一个webservice,然后C#开发客户端,这样就需要C#的客户端访问gsoap的服务端.(大家都知道gsoap是C/C++开发webservice的最佳利器) 为什么不考虑直 ...

随机推荐

  1. 在 Idea 中使用 Git

    以 git-2.21.0 为例说明安装步骤: 双击 Git-2.21.0-64-bit.exe 点击 Next 设置安装路径 点击 Next 点击 Next 点击 Next,选择默认的编辑器 点击 N ...

  2. Asp.net mvc基础(八)Layout页面的使用

    Layout页面相当于母版页. 使用步骤如下: 1.创建MVC5布局页 @RenderBody()渲染正文部分 @ViewBag.Title表示标题内容 也可以自己定义渲染的部分:比如在布局页中添加@ ...

  3. ES6 Fielddata is disabled on text fields by default

    使用ES做聚合运算的时候,有时候会遇到这个错误 Fielddata is disabled on text fields by default. Set fielddata=true on [host ...

  4. symfony3.4修改安全验证默认表配置

    #security.yml security: # ··· providers: our_db_provider: entity: class: AppBundle:Users property: u ...

  5. 凯亚物联网平台如何通过MQTT网络组件接入设备

    一.概述 有人提议我用kestrel代替Dotnetty ,那是不可能的, 物联网平台MQTT,rtmp,rtsp,httpflv,tcp,udp,rpc 都是基于dotnetty实现,压测没有问题, ...

  6. Vue(五)—Class与style绑定

    Vue-Class与style绑定 class.style都属于attribute,所以通过v-bind来绑定 针对class.style属性,v-bind可以通过对象或数组去指定 绑定Html Cl ...

  7. 工具 | Hacking

    0x00 简介 Hacking是一款包含多种渗透测试功能的脚本. 下载地址: Hacking下载:Hacking下载 0x01 功能说明 Brute Force DDos Attack NMap Po ...

  8. 【代码】Processing笔触手写板笔刷代码合集(包含流速、毛笔笔触、压感笔触等多种)

    代码来源于openprocessing,考虑到国内不是很好访问,我把我找到的比较好的搬运过来! @ 目录 合集1 笔触4(流速笔触,速写) 笔触5(流速笔触,晕染) 笔触6(流速笔触,毛笔) 合集2 ...

  9. 物联网之对接MQTT最佳实践

    小伙伴们,你们好呀,我是老寇,跟我一起学习对接MQTT 安装EMQX 采用docker-compose一键式启动!!! 还没有安装docker朋友,参考文章下面两篇文章 # Ubuntu20.04安装 ...

  10. 掌握Node.js原理,开启异步编程之旅

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...