ZHCACY3 august   2023 AM2431 , AM2432 , AM2434 , AM2631 , AM2631-Q1 , AM2632 , AM2632-Q1 , AM2634 , AM2634-Q1 , AM263P4 , AM263P4-Q1 , AM2732 , AM2732-Q1 , AM6411 , AM6412 , AM6421 , AM6422 , AM6441 , AM6442

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
    1. 1.1 本文档中使用的首字母缩写词
  5. 2MbedTLS
    1. 2.1 MbedTLS 是什么?
    2. 2.2 为何选择 MbedTLS?
    3. 2.3 MbedTLS 的应用
  6. 3在 Lwip 上使用 MbedTLS
    1. 3.1 TLS 服务器示例(HTTPS 服务器)
    2. 3.2 TLS 客户端示例(MQTT 客户端)

在 Lwip 上使用 MbedTLS

轻量级 TCP/IP (LwIP) 协议栈是嵌入式系统中使用的开源 TCP IP 协议栈。LwIP 协议栈旨在减少内存用量和缩小代码大小。LwIP 采用分层方法。针对层间通信的宽松方案是通过使用共享内存建立的,这意味着应用进程和网络代码可以使用相同的内存或内部缓冲区。内部数据包在 LwIP 中表示为 Pbufs(数据包缓冲区)。这些 Pbuf 包含要在网络中传输的数据包的有效负载。在 MbedTLS 不存在的情况下,Pbuf 包含要传输的实际应用数据。但在安全通信的情况下,需要通过加密、哈希处理等多种可能方法之一来保护这些数据。

LwIP 工程已经内置了对 MbedTLS 的支持。启用 MbedTLS 后,通过默认 TCP 层传输的数据现在采用备用路由并由备用 TCP/IP 层(也称为 ALTCP 层)进行处理。这些层设置了回调函数。回调函数决定应用在建立连接、发送数据、接收数据、关闭连接、处理错误等方面的行为。MbedTLS 可与 LwIP 套接字 API、BSD 套接字 API 和 Netconn API 一起使用。这种广泛的用途是通过填充通用 altcp_tls_config 结构来实现的,该结构在内部使用 MbedTLS 函数进行加密/SSL 操作。

altcp_tls_config 结构保存创建新 TLS 客户端或服务器连接所需的状态。然后,此 TLS 配置会直接传递给 LwIP 函数或其他 LwIP 内部结构。例如,通常通过回调 tcp_recv(未启用 MbedTLS 时)传递的数据现在会通过 altcp_recv(启用了 mbedTLS 时)传递。这些替代实现包含额外的代码(默认在 lwip-stack 内)。所有替代层实现都在以下路径的文件中定义:MCU_PLUS_SDK/source/networking/lwip/lwip-stack/src/apps/altcp_tls。

MbedTLS 与 LwIP 的用法由 lwip-config/lwipopts.h 中定义的宏在顶层进行控制。在此启用 MbedTLS 即会启用 ALTCP 层。当 LwIP 库重建(MbedTLS 已启用)时,ALTCP 层将处理数据。如图 3-1 所示,启用了 MbedTLS 时,数据通过备用 TCP 层 (altcp) 传输。启用了 MbedTLS 时,数据通过备用 TCP 层 (altcp) 传输。

GUID-7F250AA7-9E38-48BE-8331-3A22607B592C-low.png图 3-1 与 LwIP 集成时的 MbedTLS 功能

当调用 tcp_new() 函数时,会创建一个新的协议控制块 (TCP PCB)。此 PCB 是一个新的 TCP 连接标识符,可以设置用于侦听新的连接或显式连接到另一个主机。在使用 MbedTLS 的情况下,这时会使用备用 PCB(即 altcp_pcb,而不是 tcp_pcb)。altcp_pcb 结构包含 altcp_functions、对下一个 PCB 的引用、指向参数的指针、PCB 的状态以及应用程序回调。

LwIP 提供 HTTP 客户端和服务器、MQTT 客户端等示例应用。普通的 LwIP 应用不安全,网络中的通信也不安全,这在现场会导致设备容易成为网络攻击的目标。

在 LwIP 上使用 MbedTLS 可确保数据通过安全的端到端传输通道传递。MbedTLS 会在传输实际数据之前执行 3 路 TLS 握手。TLS 握手可确保愿意通信的实体经过授权且可信。TLS 可确保数据的加密和完整性,以及网络中实体的身份验证。此外,MbedTLS 还可在需要额外安全性时提供双向 SSL 身份验证。

启用 MbedTLS 后,LwIP 的内存占用量变化几乎可以忽略不计。据观察,应用中 MbedTLS 本身的内存占用量约为 176KB(还可以进一步降低)。表 3-1 展示了内存占用量。

表 3-1 MbedTLS 库内存占用量
代码 RO 数据 RW 数据 总大小(字节)
127988 39289 9159 176436