计算机网络 - mbed TLS

本文介绍了mbed TLS库在实现安全网络通信中的作用,详细阐述了SSL/TLS协议的工作原理,包括保密性、完整性和认证。讨论了为什么选择mbed TLS作为SSL/TLS库的原因,指出其易用性和低耦合特性。同时,文章提供了使用mbed TLS进行SSL/TLS连接的步骤,包括设置、连接、配置、读写数据和拆除过程,强调了服务器认证的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机网络 - mbed TLS

背景

SSL/TLS 是什么?

传输层安全性协议(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。

  • 安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。
  • 该协议由两层组成: TLS 记录协议(TLS Record)TLS 握手协议(TLS Handshake)

TLS协议主要解决如下三个网络安全问题:

  • 保密(message privacy),保密通过加密encryption实现,所有信息都加密传输,第三方无法嗅探;
  • 完整性(message integrity),通过MAC校验机制,一旦被篡改,通信双方会立刻发现;
  • 认证(mutual authentication),双方认证,双方都可以配备证书,防止身份被冒充;

TLS 协议是可选的,必须配置客户端和服务器才能使用。主要有两种方式实现这一目标:一个是使用统一的 TLS 协议通信端口(例如:用于 HTTPS 的端口 443);另一个是客户端请求服务器连接到 TLS 时使用特定的协议机制(例如:邮件、新闻协议和 STARTTLS)。一旦客户端和服务器都同意使用 TLS 协议,他们通过使用一个握手过程协商出一个有状态的连接以传输数据。通过握手,客户端和服务器协商各种参数用于创建安全连接:

  • 当客户端连接到支持 TLS 协议的服务器要求创建安全连接并列出了受支持的密码组合(加密密码算法和加密哈希函数),握手开始。
  • 服务器从该列表中决定加密和散列函数,并通知客户端。
  • 服务器发回其数字证书,此证书通常包含服务器的名称、受信任的证书颁发机构(CA)和服务器的公钥。
  • 客户端确认其颁发的证书的有效性。
  • 为了生成会话密钥用于安全连接,客户端使用服务器的公钥加密随机生成的密钥,并将其发送到服务器,只有服务器才能使用自己的私钥解密。
  • 利用随机数,双方生成用于加密和解密的对称密钥。这就是 TLS 协议的握手,握手完毕后的连接是安全的,直到连接(被)关闭。如果上述任何一个步骤失败,TLS 握手过程就会失败,并且断开所有的连接。

为什么用 mbed TLS?

在SSL/TLS出现之前,很多应用层协议(http、ftp、smtp等)都存在着网络安全问题,例如大家所熟知的 http 协议,在传输过程中使用的是明文信息,传输报文一旦被截获便会泄露传输内容;传输过程中报文如果被篡改,无法轻易发现;无法保证消息交换的对端身份的可靠性。为了解决此类问题,人们在应用层和传输层之间加入了 SSL/TLS 协议。

其他 SSL 库可能很难使用,OpenSSL一直以来各种被诟病,mbed TLS/SSL 库是为了你的方便而设计的,是替代 OpenSSL 的一个很好的选择。

为了执行 SSL 或 TLS 协议,SSL 库需要提供一些附加功能。

  • SSL 库需要执行对称加密操作,例如 AES,来加密连接上的数据。
  • SSL 库使用非对称加密操作,如 RSA,来识别和验证链接的各方。
  • SSL 库使用报文摘要操作,例如 SHA-256 哈希算法来保护通过线路发送的信息完整性。
  • 另外,SSL 库需要能够解析 理解和使用 X.509 证书。
  • 最后,SSL 库必须执行网络操作来发送和接收协议包。

所有这些对大多数用户来说都是不可见的,并且被封装在一个 SSL 库,如 mbed TLS中,开发人员可以使用它来在其应用程序中实现 SSL 或 TLS。

概述

ARM® mbed™ 使开发人员可以非常轻松地在其(嵌入式)产品中加入加密和 SSL/TLS 功能,并通过最大限度地减少代码占用空间来推动这一功能。它提供了具有直观的 API 和可读源代码的 SSL 库,并包含精心设计的测试套件。该工具即开即用,您可以在大部分系统上直接构建它,也可以手动选择和配置各项功能。

mbed TLS 库的设计是为了方便地与现有(嵌入式)应用集成,并提供安全通信,加密和密钥管理功能。 本教程将帮助您了解要执行此操作时要执行的步骤。

mbed TLS 库被设计为尽可能降低耦合,允许您只集成所需的部件,而不会产生其余部分的开销。 这也导致 mbed TLS 库的内存占用非常低并且构建足迹。通过消除系统中不需要的功能部分,您可以将构建尺寸从低至 45 kB 降低到更典型的 300 kB,从而实现更全面的设置。

mbed TLS 采用易于移植的 C 语言设计,以嵌入式环境为主要目标,可在ARM,AVR等嵌入式平台上运行,适用于PC,iPad,iPhone甚至XBox。 请告诉我们您在其他平台上的体验!

mbed TLS 库提供了一组可单独使用和编译的加密组件,您还可以使用单个配置头文件加入或排除这些组件。mbed TLS 还提供了构建于加密组件上的中央 SSL/TLS 模块,以及为 SSL 和 TLS 提供完整协议实施的抽象层和支持组件。

从功能角度来看,该库分为三个主要部分:

  • SSL/TLS 协议实施。
  • 一个加密库。
  • 一个 X.509 证书处理库。

SSL/TLS 客户端和服务器

mbed TLS 为当前所有的 SSL 和 TLS 标准提供客户端和服务器端支持,这些标准包括:SSL 3 版以及 TLS 1.0 版、1.1 版和 1.2 版。当然还支持大多数标准化协议扩展,如服务器名称指示 (SNI)、会话票证和安全重审。

mbed TLS 实现支持主要的密钥交换方式和 100 多种不同的标准化密码组。

加密库

mbed TLS 的加密部分拥有针对公钥加密、散列算法(消息摘要)和对称加密算法的抽象层。另外,它还包含多个基于标准的随机数发生器和一个熵池。

所有的加密算法都作为松散耦合的模块执行。您可以直接根据需要选取相应的头文件和源代码文件并将其放入项目中。

对称加密算法

密码抽象层提供了对称加密和解密功能,以实现保密性。它针对不同算法支持不同的块加密模式,从电子密码本 (ECB)、密码块链接 (CBC) 到计数器模式 (CTR)、密码反馈模式 (CFB) 和伽罗瓦计数器模式 (GCM)。

mbed TLS 不仅提供 AES、Blowfish 和 Camellia 等最常用的算法,还提供 DES 和 RC4 等老旧或已弃用的算法。

散列算法

mbed TLS 针对散列算法和消息摘要提供了消息摘要抽象层,可提供单向散列和散列消息认证码 (HMAC)。

mbed TLS 不仅为 SHA-256、SHA-512 和 RIPEMD-160 等最常用的算法提供支持,还支持 MD2、MD4、MD5 和 SHA-1 等老旧或已弃用的算法。

公钥

非对称算法可以搭配传统的 RSA 或椭圆曲线,您可以在此基础上使用公钥抽象层,以确保机密性、完整性、身份验证和不可抵赖性。

密钥交换支持可用于:

  • Diffie-Hellman-Merkle 密钥交换协议。
  • 椭圆曲线 Diffie-Hellman-Merkle (ECDH) 密钥交换协议。
  • 椭圆曲线数字签名算法 (ECDSA)。

随机数发生

针对随机数发生,mbed TLS 提供了熵池和适用于 CTR-DRBG 与 HMAC-DRBG 的特定实现(NIST 标准化随机数发生器)。熵池系统可从标准源和应用程序提供的源收集熵。

X.509 证书处理

SSL/TLS 身份验证和一些其他协议需要支持 X.509 证书处理。X.509 证书可以将身份传达给其他方,但在使用前必须由其他方进行有效性检查。

mbed TLS 包括以下支持:

  • X.509 证书 (CRT) 解析。
  • X.509 证书吊销列表 (CRL) 解析。
  • X.509 (RSA/ECDSA) 私钥解析。
  • X.509 证书验证:检查证书的签名链是否由受信任的证书颁发机构签发,以及该证书(或其签名链中的其中一个中间 CA 证书)是否位于其签发 CA 的证书吊销列表中。

另外,还可以执行某些证书颁发机构操作以从头创建证书,如:

  • X.509 证书 (CRT) 编写。
  • X.509 (RSA/ECDSA) 私钥编写。
  • X.509 证书请求 (CSR) 解析。
  • X.509 证书请求 (CSR) 编写。

测试

mbed TLS 采用持续集成系统以确保我们尽可能维持最高的代码质量。我们的系统借助一套不断增长的操作系统和芯片组来检查所有提交的代码,检查范围包括:

  • 回归测试。
  • 测试向量。
  • 多个静态分析器。
  • 互操作性测试。
  • 行为测试。
  • 通过模糊测试进行的安全性测试。
  • 针对已知值的函数和单元测试。
  • 代码覆盖率测试。
  • 验证测试。

mbed TLS

堆栈解释(Stack explanation)

本教程的目的是向您展示如何使用 mbed TLS 保护(加密)客户端和服务器之间的通信。 首先展示所涉及的主要组件。

在这里插入图片描述
从下往上:

  • 硬件(Hardware)
    硬件平台提供物理处理器,存储器,内存和网络接口

  • 操作系统(Operating System)
    操作系统提供以太网驱动程序和标准服务.这取决于操作系统,包括调度,线程安全,和一个完整的网络堆栈.

  • 网络堆栈(Network Stack)
    取决于操作系统,网络堆栈要么完全集成,要么是一个单独的模块,从网络接口提供抽象层.最常用的是 lwIP TCP/IP stackuIP TCP/IP stack.

  • mbed TLS SSL/TLS Library
    建立在网络接口之上, mbed tls 为安全通信提供了一个抽象层.

  • 客户端应用(Client Application)
    客户端应用程序使用mbed tls 本身抽象安全通信.

将mbed tls 集成到应用程序的确切步骤非常依赖与上面特定组件。在基本教程中,我们将假设一个集成了BSD-like TCP/IP 堆栈的操作系统。

SSL/TLS 说明

mbed tls 的 ssl/tls 部分提供了使用 ssl/tls 通过安全通信通道建立和通信方法.

  • 其基本规定是:
    • 初始化一个SSL/TLS context
    • 执行一个SSL/TLS握手(handshake)
    • 发送/接收数据
    • 通知对方一个连接正在关闭
  • 一个通道很多方面都是通过参数和回调函数来设置的.
    • 端点角色(endpoint role),客户端和服务器
    • 身份验证模式: 是否应该进行证书验证
    • 主机到主机通信通道: 发送和接收功能
    • 随机数生成器(RNG)功能
    • 用于加密/解密的密码
    • 证书验证功能
    • 会话控制: 会话获取和设置功能
    • 证书处理和密钥交换的X.509参数

mbed TLS可用于通过提供设置一个框架用来创建SSL/TLS服务器和客户端,并且通过SSL/TLS的通信信道进行通信。 SSL/TLS部分直接依赖于库的证书解析,对称和非对称加密以及散列模块。

示例客户端

因此,假设我们有一个简单的网络客户端,它尝试打开与 HTTP 服务器的连接并读取默认页面。 该应用程序可能看起来像这样:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <netdb.h>

#define SERVER_PORT 80
#define SERVER_NAME "localhost"
#define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"

int main( void )
{
   
    int ret, len, server_fd;
    unsigned char buf[1024];
    struct sockaddr_in server_addr;
    struct hostent *server_host;

    
### 解决 ESP-TLS-MBEDTLS 读取错误 `-0x7100` 的方案 当遇到 `esp-tls-mbedtls read error -0x7100` 错误时,这通常意味着存在网络连接问题或证书验证失败等问题。以下是详细的解决方案: #### 配置 TLS 参数 确保配置了正确的 TLS 参数,特别是服务器地址和端口设置应无误。所有符号需为英文字符[^2]。 ```c static const char *TAG = "mbedtls_example"; const char *host = "example.com"; // 替换成实际主机名 int port = 443; ``` #### 检查证书路径 确认客户端使用的 CA 证书路径正确,并且文件可访问。对于 ESP32-C3 设备而言,可以将证书存储在 flash 中并指定其位置[^3]。 ```c extern const uint8_t server_cert_pem_start[] asm("_binary_ca_cert_pem_start"); extern const uint8_t server_cert_pem_end[] asm("_binary_ca_cert_pem_end"); // 使用 mbedtls_x509_crt_parse 来解析 PEM 编码的证书 mbedtls_x509_crt cacert; mbedtls_x509_crt_init(&cacert); ret = mbedtls_x509_crt_parse(&cacert, server_cert_pem_start, server_cert_pem_end - server_cert_pem_start); if (ret != 0) { ESP_LOGE(TAG, "Failed to parse CA certificate: %d", ret); } ``` #### 调试日志级别调整 增加调试信息有助于定位具体原因。通过修改 esp-idf sdkconfig 文件中的选项来提高 MbedTLS 库的日志记录等级。 ```bash make menuconfig # 进入 'Component config' -> 'MbedTLS' # 将 Log level 设置为 DEBUG 或 VERBOSE ``` #### 测试网络连通性 利用 ping 命令测试目标服务器可达性和延迟情况,排除物理层面上可能存在的障碍。 ```python import network wlan = network.WLAN(network.STA_IF) print(wlan.ifconfig()) ping_result = wlan.ping(host) print(f"Ping result to {host}: ", ping_result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值