【嵌入式实战】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

相关文章

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel