mongoose 支持https踩坑纪实

打印 上一主题 下一主题

主题 834|帖子 834|积分 2502

简述

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行处。结果就成了。
设置优先级

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表