首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将STM32 lwip/mqtt与tls结合使用?

如何将STM32 lwip/mqtt与tls结合使用?
EN

Stack Overflow用户
提问于 2020-04-08 08:32:58
回答 3查看 5.5K关注 0票数 1

我制作了stm32 + rtos + lwip/mqtt解决方案,运行良好。现在我想将它与嵌入tls安全连接一起使用。我没有找到任何例子。

lwip mqtt api支持tls通信。但是没有这样的例子,只有使用我使用的代码LWIP MQTT客户端的简单mqtt客户机。

我尝试在cubemx、LWIP_ALTCP和LWIP_ALTCP_TLS中启用嵌入式和一些选项,将LWIP_ALTCP_TLS_MBEDTLS添加到Path中。它汇编了。如何插入mbedtls和添加tls证书。这个链接需要一些信息,altcp tls

是否有人用stm32 lwip/mqtt + tls (mbedtls)作为stm32 lwip栈的解释或工作实例?

UPD。下面是我的mqtt客户端设置代码:

代码语言:javascript
运行
复制
struct mqtt_connect_client_info_t ci;
memset(&ci, 0, sizeof(ci));
ci.client_id = "lwip_test";
ci.client_user = "";
ci.client_pass = "";
ci.keep_alive = 0;
ci.tls_config = altcp_tls_create_config_client((const u8_t*)test_cert, sizeof(test_cert));
// create client
client = mqtt_client_new();
// connect client   
mqtt_client_connect(client, &resolved, port, mqtt_on_connect, (void *)0, &ci);

我给mqtt客户端ca证书和长度。代码-4480 (分配内存失败)的altcp_tls_create_config_client_common函数(altcp_tls_mbedtls.c)中有一个错误。

代码语言:javascript
运行
复制
ret = mbedtls_x509_crt_parse(conf->ca, ca, ca_len);
if (ret != 0) {
  LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_x509_crt_parse ca failed: %d 0x%x", ret, -1*ret));
  altcp_mbedtls_free_config(conf);
  return NULL;
}

我做错了什么,我应该在mbedtls模块中设置其他选项吗?我使用默认由CubeMX生成的

EN

回答 3

Stack Overflow用户

发布于 2020-08-20 13:35:26

这个线程帮助我结合mqtt.html中的其他示例,使MQTT客户端能够使用MbedTLS 2方式身份验证。我现在可以订阅/发布到amazon云。

如果有人感兴趣,我就是这么做的。

  1. 在启用CubeMX和MbedTLS的情况下,从MbedTLS生成代码。重要的是启用MBEDTLS_PLATFORM_MEMORY、MEMP_MEM_MALLOC和LWIP_ALTCP_TLS_MBEDTLS,以便库使用来自LwIP的替代calloc/free函数(它们在altcp_mbedtls_mem_init()函数中设置)。
  2. 我还使用启用了MBEDTLS_ENTROPY_HARDWARE_ALT、MBEDTLS_NO_PLATFORM_ENTROPY和MBEDTLS_CTR_DRBG_C,因此MbedTLS库可以使用ctr随机数生成器(在altcp_tls_create_config()函数中初始化)。
  3. 如果您像我一样在FreeRTOS中使用LwIP,那么就必须启用MBEDTLS_THREADING_ALT,然后在代码中调用mbedtls_threading_set_alt()函数,以便在MbedTLS库中启用互斥处理。
  4. 下面是我在代码中所做的工作:
代码语言:javascript
运行
复制
mqtt_client_t *client;
struct mqtt_connect_client_info_t client_info;
ip_addr_t server_ip;

/* Somewhere in the code call this to get IP address of the host */
ip_addr_t ipaddr;
err = dns_gethostbyname("host_name", &ipaddr, mqtt_resolved_cb, NULL);

/* Wait until this callback gets the IP */
static void mqtt_resolved_cb(const char *host, const ip_addr_t *ipaddr,
                             void *callback_arg)
{
  /* If resolved IP is known -> set it */
  if (ipaddr->addr != 0)
  {
    server_ip.addr = ipaddr->addr;
  }
}

/* Then call this to start MQTT client */
void mqtt_test(const ip_addr_t *ipaddr, uint16_t port,
               const uint8_t *ca_cert_str, size_t ca_cert_len,
               const uint8_t *dev_cert_str, size_t dev_cert_len,
               const uint8_t *dev_key_str, size_t dev_key_len,
               const uint8_t *dev_key_pass_str, size_t dev_key_pass_len)
{
  /* Setup an empty client info structure */
  memset(&mqtt.client_info, 0, sizeof(mqtt.client_info));

  /* Set client information */
  mqtt.client_info.client_id = "lwip_test";
  mqtt.client_info.client_user = NULL;
  mqtt.client_info.client_pass = NULL;
  mqtt.client_info.keep_alive = 0;
  mqtt.client_info.will_topic = NULL;
  mqtt.client_info.will_msg = NULL;
  mqtt.client_info.will_retain = 0;
  mqtt.client_info.will_qos = 0;

  /* Set TLS configuration */
  mqtt.client_info.tls_config = altcp_tls_create_config_client_2wayauth(
    ca_cert_str, ca_cert_len,
    dev_key_str, dev_key_len, dev_key_pass_str, dev_key_pass_len,
    dev_cert_str, dev_cert_len);

  /* Allocate memory for MQTT client */
  mqtt.client = mqtt_client_new();

  /* Connect to the server */
  if (mqtt.client != NULL)
  {
    err = mqtt_client_connect(
      mqtt.client, ipaddr, port,
      mqtt_connection_cb, 0, &mqtt.client_info);
  }
}

然后,代码在上面示例链接的标准mqtt回调中继续进行。

谢谢,我也希望这能帮到别人。

票数 4
EN

Stack Overflow用户

发布于 2020-04-16 15:37:30

我有一个相同的配置,所以我可以告诉您,如果您调试代码,您将看到它在尝试调用calloc时会崩溃,如果您的环境与我的环境相等,您就没有那个系统功能。

我所做的是使用在lwip中实现的calloc,特别是在altcp模块中。我通过cubemx MBEDTLS_PLATFORM_MEMORY定义,为了激活altcp_tls_mbedtls_mem.c中的定义ALTCP_MBEDTLS_PLATFORM_ALLOC,我可以使用altcp_mbedtls_mem_init()函数来指定mbedtls使用altcp和altcp_tls_mbedtls_mem.c。

这个函数被调用到altcp_tls_create_config_client中,所以如果要使用它,就不必调用altcp_mbedtls_mem_init()两次。

通过这种方式,您应该能够正确地为mbedtls分配内存。

票数 0
EN

Stack Overflow用户

发布于 2020-11-12 17:32:11

您似乎有内存分配问题,可以尝试增加lwipopts.h中的堆内存大小,如下所示:

代码语言:javascript
运行
复制
#define MEM_SIZE (50 * 1024)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61096520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档