当前位置: 首页 > news >正文

mbedtls(not finished)

mbedtls

mbedTLS 建立安全通信连接需要经过以下几个步骤:

  • 初始化 SSL/TLS 上下文
  • 建立 SSL/TLS 握手
  • 发送、接收数据
  • 交互完成,关闭连接

其中,最关键的步骤就是 SSL/TLS 握手 连接的建立,这里需要进行证书校验。

#define SERVER_HOST "example.com"  // 目标服务器
#define SERVER_PORT "443"          // HTTPS 端口
int ret;mbedtls_net_context server_fd;mbedtls_entropy_context entropy;mbedtls_ctr_drbg_context ctr_drbg;mbedtls_ssl_context ssl;mbedtls_ssl_config conf;mbedtls_x509_crt cacert;// 初始化 mbedTLS 组件mbedtls_net_init(&server_fd);mbedtls_ssl_init(&ssl);mbedtls_ssl_config_init(&conf);mbedtls_x509_crt_init(&cacert);mbedtls_ctr_drbg_init(&ctr_drbg);mbedtls_entropy_init(&entropy);// 1. 设置随机数生成器// &ctr_drbg  &entropyif ((ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, nullptr, 0)) != 0) {std::cerr << "mbedtls_ctr_drbg_seed failed: " << ret << std::endl;return -1;}// 2. 加载 CA 证书//&cacertret = mbedtls_x509_crt_parse_file(&cacert, "ca_cert.pem");if (ret < 0) {std::cerr << "Failed to load CA certificate: " << ret << std::endl;return -1;}// 3. 连接服务器 只是初始化tcp连接,还没有进行握手捏std::cout << "Connecting to " << SERVER_HOST << ":" << SERVER_PORT << "..." << std::endl;if ((ret = mbedtls_net_connect(&server_fd, SERVER_HOST, SERVER_PORT, MBEDTLS_NET_PROTO_TCP)) != 0) {std::cerr << "Connection failed: " << ret << std::endl;return -1;}// 4. 配置 SSL// mbedtls_ssl_config_defaults(&conf, //                          MBEDTLS_SSL_IS_CLIENT,   // 1. 角色//                          MBEDTLS_SSL_TRANSPORT_STREAM, // 2. 传输类型//                          MBEDTLS_SSL_PRESET_DEFAULT);  // 3. 预设配置if ((ret = mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {std::cerr << "SSL config failed: " << ret << std::endl;return -1;}// &conf   mbedtls_ssl_conf_authmode() 设置证书验证模式 mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_REQUIRED);  // 必须验证证书//mbedtls_ssl_conf_rng() 绑定随机数生成器mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);// mbedtls_ssl_conf_ca_chain() 绑定 CA 证书mbedtls_ssl_conf_ca_chain(&conf, &cacert, nullptr);// 5. 绑定 SSL 到连接// 把conf绑定到ssl中mbedtls_ssl_setup(&ssl, &conf);// 开始握手,使用ssl和server_fdmbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, nullptr);// 6. SSL/TLS 握手std::cout << "Performing SSL/TLS handshake..." << std::endl;while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) {if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {std::cerr << "Handshake failed: " << ret << std::endl;return -1;}// 7. 验证服务器证书if ((ret = mbedtls_ssl_get_verify_result(&ssl)) != 0) {std::cerr << "Certificate verification failed!" << std::endl;return -1;}std::cout << "Certificate verification successful!" << std::endl;// 8. 发送 HTTP 请求const char *http_request = "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n";ret = mbedtls_ssl_write(&ssl, (const unsigned char *)http_request, strlen(http_request));if (ret < 0) {std::cerr << "Failed to send data: " << ret << std::endl;return -1;}// 9. 读取服务器响应char buffer[4096];memset(buffer, 0, sizeof(buffer));ret = mbedtls_ssl_read(&ssl, (unsigned char *)buffer, sizeof(buffer) - 1);if (ret < 0) {std::cerr << "Failed to receive data: " << ret << std::endl;return -1;}std::cout << "Server response:\n" << buffer << std::endl;// 10. 关闭连接mbedtls_ssl_close_notify(&ssl);mbedtls_net_free(&server_fd);mbedtls_ssl_free(&ssl);mbedtls_ssl_config_free(&conf);mbedtls_x509_crt_free(&cacert);mbedtls_ctr_drbg_free(&ctr_drbg);mbedtls_entropy_free(&entropy);return 0;
}

嵌入式设备的资源限制(如 RAM、Flash、CPU 性能)通常要求精简 mbedTLS。以下是常见的修改方向:

  1. 禁用不必要的加密算法

禁用 RSA(如果只用 ECC)

  1. 减少协议版本支持

默认支持 TLS 1.0、1.1、1.2、1.3,但嵌入式设备可能只用特定版本。

  1. 内存优化

调整缓冲区大小:如 #define MBEDTLS_SSL_MAX_CONTENT_LEN(默认 16KB,可减到 4KB 或更小,视应用需求)。禁用动态内存分配:启用 #define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS 和 #define MBEDTLS_PLATFORM_MEMORY,使用自定义内存分配函数。

  • 调整缓冲区大小:如 #define MBEDTLS_SSL_MAX_CONTENT_LEN(默认 16KB,可减到 4KB 或更小,视应用需求)。
  • 禁用动态内存分配:启用 #define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS 和 #define MBEDTLS_PLATFORM_MEMORY,使用自定义内存分配函数。
  1. 调试与日志

https的修改:

定义MBEDTLS_PLATFORM_MEMORY,采用动态自定义的PLATFORM

启用 MBEDTLS_PLATFORM_MEMORY 并定义宏

  • 宏定义
    • MBEDTLS_PLATFORM_CALLOC_MACRO:指定自定义的 calloc 函数。
    • MBEDTLS_PLATFORM_FREE_MACRO:指定自定义的 free 函数。
  • 效果
    在编译时静态绑定你的自定义内存分配函数,而不是在运行时设置。

仅启用 MBEDTLS_PLATFORM_MEMORY(不定义宏)

  • 效果
    mbedTLS 会提供一个运行时接口 mbedtls_platform_set_calloc_free(),让你在程序运行时动态设置自定义的 calloc() 和 free() 函数指针。
  • 使用场景
    如果你的系统需要在运行时根据条件选择不同的内存分配策略(例如在不同硬件或模式下切换内存池),这种方式很合适。
http://www.dtcms.com/a/503651.html

相关文章:

  • 算法之贪心(简)
  • Linux小课堂: 软件安装机制深度解析之以 CentOS 为例的 RPM 包管理与 YUM 工具详解
  • Spring Boot 3零基础教程,WEB 开发 请求路径匹配规则 笔记32
  • 深入理解HTML文本标签:构建网页内容的基础
  • WebP、J2k、Ico、Gif、Cur、Png图片批量转换软件
  • 手机wap网站 源码网站开发报价 福州
  • 网站建设营销推广优秀网站建设模板
  • 【计算机算法与分析】基于比较的排序算法
  • 排序算法(1)--- 插入排序
  • css总结
  • WPS Office 11.8.2.12085 Portable_Win中文_办公软件_便携版安装教程
  • 广州网站建设 易企建站公司网页制作软件序列号
  • 斯坦福大学 | CS336 | 从零开始构建语言模型 | Spring 2025 | 笔记 | Lecture 5: GPUs
  • 做淘宝需要的网站手机网站建设平台
  • 密码学和分布式账本
  • Web后端登录认证(会话技术)
  • 网络安全 | SSL/TLS 证书文件格式详解:PEM、CRT、CER、DER、PKI、PKCS12
  • uploads-labs靶场通关(2)
  • wordpress 企业建站小程序模板源码免费
  • Linux中页表缓存初始化pgtable_cache_init函数的实现
  • 量子计算机会普及个人使用吗?
  • 嵌入式入门:APP+BSP+HAL 三层分级架构浅析
  • 使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 19--测试框架Pytest基础 3--前后置操作应用
  • 面试面试面试
  • 北京响应式的网站下载了模板如何做网站
  • 中山企业营销型网站制作wordpress亲你迷路了
  • 个人做电影网站有什么风险南山最专业的网站建设
  • 「用Python来学微积分」4. 极坐标方程与参数方程
  • 第六章 路由基础
  • P1049 装箱问题 题解(四种方法)附DP和DFS的对比