Cesanta Mongoose嵌入式SSL/TLS实现报错:TLS not enabled排查
Mongoose内置TLS1.3开启后“TLS not enabled”错误排查
在嵌入式系统Web服务器中使用Mongoose实现SSL/TLS,已开启预编译宏MG_TLS=MG_TLS_BUILTIN,按教程编写代码后,服务器接受连接时提示“TLS not enabled”错误,代码如下:
static const char *s_tls_cert ="-----BEGIN CERTIFICATE----- " "ABCD " "-----END CERTIFICATE----- "; // Actual certificate created will be copied here as a string static const char *s_tls_key = "-----BEGIN PRIVATE KEY----- " "ABCD " "-----END PRIVATE KEY----- "; // Actual private key created will be copied here void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { if (ev == MG_EV_ACCEPT) { struct mg_tls_opts opts = { .cert = s_tls_cert, .certkey = s_tls_key}; mg_tls_init(c, &opts); } if (ev == MG_EV_HTTP_MSG) { struct mg_http_message *hm = (struct mg_http_message *) ev_data; if (mg_http_match_uri(hm, "/api/login")) { mg_http_reply(c, 200, "Content-Type: text/html\r\n", "<!DOCTYPE html><html><body>Welcome User</body></html>"); } } } void task1(void) { struct mg_mgr mgr; mg_mgr_init(&mgr); mg_log_set(MG_LL_DEBUG); mg_http_listen(&mgr, "https://0.0.0.0:8443", fn, &mgr); for (;;)mg_mgr_poll(&mgr, 1000, 1); mg_mgr_free(&mgr); }
问题排查与修正
1. TLS初始化时机错误
核心问题是在MG_EV_ACCEPT事件中调用mg_tls_init的方式不正确。Mongoose中使用mg_http_listen监听HTTPS地址时,需要在监听阶段就配置好TLS选项,而非等待连接接受后再初始化。
2. 证书/密钥字符串格式错误
当前代码中证书和密钥的字符串拼接方式存在问题,C语言中未显式添加\n的换行会导致PEM格式解析失败,需确保每行末尾添加\n,保证内容与实际PEM文件一致。
修正后的代码
// 修正证书和密钥的字符串格式 static const char *s_tls_cert = "-----BEGIN CERTIFICATE-----\n" "实际证书内容行1\n" "实际证书内容行2\n" "...\n" "-----END CERTIFICATE-----\n"; static const char *s_tls_key = "-----BEGIN PRIVATE KEY-----\n" "实际私钥内容行1\n" "实际私钥内容行2\n" "...\n" "-----END PRIVATE KEY-----\n"; void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { if (ev == MG_EV_HTTP_MSG) { struct mg_http_message *hm = (struct mg_http_message *) ev_data; if (mg_http_match_uri(hm, "/api/login")) { mg_http_reply(c, 200, "Content-Type: text/html\r\n", "<!DOCTYPE html><html><body>Welcome User</body></html>"); } } } void task1(void) { struct mg_mgr mgr; struct mg_http_listen_opts listen_opts = {0}; struct mg_tls_opts tls_opts = { .cert = s_tls_cert, .certkey = s_tls_key }; mg_mgr_init(&mgr); mg_log_set(MG_LL_DEBUG); // 配置监听选项中的TLS参数 listen_opts.tls_opts = &tls_opts; mg_http_listen(&mgr, "https://0.0.0.0:8443", fn, &mgr, &listen_opts); for (;;) mg_mgr_poll(&mgr, 1000, 1); mg_mgr_free(&mgr); }
说明
- 移除了
MG_EV_ACCEPT事件中的mg_tls_init调用,改为在mg_http_listen时传入配置好的TLS选项,让Mongoose在监听阶段就启用TLS。 - 修正了证书和密钥的字符串格式,确保PEM内容的每行末尾都有换行符,避免解析错误。
内容的提问来源于stack exchange,提问作者Anusha
相关产品推荐
相关产品推荐

