You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:37:34