首页 > 编程知识 正文

,

时间:2023-05-03 11:46:59 阅读:116764 作者:2745

设置mongoose的Https通信前言opessl库以打开SSL功能代码服务端客户端

前言

上一篇文章记录了使用mongoose的http通信。 本打算进行https通信,但最终成功构建了https服务器,可以通过浏览器https请求访问,但自己创建的https客户端与服务器的通信未成功。

(编辑水平有限,但请记录构建https服务器的心得(%; ) )

配置opessl库配置HTTPS支持,需要使用OpenSSL库,

当然,也可以使用gmssl (因为gmssl可以代替openssl )。 但是,这并不意味着可以使用gmssl的密码套件。 mongoose仅支持openssl密码套件,不支持gmssl特定的密码套件。 原因如下

根据mongoose源代码,在构建上下文时使用sslv23 _ client _ method/sslv23 _ server _ method,gmssl包含GMT ls _ client _ method

----------------ok,以上是题外话

回到主题,您需要编译openssl/gmssl库。 小编以前写过关于编译gmssl库(libcrypto.lib,libssl.lib )以及如何编译的文章,这里直接变成了“拿来主义”。 省略说明。 童鞋们可以找资料自己编译…(

.将gmssl库(链接头文件、 lib文件等)放置在项目中。

(注)小编是在windows平台上进行的编码测试) ) ) )。

打开SSL功能mongoose的默认SSL功能已关闭,必须首先打开SSL功能。

打开方法如下。 (注.小编使用的是mongoose版本6.13 ) )。

mongoose定义MG_ENABLE_ssl宏以控制SSL功能的打开和关闭。 将mongoose.h头文件中的MG_ENABLE_SSL值更改为1以打开SSL功能。

code服务器端https服务器端的构建过程与http类似,同样遵循服务的基本逻辑。 它们使用mg_bind_opt函数创建监听连接,并使用mg_bind_opts函数中的struct mg _ bind _ opts参数指定ssl通信所需的证书、私钥等参数

服务端的完整代码如下。

# include ' STD afx.h ' # include ' STD afx.h ' # include ' mongoose.h ' # includestringstaticconstchar * s _ http _ por staticconstchar * s _ SSL _ key=' server.key '; staticconstchar * s _ SSL _ ca=' ca.CRT '; staticstructmg _ serve _ http _ opts _ http _ server _ opts; 区分staticvoidev _ handler (struct mg _ connection * conn,int ev,void *ev_data ) http和WebSocketif ) ev==mg_eta post ) http地址)、Content-Length )消息的长度)、消息本身等从客户端发来的消息。 //STD :3360 string URL=STD :3360 string (hm-uri.p,hm-uri.len ); 可以得到URL//STD :3360 string body=STD :3360 string (hm-body.p,hm-body.len ); STD 33603360 string req _ str=STD :3360 string (hm-message.p,hm-message.len ),可获得存储在body中的客户端发送的信息; 打印请求(got request : (n % s (n ),req_str.c_str ) ); //TODO .请求处理//eg.wehavereceivedanhttprequest.parsedrequestiscontainedin ` hm `.//sendhttpreplytotheclientwhichshsedin mg_printf(Conn,' %.*s ',) int ) hm-message

.len, hm->message.p);//API函数mg_serve_http()可以轻松地从文件系统提供文件。 例如,为了创建一个从当前目录提供静态文件的Web服务器,实现如下处理://mg_serve_http(conn, hm, s_http_server_opts);}else if (ev == MG_EV_WEBSOCKET_HANDSHAKE_DONE ||ev == MG_EV_WEBSOCKET_FRAME ||ev == MG_EV_CLOSE){websocket_message *ws_message = (struct websocket_message *)ev_data;//TODO. 请求处理}}int _tmain(int argc, _TCHAR* argv[]){//声明和初始化事件管理器, mg_mgr是拥有所有活动连接的事件管理器struct mg_mgr mgr;//mg_connection描述连接struct mg_connection *nc;struct mg_bind_opts bind_opts;const char *err;mg_mgr_init(&mgr, NULL);/* Set HTTP server options */memset(&bind_opts, 0, sizeof(bind_opts));bind_opts.error_string = &err; //bind_opts.ssl_cert = s_ssl_cert; //指定服务端证书bind_opts.ssl_key = s_ssl_key; //指定服务端私钥//bind_opts.ssl_ca_cert = s_ssl_ca; //提供了CA证书,表示需要验证客户端的证书printf("Starting SSL server on port %s, cert from %s, key from %sn", s_http_port, bind_opts.ssl_cert, bind_opts.ssl_key);nc = mg_bind_opt(&mgr, s_http_port, ev_handler, bind_opts);if (nc == NULL){printf("Failed to create listener: %sn", err);getchar();return 1;}// Set up HTTP server parameters, for both http and websocketmg_set_protocol_http_websocket(nc);s_http_server_opts.document_root = "."; // Serve current directorys_http_server_opts.enable_directory_listing = "yes";//通过调用循环创建一个事件mg_mgr_poll()循环:for (;;) {mg_mgr_poll(&mgr, 1000);}mg_mgr_free(&mgr);return 0;}

运行结果: (代码中我们是直接将接收到的request直接返回给客户端)

若通过bind_opts.ssl_ca_cert指定了CA证书,即表明服务端需要验证客户端的证书,此时客户端访问时需要提供其证书,否则无法与服务端建立连接。
由于这里我们使用的都是自己生成的证书,因此直接从浏览器中无法访问了。

客户端

理论上,客户端实现流程应该也与http类似,同样遵循服务器基本逻辑。区别在于若服务端需要认证客户端身份时,需通过mg_connect_http_opt/mg_connect_opt等函数进行参数配置。

理想很丰满,现实很残酷╮(︶﹏︶")╭鬼知道我经历了什么
小编实际编码时客户端无法连接到服务端。调试跟踪发现在ev_handler中触发了MG_EV_CONNECT信号,但是其得到的connect_status状态值为-3.
… (•ิ_•ิ)? 目前尚未找到原因,有关https客户端连接的内容待后续再更新了。
有知道的朋友,欢迎留言评论告知小编。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。

  •  标签:  
  • 相关阅读