mongoose 支持https踩坑纪实

简述

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.rhkb.cn/news/3440.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每打开一个chrome页面都会【自动打开F12开发者模式】,原因是 使用HBuilderX会影响谷歌浏览器的浏览模式

打开 HBuilderX&#xff0c;点击 运行 -> 运行到浏览器 -> 设置web服务器 -> 添加chrome浏览器安装路径 chrome谷歌浏览器插件 B站视频下载助手插件&#xff1a; 参考地址&#xff1a;Chrome插件 - B站下载助手&#xff08;轻松下载bilibili哔哩哔哩视频&#xff09…

XML在线格式化 - 加菲工具

XML在线格式化 打开网站 加菲工具 选择“XML 在线格式化” 输入XML&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果

微信原生小程序自定义封装组件(以导航navbar为例)

封装 topnav.js const App getApp(); Component({// 组件的属性列表properties: {pageName: String, //中间的titleshowNav: { //判断是否显示左上角的按钮 type: Boolean,value: true},showHome: { //判断是否显示左上角的home按钮type: Boolean,value: true},showLocat…

RPA赋能内容创作:打造小红书入门词语图片的全自动化流程

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 用RPA全自动化批量生产【入门词语】图片做小红书商单&#xff0c;保姆级工具开发教程 最近由…

Linux SUID提权

文章目录 1. SUID/SGID2. 查找SUID文件3. SUID/SGID提权3.1 SUID配置不当3.2 SUID systemctl提权3.3 $PATH变量劫持 4. 参考 1. SUID/SGID SUID&#xff08;Set User ID&#xff09;意味着如果某个用户对属于自己的文件设置了这种权限&#xff0c;那么其他用户在执行这一脚本时…

【PyQt】图像处理系统

[toc]pyqt实现图像处理系统 图像处理系统 1.创建阴影去除ui文件 2.阴影去除代码 1.创建阴影去除ui文件 UI文件效果图&#xff1a; 1.1QT Desiger设置组件 1.两个Pushbutton按钮 2.两个label来显示图像 3.Text Browser来显示输出信息 1.2布局的设置 1.先不使用任何La…

从零创建一个 Django 项目

1. 准备环境 在开始之前&#xff0c;确保你的开发环境满足以下要求&#xff1a; 安装了 Python (推荐 3.8 或更高版本)。安装 pip 包管理工具。如果要使用 MySQL 或 PostgreSQL&#xff0c;确保对应的数据库已安装。 创建虚拟环境 在项目目录中创建并激活虚拟环境&#xff…

springboot多环境配置

问题背景 以后在工作中&#xff0c;对于开发环境、测试环境、生产环境的配置肯定都不相同&#xff0c;比如我们开发阶段会在自己的电脑上安装 mysql &#xff0c;连接自己电脑上的 mysql 即可&#xff0c;但是项目开发完毕后要上线就需要该配置&#xff0c;将环境的配置改为线…

WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测

WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测 目录 WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于WOA-CNN-GRU-Attention、…

鸿蒙动态路由实现方案

背景 随着CSDN 鸿蒙APP 业务功能的增加&#xff0c;以及为了与iOS、Android 端统一页面跳转路由&#xff0c;以及动态下发路由链接&#xff0c;路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。 实现方案 鸿蒙版本动态路由的实现原理&#xff0c;类似于 iOS与Android的实…

【Go】Go Gorm 详解

1. 概念 Gorm 官网&#xff1a;https://gorm.io/zh_CN/docs/ Gorm&#xff1a;The fantastic ORM library for Golang aims to be developer friendly&#xff0c;这是官网的介绍&#xff0c;简单来说 Gorm 就是一款高性能的 Golang ORM 库&#xff0c;便于开发人员提高效率 那…

Chrome谷歌浏览器如何能恢复到之前的旧版本

升级了谷歌最新版不习惯&#xff0c;如何降级版本 未完待续。。 电脑中的Chrome谷歌浏览器升级到了最新版本&#xff0c;但是有种种的不适应&#xff0c;如何能恢复到之前的旧版本呢&#xff1f;我们来看看操作步骤&#xff0c;而且无需卸载重装。 怎么恢复Chrome 之前版本&a…

技术晋升读书笔记—华为研发

读完《华为研发》第三版&#xff0c;我深感震撼&#xff0c;书中的内容不仅详实地记录了华为公司的成长历程&#xff0c;还揭示了华为成功背后的管理理念和创新思路。这本书通过真实的案例和数据&#xff0c;展示了华为如何从一个小企业发展成全球通信行业的领导者。 一、关键人…

数据可视化:让数据讲故事的艺术

目录 1 前言2 数据可视化的基本概念2.1 可视化的核心目标2.2 传统可视化手段 3 数据可视化在知识图谱中的应用3.1 知识图谱的可视化需求3.2 知识图谱的可视化方法 4 数据可视化叙事&#xff1a;让数据讲故事4.1 叙事可视化的关键要素4.2 数据可视化叙事的实现方法 5 数据可视化…

【OpenCV(C++)快速入门】--opencv学习

0 配置环境 配置环境网上很多资料&#xff0c;这里就不赘述了。 笔者使用的是VS2022opencv4.9.0 测试配置环境 // 打开摄像头样例 #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/imgcodecs/imgcod…

归并排序算法

归并排序 1算法介绍 和选择排序一样&#xff0c;归并排序的性能不受输入数据的影响&#xff0c;但表现比选择排序好的多&#xff0c;因为始终都是O(n log n&#xff09;的时间复杂度。代价是需要额外的内存空间。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用…

unity学习18:unity里的 Debug.Log相关

目录 1 unity里的 Debug.log相关 2 用Debug.DrawLine 和 Debug.DrawRay画线 2.1 画线 1 unity里的 Debug.log相关 除了常用的 Debug.Log&#xff0c;还有另外2个 Debug.Log("Debug.Log"); Debug.LogWarning("Debug.LogWarning"); Debug.LogErro…

c语言第一天

前言&#xff1a; bili视频2. 【初识C语言】第一个C语言项目_哔哩哔哩_bilibili 我感觉我意志不坚定&#xff0c;感觉要学网络安全&#xff0c;我又去专升本了&#xff0c;咋搞啊 多学一点是一点&#xff0c;我看到day1团队的人&#xff0c;一天学12个小时&#xff0c;年入2…

PyTorch DAY2: 搭建神经网络

如今&#xff0c;我们已经了解了 PyTorch 中张量及其运算&#xff0c;但这远远不够。本次实验将学会如何使用 PyTorch 方便地构建神经网络模型&#xff0c;以及 PyTorch 训练神经网络的步骤及方法。 知识点 PyTorch 构建神经网络Sequential 容器结构使用 GPU 加速训练模型保存…

2025 年 Java 最新学习资料与学习路线——从零基础到高手的成长之路

2025 年 Java 最新学习资料与学习路线——从零基础到高手的成长之路 大家好&#xff0c;欢迎来到我的频道&#xff01;今天我们要聊聊 Java ——这门陪伴了很多程序员成长的编程语言。无论你是编程新手&#xff0c;还是已经走了一段编程路&#xff0c;但还不确定如何深入学习 …