最完整mbedtls入门指南:从安装到实现第一个TLS连接

最完整mbedtls入门指南:从安装到实现第一个TLS连接

【免费下载链接】mbedtls An open source, portable, easy to use, readable and flexible TLS library, and reference implementation of the PSA Cryptography API. Releases are on a varying cadence, typically around 3 - 6 months between releases. ​编辑 项目地址: https://gitcode.com/GitHub_Trending/mb/mbedtls

你还在为嵌入式设备寻找轻量级TLS解决方案吗?mbedtls以其仅120KB的代码 footprint和跨平台特性,成为物联网安全通信的首选库。本文将带你从环境搭建到实现完整TLS客户端,掌握嵌入式安全通信核心技能。读完你将获得:

  • 3分钟完成mbedtls编译安装
  • 理解TLS连接的7个核心步骤
  • 调试并验证加密通信的实用技巧
  • 优化嵌入式环境配置的专业方法

关于mbedtls

mbedtls是一个开源、可移植、易于使用的TLS库,特别适合嵌入式系统。它实现了X.509证书操作和TLS/DTLS协议,同时提供PSA Cryptography API的参考实现。项目结构清晰,主要包含:

  • 核心库library/目录下的加密算法实现
  • 头文件include/mbedtls/提供的API接口
  • 示例程序programs/包含各类功能演示代码
  • 测试套件tests/确保库功能正确性

完整项目文档可参考README.md,配置选项详细说明见include/mbedtls/mbedtls_config.h

环境准备与安装

系统要求

mbedtls对开发环境要求极低,只需:

  • CMake 3.20.2+
  • C99兼容编译器(GCC 5.4+或Clang 3.8+)
  • Python 3.8+(用于生成测试代码)
快速安装步骤
 
  1. # 1. 克隆仓库

  2. git clone https://gitcode.com/GitHub_Trending/mb/mbedtls

  3. cd mbedtls

  4. # 2. 初始化子模块

  5. git submodule update --init --recursive

  6. # 3. 生成构建文件

  7. mkdir build && cd build

  8. cmake ..

  9. # 4. 编译库文件

  10. cmake --build . -j4

  11. # 5. 安装到系统(可选)

  12. sudo make install

bash

编译配置选项

mbedtls提供灵活的构建选项,常用配置:

选项说明
-DUSE_SHARED_MBEDTLS_LIBRARY=On构建共享库
-DCMAKE_BUILD_TYPE=Debug调试模式构建
-DENABLE_TESTING=Off禁用测试套件
-DMBEDTLS_BUILD_DEPS=Off不构建依赖项

完整选项列表可通过cmake -LH查看。

TLS客户端实现详解

核心代码结构

mbedtls实现TLS客户端包含7个关键步骤,对应programs/ssl/ssl_client1.c中的核心逻辑:

完整实现代码
 
  1. #include "mbedtls/net_sockets.h"

  2. #include "mbedtls/ssl.h"

  3. #include "mbedtls/entropy.h"

  4. #include "mbedtls/ctr_drbg.h"

  5. #include "mbedtls/x509_crt.h"

  6. #define SERVER_PORT "4433"

  7. #define SERVER_NAME "localhost"

  8. #define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"

  9. int main(void) {

  10. int ret;

  11. mbedtls_net_context server_fd;

  12. mbedtls_entropy_context entropy;

  13. mbedtls_ctr_drbg_context ctr_drbg;

  14. mbedtls_ssl_context ssl;

  15. mbedtls_ssl_config conf;

  16. mbedtls_x509_crt cacert;

  17. const char *pers = "ssl_client";

  18. // 1. 初始化所有上下文

  19. mbedtls_net_init(&server_fd);

  20. mbedtls_ssl_init(&ssl);

  21. mbedtls_ssl_config_init(&conf);

  22. mbedtls_x509_crt_init(&cacert);

  23. mbedtls_ctr_drbg_init(&ctr_drbg);

  24. mbedtls_entropy_init(&entropy);

  25. // 2. 初始化随机数生成器

  26. ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,

  27. (const unsigned char *)pers, strlen(pers));

  28. // 3. 加载CA证书

  29. ret = mbedtls_x509_crt_parse_file(&cacert, "ca-cert.pem");

  30. // 4. 创建TCP连接

  31. ret = mbedtls_net_connect(&server_fd, SERVER_NAME, SERVER_PORT, MBEDTLS_NET_PROTO_TCP);

  32. // 5. 配置SSL

  33. mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT,

  34. MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT);

  35. mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_REQUIRED);

  36. mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL);

  37. mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);

  38. mbedtls_ssl_setup(&ssl, &conf);

  39. mbedtls_ssl_set_hostname(&ssl, SERVER_NAME);

  40. mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);

  41. // 6. TLS握手

  42. while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) {

  43. if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {

  44. // 处理错误

  45. goto exit;

  46. }

  47. }

  48. // 7. 验证服务器证书

  49. if ((ret = mbedtls_ssl_get_verify_result(&ssl)) != 0) {

  50. // 证书验证失败处理

  51. }

  52. // 8. 发送HTTP请求

  53. ret = mbedtls_ssl_write(&ssl, (const unsigned char *)GET_REQUEST, strlen(GET_REQUEST));

  54. // 9. 接收响应

  55. unsigned char buf[1024];

  56. ret = mbedtls_ssl_read(&ssl, buf, sizeof(buf)-1);

  57. // 10. 关闭连接

  58. mbedtls_ssl_close_notify(&ssl);

  59. exit:

  60. // 释放所有资源

  61. mbedtls_net_free(&server_fd);

  62. mbedtls_x509_crt_free(&cacert);

  63. mbedtls_ssl_free(&ssl);

  64. mbedtls_ssl_config_free(&conf);

  65. mbedtls_ctr_drbg_free(&ctr_drbg);

  66. mbedtls_entropy_free(&entropy);

  67. return ret;

  68. }

c运行

测试与调试

构建测试程序

使用以下命令编译客户端示例:

gcc -o tls_client tls_client.c -lmbedtls -lmbedx509 -lmbedcrypto

bash

配置调试环境

开启详细调试输出,在SSL配置中添加:

 
  1. mbedtls_debug_set_threshold(3);

  2. mbedtls_ssl_conf_dbg(&conf, my_debug, stdout);

c运行

其中my_debug函数实现:

 
  1. static void my_debug(void *ctx, int level, const char *file, int line, const char *str) {

  2. mbedtls_fprintf((FILE *)ctx, "%s:%04d: %s", file, line, str);

  3. }

c运行

常见问题排查
错误代码可能原因解决方案
-0x2700证书验证失败检查系统时间或使用MBEDTLS_SSL_VERIFY_OPTIONAL
-0x6980握手协商失败确认服务器端口和协议版本匹配
-0x7780随机数生成失败确保熵源正确初始化

嵌入式环境优化

配置文件定制

通过修改mbedtls_config.h裁剪功能,减少资源占用:

 
  1. // 仅保留TLS 1.2支持

  2. #define MBEDTLS_SSL_PROTO_TLS1_2

  3. // 禁用不需要的加密算法

  4. #undef MBEDTLS_RSA_C

  5. #define MBEDTLS_ECP_C

  6. #define MBEDTLS_ECDH_C

  7. // 减小缓冲区大小

  8. #define MBEDTLS_SSL_MAX_CONTENT_LEN 1024

c运行

内存优化技巧
  1. 使用静态内存分配替代动态分配:
 
  1. #define MBEDTLS_MEMORY_BUFFER_ALLOC_C

  2. #define MBEDTLS_MEMORY_BUFFER_ALLOC_MAX_SIZE 16384

c运行

  1. 优化证书存储:
 
  1. // 使用DER格式证书减少解析时间

  2. mbedtls_x509_crt_parse(&cacert, (const unsigned char *)ca_cert_der, ca_cert_der_len);

c运行

扩展学习资源

  • 官方文档docs/目录包含完整API文档和使用指南
  • 示例程序programs/ssl/提供更多TLS客户端/服务器实现
  • 测试套件tests/suites/包含各类加密算法测试用例
  • 配置工具:使用scripts/config.py生成定制配置

总结

mbedtls为嵌入式设备提供了安全可靠的TLS解决方案。通过本文学习,你已掌握从库编译到实现加密通信的全流程。关键要点:

  1. 始终验证服务器证书(生产环境中禁用VERIFY_OPTIONAL)
  2. 正确管理随机数生成器确保安全性
  3. 根据目标设备资源情况优化配置
  4. 使用调试功能快速定位连接问题

下一步建议深入学习:

  • DTLS协议在UDP通信中的应用
  • 证书链构建与OCSP stapling
  • PSA Crypto API的安全密钥管理

点赞收藏本文,关注获取更多嵌入式安全实践指南!下期将介绍mbedtls在STM32平台的硬件加速实现

最完整mbedtls入门指南:从安装到实现第一个TLS连接-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值