【嵌入式实战】STM32+FreeRTOS+LWIP+WolfSSL 实现 HTTPS(超详细)

2023-12-23 18:50

本文主要是介绍【嵌入式实战】STM32+FreeRTOS+LWIP+WolfSSL 实现 HTTPS(超详细),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 原创声明
  • 前言
  • 一、HTTPS 工作流程简单介绍
  • 二、WolfSSL 简单介绍
    • 2.1 WolfSSL 是什么?
    • 2.2 获取官方 SDK
  • 三、STM32 Cube 配置
    • 3.1 Cube 配置
    • 3.2 修改 PHY 地址
  • 四、生成工程的简单测试
    • 4.1 手动修改 MAC 地址
    • 4.2 Ping 测试
  • 五、使用 Lwip + WolfSSL 实现 HTTPs
    • 5.1 引入库
    • 5.2 开启打印 Log 信息
    • 5.3 HTTPs 拉取 baidu.com
  • 总结
  • 授权须知


原创声明

本文为 HinGwenWoong 原创,如果这篇文章对您有帮助,欢迎转载,转载请阅读文末的【授权须知】,感谢您对 HinGwenWoong 文章的认可!


前言

如今的物联网时代,需要追求数据通信的安全性,传统的 HTTP 是明文传输,需要使用 HTTPS 的加密机制才能有效保证传输数据的安全性,WolfSSL 是一个轻量级的 SSL / TLS 库 ,能够很好的使用在嵌入式设备上面。

我是 HinGwenWoong ,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!


一、HTTPS 工作流程简单介绍

下图是一个简单版本的 https 通讯过程,这里不详细讲解了

客户端 服务器 ① Client Hello ② Server Hello ③ 公钥加密 ④ 对称密钥加密(对称密钥加密) ⑤ 请求内容(对称密钥加密) ⑥ 相应内容(对称密钥加密) 客户端 服务器

二、WolfSSL 简单介绍

2.1 WolfSSL 是什么?

WolfSSL 嵌入式 SSL库 是用 ANSI C 编写的轻量级 SSL / TLS 库,主要针对嵌入式,RTOS 和资源受限的环境——主要是因为其体积小,速度快和功能集丰富。由于其免版税定价和出色的跨平台支持,它也通常用于标准操作环境。wolfSSL支持高达当前 TLS 1.3 和 DTLS 1.2 级别的行业标准,比 OpenSSL 小多达20倍,并提供诸如 ChaCha20,Curve25519,NTRU 和 Blake2b 之类的渐进密码。在通过OpenSSL 使用 wolfSSL 时,用户基准测试和反馈报告可显着提高性能。

2.2 获取官方 SDK

WolfSSL官网

  • 点击【Download Now】
    在这里插入图片描述
  • 按步骤进行资料填写:
    在这里插入图片描述
  • 选择需要下载的版本,我这里选择了 4.4.0 版本
    在这里插入图片描述
  • 下拉到最后,点击 【Download】,会自动启动下载
    在这里插入图片描述

三、STM32 Cube 配置

3.1 Cube 配置

在这里插入图片描述
在这里插入图片描述

3.2 修改 PHY 地址

本项目使用的是 LAN8720 芯片,需要修改 PHY Address0
在这里插入图片描述


四、生成工程的简单测试

4.1 手动修改 MAC 地址

Cube 生成的 MAC 地址是固定的,防止和测试环境中的其他设备相撞,需要打开文件 ethernetif.c 手动修改 MAC 地址,我这里提取了 芯片ID作为MAC地址的最后几位,这里是 STM32F767 的芯片ID的地址 0x1FF0F420
在这里插入图片描述

uint32_t sn0 = *(uint32_t *)(0x1FF0F420);//STM32 cpu id
MACAddr[3] = (sn0 >> 16) & 0xFF;
MACAddr[4] = (sn0 >> 8) & 0xFFF;
MACAddr[5] = sn0 & 0xFF;

4.2 Ping 测试

编译 -> 烧录 到单片机里面,拿一条和 PC 在同一局域网内的网线,根据 MX_LWIP_Init()函数下面设置的 IP 测试 ping 功能,下面是成功的结果图:
在这里插入图片描述


五、使用 Lwip + WolfSSL 实现 HTTPs

5.1 引入库

  • ① 将官方的文件里面的下图标红文件移动到项目文件里面
    在这里插入图片描述

  • ② 放到工程文件下:在这里插入图片描述
  • ③ 把wolfcrpt/srcsrc文件夹里面的文件加入到keil工程中
    在这里插入图片描述
  • ④ 工程加入必备头文件
    在这里插入图片描述
  • ⑤ 打开 wolfssl\wolfcrypt\setting.h 文件,加入宏定义
#define WOLFSSL_USER_SETTINGS  //使用自定义配置
  • ⑥ 在 WolfSSL文件夹下加入一个文件 user_settings.h,下面是 STM32F7 的例子,请根据实际情况设置!!!
 /* Example wolfSSL user settings for STM32F7 with CubeMX */#ifndef WOLFSSL_USER_SETTINGS_H
#define WOLFSSL_USER_SETTINGS_H#ifdef __cplusplus
extern "C" {
#endif/* ------------------------------------------------------------------------- */
/* Platform */
/* ------------------------------------------------------------------------- */
#undef  WOLFSSL_GENERAL_ALIGNMENT
#define WOLFSSL_GENERAL_ALIGNMENT   4#undef  SINGLE_THREADED
#define SINGLE_THREADED#undef  WOLFSSL_SMALL_STACK
#define WOLFSSL_SMALL_STACK#undef  WOLFSSL_STM32F7
#define WOLFSSL_STM32F7#undef  WOLFSSL_STM32_CUBEMX
#define WOLFSSL_STM32_CUBEMX/* Optionally Disable Hardware Hashing Support */
#define NO_STM32_HASH
//#define NO_STM32_RNG
#define NO_STM32_CRYPTO#undef  FREERTOS
#define FREERTOS#undef  WOLFSSL_LWIP
#define WOLFSSL_LWIP//#define HAVE_LWIP_NATIVE/* ------------------------------------------------------------------------- */
/* Math Configuration */
/* ------------------------------------------------------------------------- */
#undef  USE_FAST_MATH
#define USE_FAST_MATH#ifdef USE_FAST_MATH#undef  TFM_TIMING_RESISTANT#define TFM_TIMING_RESISTANT#undef  TFM_NO_ASM//#define TFM_NO_ASM/* Optimizations (TFM_ARM, TFM_ASM or none) *///#define TFM_ASM
#endif/* ------------------------------------------------------------------------- */
/* Crypto */
/* ------------------------------------------------------------------------- */
/* ECC */
#if 1#undef  HAVE_ECC#define HAVE_ECC/* Manually define enabled curves */#undef  ECC_USER_CURVES#define ECC_USER_CURVES//#define HAVE_ECC192//#define HAVE_ECC224#undef NO_ECC256//#define HAVE_ECC384//#define HAVE_ECC521/* Fixed point cache (speeds repeated operations against same private key) */#undef  FP_ECC//#define FP_ECC#ifdef FP_ECC/* Bits / Entries */#undef  FP_ENTRIES#define FP_ENTRIES  2#undef  FP_LUT#define FP_LUT      4#endif/* Optional ECC calculation method *//* Note: doubles heap usage, but slightly faster */#undef  ECC_SHAMIR#define ECC_SHAMIR/* Reduces heap usage, but slower */#undef  ECC_TIMING_RESISTANT#define ECC_TIMING_RESISTANT#ifdef USE_FAST_MATH/* use reduced size math buffers for ecc points */#undef  ALT_ECC_SIZE#define ALT_ECC_SIZE/* optionally override the default max ecc bits *///#undef  FP_MAX_BITS_ECC//#define FP_MAX_BITS_ECC     512/* Enable TFM optimizations for ECC *///#define TFM_ECC192//#define TFM_ECC224//#define TFM_ECC256//#define TFM_ECC384//#define TFM_ECC521#endif
#endif/* RSA */
#undef NO_RSA
#if 1#ifdef USE_FAST_MATH/* Maximum math bits (Max RSA key bits * 2) */#undef  FP_MAX_BITS#define FP_MAX_BITS     4096#endif/* half as much memory but twice as slow */#undef  RSA_LOW_MEM//#define RSA_LOW_MEM/* Enables blinding mode, to prevent timing attacks */#undef  WC_RSA_BLINDING#define WC_RSA_BLINDING#else#define NO_RSA
#endif/* AES */
#undef NO_AES
#if 1#undef  HAVE_AESGCM#define HAVE_AESGCM#ifdef HAVE_AESGCM/* GCM with hardware acceleration requires AES counter/direct for unaligned sizes */#undef  WOLFSSL_AES_COUNTER#define WOLFSSL_AES_COUNTER#undef  WOLFSSL_AES_DIRECT#define WOLFSSL_AES_DIRECT#endif/* GCM Method: GCM_SMALL, GCM_WORD32 or GCM_TABLE */#undef  GCM_SMALL#define GCM_SMALL
#else#define NO_AES
#endif/* ChaCha20 / Poly1305 */
#undef HAVE_CHACHA
#undef HAVE_POLY1305
#if 0#define HAVE_CHACHA#define HAVE_POLY1305/* Needed for Poly1305 */#undef  HAVE_ONE_TIME_AUTH#define HAVE_ONE_TIME_AUTH
#endif/* Ed25519 / Curve25519 */
#undef HAVE_CURVE25519
#undef HAVE_ED25519
#if 0#define HAVE_CURVE25519#define HAVE_ED25519/* Optionally use small math (less flash usage, but much slower) */#if 0#define CURVED25519_SMALL#endif
#endif/* ------------------------------------------------------------------------- */
/* Hashing */
/* ------------------------------------------------------------------------- */
/* Sha */
#undef NO_SHA
#if 1/* 1k smaller, but 25% slower *///#define USE_SLOW_SHA
#else#define NO_SHA
#endif/* Sha256 */
#undef NO_SHA256
#if 1#if 1#define WOLFSSL_SHA224#endif
#else#define NO_SHA256
#endif/* Sha512 */
#undef WOLFSSL_SHA512
#if 1#define WOLFSSL_SHA512/* Sha384 */#undef  WOLFSSL_SHA384#if 1#define WOLFSSL_SHA384#endif/* over twice as small, but 50% slower *///#define USE_SLOW_SHA2
#endif/* MD5 */
// #undef  NO_MD5
// #if 1
//    /* enabled */
// #else
//    #define NO_MD5
// #endif/* ------------------------------------------------------------------------- */
/* HW Crypto Acceleration */
/* ------------------------------------------------------------------------- */
// See settings.h STM32F4 section/* ------------------------------------------------------------------------- */
/* Benchmark / Test */
/* ------------------------------------------------------------------------- */
/* Use reduced benchmark / test sizes */
//#undef  BENCH_EMBEDDED
//#define BENCH_EMBEDDED//#undef  USE_CERT_BUFFERS_2048
//#define USE_CERT_BUFFERS_2048//#undef  USE_CERT_BUFFERS_256
//#define USE_CERT_BUFFERS_256/* ------------------------------------------------------------------------- */
/* Debugging */
/* ------------------------------------------------------------------------- */
#undef  WOLFSSL_DEBUG
#define WOLFSSL_DEBUG#ifdef WOLFSSL_DEBUG/* Use this to measure / print heap usage */#if 0#undef  USE_WOLFSSL_MEMORY#define USE_WOLFSSL_MEMORY#undef  WOLFSSL_TRACK_MEMORY#define WOLFSSL_TRACK_MEMORY#endif
#else
//    #undef  NO_WOLFSSL_MEMORY
//    #define NO_WOLFSSL_MEMORY#undef  NO_ERROR_STRINGS//#define NO_ERROR_STRINGS
#endif#ifdef DEBUG_WOLFSSL#undef  WOLFSSL_DEBUG_ERRORS_ONLY#include "dbg_tools.h"#define WOLFSSL_USER_LOG(x)	do { DbgPrint(x); DbgPrint("\n"); } while(0);
#endif/* ------------------------------------------------------------------------- */
/* Port */
/* ------------------------------------------------------------------------- *//* Override Current Time */
/* Allows custom "custom_time()" function to be used for benchmark */
#define WOLFSSL_USER_CURRTIME/* ------------------------------------------------------------------------- */
/* RNG */
/* ------------------------------------------------------------------------- */
/* Size of returned HW RNG value */
#define CUSTOM_RAND_TYPE      unsigned int#define NO_OLD_RNGNAME/* Choose RNG method */
#if 1/* Use built-in P-RNG (SHA256 based) with HW RNG *//* P-RNG + HW RNG (P-RNG is ~8K) */#undef  HAVE_HASHDRBG#define HAVE_HASHDRBG#if 0extern unsigned int custom_rand_generate(void);#undef  CUSTOM_RAND_GENERATE#define CUSTOM_RAND_GENERATE  custom_rand_generate#endif
#else/* Bypass P-RNG and use only HW RNG */extern int custom_rand_generate_block(unsigned char* output, unsigned int sz);#undef  CUSTOM_RAND_GENERATE_BLOCK#define CUSTOM_RAND_GENERATE_BLOCK  custom_rand_generate_block
#endif/* ------------------------------------------------------------------------- */
/* Enable Features */
/* ------------------------------------------------------------------------- */
#undef  KEEP_PEER_CERT
//#define KEEP_PEER_CERT#undef  HAVE_COMP_KEY
//#define HAVE_COMP_KEY#undef  HAVE_TLS_EXTENSIONS
#define HAVE_TLS_EXTENSIONS#undef  HAVE_SUPPORTED_CURVES
#define HAVE_SUPPORTED_CURVES#undef  WOLFSSL_BASE64_ENCODE
#define WOLFSSL_BASE64_ENCODE/* TLS Session Cache */
#if 0#define SMALL_SESSION_CACHE
#else#define NO_SESSION_CACHE
#endif#undef  USER_TIME
#define USER_TIME   //需要在应用层定义自己的 time_t XTIME(time_t * timer) 函数,直接定义即可/* ------------------------------------------------------------------------- */
/* Disable Features */
/* ------------------------------------------------------------------------- */
//#undef  NO_WOLFSSL_SERVER
#define NO_WOLFSSL_SERVER//#undef  NO_WOLFSSL_CLIENT
#define NO_WOLFSSL_CLIENT//#undef  NO_CRYPT_TEST
#define NO_CRYPT_TEST//#undef  NO_CRYPT_BENCHMARK
#define NO_CRYPT_BENCHMARK///* In-lining of misc.c functions */
///* If defined, must include wolfcrypt/src/misc.c in build */
///* Slower, but about 1k smaller */
//#undef  NO_INLINE
#define NO_INLINE//#undef  NO_FILESYSTEM
//#define NO_FILESYSTEM//#undef  NO_WRITEV
//#define NO_WRITEV//#undef  NO_MAIN_DRIVER
//#define NO_MAIN_DRIVER#undef  NO_DEV_RANDOM
#define NO_DEV_RANDOM//#undef  NO_DSA
//#define NO_DSA//#undef  NO_DH
//#define NO_DH//#undef  NO_DES3
//#define NO_DES3//#undef  NO_RC4
//#define NO_RC4//#undef  NO_OLD_TLS
//#define NO_OLD_TLS//#undef  NO_HC128
//#define NO_HC128//#undef  NO_RABBIT
//#define NO_RABBIT//#undef  NO_PSK
//#define NO_PSK//#undef  NO_MD4
//#define NO_MD4//#undef  NO_PWDBASED
//#define NO_PWDBASED#ifdef __cplusplus
}
#endif#endif /* WOLFSSL_USER_SETTINGS_H */
  • ⑦ 在应用代码里面加入 wolfssl 获取时间戳的函数,这里使用的是 SNTP 获取网络时间存入 RTC,然后使用接口从 RTC 获取时间,关于如何使用 LWIP+SNTP 获取实时网络时间请看我这篇教程: 【嵌入式实战】STM32+Lwip 实现 SNTP 网络授时(超详细)
/* wolfssl includes. */
#include <wolfssl/ssl.h>
#include <wolfssl/internal.h>/*!
* @brief 重写 wolfssl 的时间获取函数
*        执行条件:无
*
* @retval: 返回时间戳
*/
time_t XTIME(time_t * timer)
{time_t timestamp = get_timestamp(); // 没有实现 SNTP 的话,先使用网上获取的最新时间的时间戳,例如:1595836376return timestamp;
}

5.2 开启打印 Log 信息

user_setting.h 中定义宏定义

//开启 wolfssl 的log输出
#define DEBUG_WOLFSSL
#ifdef DEBUG_WOLFSSL#undef  WOLFSSL_DEBUG_ERRORS_ONLY#include "bsp_printlog.h"#define WOLFSSL_USER_LOG(x)	do { print_log(x); print_log("\n"); } while(0);  //需要自己实现 print_log 函数
#endif

在 WlofSSL程序开始之前,加入函数接口

wolfSSL_Debugging_ON();

5.3 HTTPs 拉取 baidu.com

  • ① 获取网站的 HTTPSpem 证书
    在这里插入图片描述
  • ② 将板子插上网线,编译,烧录,连接 RTT ,可以看到打印信息
    在这里插入图片描述
  • ③ 这里作为演示项目,使用 Debug 模式,打上断点,可以看到拉取成功!!!
    在这里插入图片描述

总结

以上是 STM32+FreeRTOS+LWIP+WolfSSL 实现 HTTPS 的全部内容。项目文件已经上传到 GitHub :STM32_HTTPs_WolfSSL ,项目除了上述内容外,另外还实现了 DHCP、SNTP、netbios 功能 ,如果有帮助请大家帮忙点个 star ✨✨✨ ,谢谢!!!


更多阅读推荐
  • 【嵌入式实战】STM32+Lwip 实现 DHCP+HostName(超详细) : 在 DHCP 的基础上 Ping 域名的方式获取 DHCP 的 IP
  • 【嵌入式实战】STM32+Lwip 实现 SNTP 网络授时(超详细)
  • 【嵌入式小技巧】stm32 实现 Segger RTT 打印(超详细)

我是 HinGwenWoong ,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!


授权须知

  1. 原创文章在推送两天后才可进行转载
  2. 转载文章,禁止声明原创
  3. 不允许直接二次转载,转载请根据原文链接联系作者
  4. 若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
    但对于未注明转载来源/原文链接的文章,我将保留追述的权利。

作者:HinGwenWoong
一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,共同进步!
CSDN: HinGwenWoong
原文链接:【嵌入式实战】STM32+FreeRTOS+LWIP+WolfSSL 实现 HTTPS(超详细)

  1. 若需要修改文章的排版,请根据原文链接联系作者
  2. 再次感谢您的认可,转载请遵守如上转载须知!

这篇关于【嵌入式实战】STM32+FreeRTOS+LWIP+WolfSSL 实现 HTTPS(超详细)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/529097

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount