mongoose 支持https踩坑纪实

news2025/1/20 10:36:29

简述

mongoose是C编写的嵌入式web服务,它能够支持https协议,可以简单的部署,但要做到完美部署,不是那么容易。

部署方法

本人使用的是最新的7.16版,以前版本似乎是要通过修改 头文件中的 MG_ENABLE_SSL 宏定义,将其值设置为 1 来开启 SSL 功能,这一版不是了。这一版要在 mongoose.h 头文件中将MG_TLS宏定义为如下六种中的一个。

#define MG_TLS_NONE 0     // No TLS support
#define MG_TLS_MBED 1     // mbedTLS
#define MG_TLS_OPENSSL 2  // OpenSSL
#define MG_TLS_WOLFSSL 5  // WolfSSL (based on OpenSSL)
#define MG_TLS_BUILTIN 3  // Built-in
#define MG_TLS_CUSTOM 4   // Custom implementation

#ifndef MG_TLS
#define MG_TLS MG_TLS_OPENSSL //我选择了OPENSSL
#endif

如果定义为MG_TLS_BUILTIN最简单,似乎是mongoose内置的TLS库,我最早就是用的它。它可以运行mongoose中的tutorials中的http示例了。也能够正确的加载它自签名的证书和私钥了。但很不幸,我在国内淘宝上购买的证书它不认,总是提醒不认识pks格式的证书。

所以我最终采用了MG_TLS_OPENSSL。这种方式需要装载OPENSSL库。我的方法是从OPENSSL网站下载完整的安装包,装完后,将其中的include目录考到工程里,然后指定该目录为工程的include目录(mongoose.h中采用#include <openssl/ssl.h>,所有必须置为工程的include目录)。然后将libcrypto.lib libssl.lib装载。我试了静态库,提示缺东西,我就没接着试,直接采用了引入动态lib库,并且将libcrypto-3-x64.dll,libssl-3-x64考到可执行目录下,结果编译成了。它也支持国内颁发的证书了。

程序的重要代码:

//事件处理函数:

// We use the same event handler function for HTTP and HTTPS connections
// fn_data is NULL for plain HTTP, and non-NULL for HTTPS
static void fn(struct mg_connection* c, int ev, void* ev_data) {
    if (ev == MG_EV_ACCEPT && c->fn_data != NULL) {//如果事件是https的链接接收事件
        struct mg_tls_opts opts;//最重要的tls配置参数
        memset(&opts, 0, sizeof(opts));
#ifdef TLS_TWOWAY//如果是双向的,只有银行那样的应用,才会验证客户端的证书,所以一般不要设ca(证书机构的证书)
        opts.ca = mg_str(s_tls_ca);
#endif
        opts.cert = mg_str(s_tls_cert);//服务器证书字符串,你要想办法从文件中装进来
        opts.key = mg_str(s_tls_key);//服务器私钥字符串,你要想办法从文件中装进来
        mg_tls_init(c, &opts); //初始化tls链接,即若干握手、交换证书等等标准操作
    }
    if (ev == MG_EV_HTTP_MSG) {
//接收到数据消息事件       

}
    }
}

//启动消息循环处理代码

struct mg_mgr mgr;                            // Event manager
mg_mgr_init(&mgr);                            // Initialise event manager
    mg_http_listen(&mgr, "http://0.0.0.0:80", fn, NULL);  // Create HTTP listener
    mg_http_listen(&mgr, "http://0.0.0.0:443", fn, (void*)1);  // Create HTTP listener
for (;;) mg_mgr_poll(&mgr, 1000);                    // Infinite event loop
mg_mgr_free(&mgr);

大坑

正常情况下,程序应该可以正常执行了,但大坑刚刚开始:由于我要将它作为微信小程序的后台,而微信小程序,要求网站的ssl评分要达到A级(使用https://myssl.com进行评估),而我的网站只有B级。

默认情况下是没有优先级的,所以需要#define MG_ENABLE_OPENSSL_CIPHER_SERVER_PREFERENCE宏

我放在了 mongoose.h 头文件大约2394行处

#if MG_TLS == MG_TLS_OPENSSL || MG_TLS == MG_TLS_WOLFSSL
#define MG_ENABLE_OPENSSL_CIPHER_SERVER_PREFERENCE
#include <openssl/err.h>
#include <openssl/ssl.h>

我在仔细分析了证书链后,发现mongoose默认根本没有向客户端发送证书链,struct mg_tls_opts中根本没有证书链的位置,最后我发现openssl本身提供了几个方法设置证书链,我挑了一个简单的函数SSL_use_certificate_chain_file(tls->ssl, "server_cert.pem"); 我把它加在了mg_tls_init函数中装载证书和私钥的代码下面,大约13172行处。结果就成了。

设置优先级

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2279330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科研绘图系列:R语言绘制多种图形(multiple plots)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图输出画图2画图3画图4画图5系统信息介绍 科研绘图系列:R语言绘制多种图形(multiple plots) 加载R包 library(tidyverse) library(RColo…

QT 使用QSqlTableModel对数据库进行创建,插入,显示

文章目录 效果图概述功能点代码分析初始数据插入数据数据显示 总结 效果图 概述 本案例用于对数据库中的数据进行显示等其他操作&#xff0c;其他表格筛选&#xff0c;过滤等功能可看此博客 框架&#xff1a;数据模型使用QSqlTableModel&#xff0c;视图使用QTableView&#x…

Vscode:问题解决办法 及 Tips 总结

Visual Studio Code&#xff08;简称VSCode&#xff09;是一个功能强大的开源代码编辑器&#xff0c;广泛用于各种编程语言和开发场景&#xff0c;本博客主要记录在使用 VSCode 进行verilog开发时遇到的问题及解决办法&#xff0c;使用过程中的技巧 文章目录 扩展安装失败调试配…

FANUC机器人系统镜像备份与恢复的具体步骤(图文)

FANUC机器人系统镜像备份与恢复的具体步骤(图文) 镜像备份: 如下图所示,进入文件—工具—切换设备,找到插入的U盘UT1, 如下图所示,进入U盘目录后,创建目录,这里目录名称为11, 如下图所示࿰

模块化架构与微服务架构,哪种更适合桌面软件开发?

前言 在现代软件开发中&#xff0c;架构设计扮演着至关重要的角色。两种常见的架构设计方法是模块化架构与微服务架构。它们各自有独特的优势和适用场景&#xff0c;尤其在C#桌面软件开发领域&#xff0c;模块化架构往往更加具有实践性。本文将对这两种架构进行对比&#xff0…

使用Flask和Pydantic实现参数验证

使用Flask和Pydantic实现参数验证 1 简介 Pydantic是一个用于数据验证和解析的 Python 库&#xff0c;版本2的性能有较大提升&#xff0c;很多框架使用Pydantic做数据校验。 # 官方参考文档 https://docs.pydantic.dev/latest/# Github地址 https://github.com/pydantic/pyd…

游戏引擎学习第81天

仓库:https://gitee.com/mrxiao_com/2d_game_2 或许我们应该尝试在地面上添加一些绘图 在这段时间的工作中&#xff0c;讨论了如何改进地面渲染的问题。虽然之前并没有专注于渲染部分&#xff0c;因为当时主要的工作重心不在这里&#xff0c;但在实现过程中&#xff0c;发现地…

【Vue3 入门到实战】3. ref 和 reactive区别和适用场景

目录 ​编辑 1. ref 部分 1.1 ref定义基本数据类型 1.2 ref 定义引用数据类型 2. reactive 函数 3. ref 和 reactive 对比 3.1 原理 3.2 区别 3.3 使用原则 在 Vue 3 中 ref 和 reactive 是用于创建响应式数据的两个核心函数。它们都属于 Composition API 的一部分&…

蓝桥杯3525 公因数匹配 | 枚举+数学

题目传送门 这个题目是一个数学题&#xff0c;由于只需要找到存在大于1的公因数的两数&#xff0c;所以比较方便的做法是统计每一个数的&#xff08;质&#xff09;因数。可以通过筛法统计质因数降低复杂度&#xff0c;但是直接枚举因数也可以满足要求。使用字典记录每个因数出…

django应急物资管理系统

Django应急物资管理系统是一种高效、智能的管理系统&#xff0c;旨在应对自然灾害、事故灾难等突发事件&#xff0c;确保救援物资能够及时、准确地调配到需要的地方。 一、系统背景与意义 在现代社会&#xff0c;各类突发事件频繁发生&#xff0c;对人民生命财产安全构成严重…

python+django+Nacos实现配置动态更新-集中管理配置(实现mysql配置动态读取及动态更新)

一、docker-compose.yml 部署nacos服务 version: "3" services:mysql:container_name: mysql# 5.7image: mysql:5.7environment:# mysql root用户密码MYSQL_ROOT_PASSWORD: rootTZ: Asia/Shanghai# 初始化数据库(后续的初始化sql会在这个库执行)MYSQL_DATABASE: nac…

Qt Desiogn生成的ui文件转化为h文件

1.找到这个工具 2.查找到ui文件以及要转化为的h文件的路径。 3.在1中的工具输入uic /xx/xxx.ui -o /xx/xxx.h即可得到结果。

vim文本编辑器

vim命令的使用&#xff1a; [rootxxx ~]# touch aa.txt #首先创建一个文件 [rootxxx ~]# vim aa.txt #vim进入文件aa.txt进行编辑 vim是vi的升级版&#xff0c;具有以下三种基本模式&#xff1a; 输入模式(编辑模式) 点击i进入编辑模式 &#xff08;说明…

大华Java开发面试题及参考答案 (上)

TCP 的三次握手和四次挥手过程中各个状态的细节是怎样的&#xff1f; TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输层协议&#xff0c;其三次握手和四次挥手过程涉及多个状态&#xff0c;以下是详细的状态细节&#xff1a; 三次握手…

乐乐音乐Compose-Desktop版

简介 乐乐音乐Compose-Desktop版主要是基于Compose-Desktop框架和musique开发的音乐播放器&#xff0c;它支持lrc歌词和动感歌词( ksc歌词、krc歌词、trc歌词、zrce歌词和hrc歌词等)、多种格式歌词转换器及制作动感歌词、翻译歌词和音译歌词。 编译环境 ideaIU-2024.1.4、JD…

HTML5 教程(下)

HTML5 Video(视频) HTML5 Video(视频) 在本节内容中&#xff0c;你将了解到在HTML5中视频是如何工作的、主流浏览器支持的视频格式以及如何对网页中的视频进行控制。 很多站点都会使用到视频. HTML5 提供了展示视频的标准。 检测您的浏览器是否支持 HTML5 视频&#xff1a; …

计算机网络 (51)鉴别

前言 计算机网络鉴别是信息安全领域中的一项关键技术&#xff0c;主要用于验证用户或信息的真实性&#xff0c;以及确保信息的完整性和来源的可靠性。 一、目的与重要性 鉴别的目的是验明用户或信息的正身&#xff0c;对实体声称的身份进行唯一识别&#xff0c;以便验证其访问请…

力扣 有效的括号

括号匹配问题&#xff0c;找到符合的进行抵消。 题目 从题可以看出是嵌套的括号先匹配先做抵消&#xff0c;类似就近原则&#xff0c;这也是栈的典型例题。可以通过枚举多种不同的情况慢慢用if与else做返回。 时间复杂度&#xff1a;O(n)&#xff0c;其中 n 是字符串的长度。…

阿里云通义实验室自然语言处理方向负责人黄非:通义灵码2.0,迈入 Agentic AI

通义灵码是基于阿里巴巴通义大模型研发的AI 智能编码助手&#xff0c;在通义灵码 1.0 时代&#xff0c;我们针对代码的生成、补全和问答&#xff0c;通过高效果、低时延&#xff0c;研发出了国内最受欢迎的编码助手。 在通义灵码 2.0 发布会上&#xff0c;阿里云通义实验室自然…

深度学习模块C2f代码详解

C2f 是一个用于构建卷积神经网络&#xff08;CNN&#xff09;的模块&#xff0c;特别是在 YOLOv5 和 YOLOv8 等目标检测模型中。这个模块是一个改进的 CSP&#xff08;Cross Stage Partial&#xff09;Bottleneck 结构&#xff0c;旨在提高计算效率和特征提取能力。下面是对 C2…