2.26.0版本,开源仓库地址为:https://github.com/ARMmbed/mbedtls MbedTLS库提供了TLS/DTLS协议的实现,有了MbedTLS库之后意味着: TCP + TLS ubuntu安装MbedTLS库 下载源码 直接从github下载最新的MbedTLS源代码:https://github.com/ARMmbed/mbedtls git clone https://github.com /ARMmbed/mbedtls.git 构建及安装MbedTLS库 MbedTLS库提供了两种构建方式:make和cmake。 ,该点表示当前目录 rice@rice:~/mbedtls_study/mbedtls$ cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On . rice@rice:~/mbedtls_study /mbedtls$ make rice@rice:~/mbedtls_study/mbedtls$ sudo make install 在概述中,我们提到MbedTLS是可以裁剪的(注:在这个实验中,
一、mbedtls 开源库 1. mbedtls是什么 Mbed TLS是一个开源、可移植、易于使用、代码可读性高的SSL库。 上发布的最新版本为 2.24.0 版本,开源仓库地址为: “https://github.com/ARMmbed/mbedtls ” 2. mbedtls有何用 mbedtls库提供了 TLS / DTLS 开启mbedtls库 在Middleware下开启mbedtls库支持: ? 4. 配置mbedtls mebdtls库提供的算法非常多,全都通过宏定义来配置。 ① 特性配置:保持默认即可。 ? _context sha1_ctx; mbedtls_sha1_init(&sha1_ctx); mbedtls_sha1_starts(&sha1_ctx); mbedtls_sha1_update( 复制mbedtls相关文件 ① 从mbedtls库中复制mbedtls源码文件到工程中: ? ② 再复制mbedtls示例配置文件: ? 2.
MBEDTLS_FOLDER_INCLUDE}") set(MBEDTLS_FOLDER_INCLUDE "$ENV{MBEDTLS_FOLDER_INCLUDE}") endif() if(" $ENV{MBEDTLS_FOLDER_LIBRARY}") set(MBEDTLS_FOLDER_LIBRARY "$ENV{MBEDTLS_FOLDER_LIBRARY}") endif() CMake变量MBEDTLS_FOLDER_INCLUDE和MBEDTLS_FOLDER_LIBRARY分别用于存放mbedTLS的头文件和库文件。 /mbedtls/include") endif() if("$ENV{MBEDTLS_FOLDER_LIBRARY}") set(MBEDTLS_FOLDER_LIBRARY "$ENV{MBEDTLS_FOLDER_LIBRARY /mbedtls/include -DMBEDTLS_FOLDER_LIBRARY=/home/wh/work/opcua/encryption_mbedtls/mbedtls/library ..
由于老版本的mbedtls对于一些ssl 的服务器是连接不上的, 所以需要替换最新的版本 下面是记录替换过程 https://github.com/Mbed-TLS/mbedtls 下载最新版的mbedtls 源码, 然后把下面两个文件拷贝到原先的工程里面,替换掉原先的文件 发现不能这样子, 需要先把原先的删除 再拷贝过去 然后再建一个Mbedtls 分组 把 Library 里面的文件全部添加到里面 把下面的改下 mbedtls_config 把mbedtls_config里面所有的#define全部屏蔽 咱以后用到什么功能再打开什么功能.
关于mbedtls mbedtls 是一个加密库,比较常用的有sha,md5,SSL 在网络通信中使用此库让单片机可以进行SSL加密通信 移植方式 该节提供了两种方式移植 1.下载好Mbedtls包,然后手动移植到工程 2.在工程里面增加一个Mbedtls文件夹 ? 3.把Mbedtls源码里面的 include 和 Library 复制到Mbedtls文件夹里面 ? 软件在线安装Mbedtls 1.打开keil工程 点击扩展包,找到 mbedTLS 点击安装 ? ? 2.安装完成 ? ? 3.引入包 ? 4.其实就是 把 MBEDTLS_CONFIG_FILE 定义为 "mbedTLS_config.h" ? 8.测试SHA1加密 1.在 mbedTLS_config.h 里面打开 MBEDTLS_SHA1_C ? 2.对yang字符串进行SHA1加密 ? ? ?
/net.h" #include "mbedtls/ssl.h" #include "mbedtls/entropy.h" #include "mbedtls/ctr_drbg.h" #include "mbedtls/debug.h" mbed TLS结构的创建和初始化如下所示: mbedtls_net_context server_fd; mbedtls_entropy_context entropy ; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_net_init ( &server_fd ); mbedtls_ssl_init( &ssl ); mbedtls_ssl_config_init( &conf ); mbedtls_x509_crt_init( &cacert . mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL ); 读写数据 配置好SSL/TLS
, hash, 0); // 初始化RSA上下文 mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, 0); // 导入公钥 MBEDTLS_MD_SHA256, 32, hash, signature); mbedtls_rsa_free(&rsa 在嵌入式Linux系统上,我们可以使用OpenSSL或mbedTLS库来实现TLS通信:#include "mbedtls/net_sockets.h"#include "mbedtls/ssl.h"mbedtls_net_context ); mbedtls_ssl_init(&ssl); mbedtls_ssl_config_init(&conf); // 连接服务器 ret = mbedtls_net_connect (&conf, MBEDTLS_SSL_VERIFY_REQUIRED); mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL); mbedtls_ssl_conf_rng
说明 在网络通信中,如果不加上SSL,那么信息就以明文的方式暴露在网络通信中 这节移植上mbedtls库,让设备以SSL方式连接MQTT服务器. 首先简单说明一下SSL, 实际上呢整个的就是TCP和服务器通信, 只不过TCP连接上服务器之后先和服务器协商好加密方式和加密密码, 当然协商什么的mbedtls库自己就完成了, 然后咱调用其接口发送和接收数据就可以了 ; 其实通信是下面的样子: 发送的数据 ----> 经过mbedtls库加密 ---> 通过模组使用TCP发送给服务器 服务器下发的TCP数据 ---> 经过mbedtls库解密 ---> 获得真实数据 2.先说几个自己需要实现的函数,mbedtls底层会调用这些函数 随机数函数和返回时间戳函数(不验证证书时间的话用不到) 网络接收处理函数(mbedtls底层会自动调用这个函数) SSL的底层获取数据的方式是指明需要多少个数据 mbedtls提供的函数, 内部会把咱的数据加密以后再通过TCP发送出去; 同理TCP接收的数据咱也需要使用mbedtls提供的函数里面获取数据; 4.
移植指导OpenHarmony提供了mbedtls的开源三方库,路径为“//third_party/mbedtls”。 此库中提供了“mbedtls_platform_entropy_poll”、“mbedtls_hardclock_poll”、“mbedtls_havege_poll”、“mbedtls_hardware_poll defined(MBEDTLS_NO_PLATFORM_ENTROPY) mbedtls_entropy_add_source( ctx, mbedtls_platform_entropy_poll #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) mbedtls_entropy_add_source( ctx, mbedtls_hardware_poll #endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */ }适配硬件随机数接口接口定义如下:路径:“third_party/mbedtls/include/mbedtls
说明 在网络通信中,如果不加上SSL,那么信息就以明文的方式暴露在网络通信中 这节移植上mbedtls库,让设备以SSL方式连接MQTT服务器. ; 其实通信是下面的样子: 发送的数据 ----> 经过mbedtls库加密 ---> 通过模组使用TCP发送给服务器 服务器下发的TCP数据 ---> 经过mbedtls库解密 ---> 获得真实数据 测试 1.打开本节代码 2.默认连接本人的服务器测试(服务器端口为8883) 4.观察日志打印口(日志都是加密的数据,就大体说一下) 程序说明 1,为便于使用mbedtls的SSL功能,我封装了下 2.先说几个自己需要实现的函数,mbedtls底层会调用这些函数 随机数函数和返回时间戳函数(不验证证书时间的话用不到) 网络接收处理函数(mbedtls底层会自动调用这个函数) SSL的底层获取数据的方式是指明需要多少个数据 mbedtls提供的函数, 内部会把咱的数据加密以后再通过TCP发送出去; 同理TCP接收的数据咱也需要使用mbedtls提供的函数里面获取数据; 4.
下面是一个使用mbedTLS库进行ECC签名验证的示例:#include "mbedtls/ecdsa.h"#include "mbedtls/entropy.h"#include "mbedtls/ctr_drbg.h // 初始化 mbedtls_ecdsa_init(&ctx); mbedtls_entropy_init(&entropy); mbedtls_ctr_drbg_init(&ctr_drbg *md_info; md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256); return mbedtls_hkdf( 下面是一个简单的TLS客户端示例:#include "mbedtls/net_sockets.h"#include "mbedtls/ssl.h"#include "mbedtls/entropy.h" (&server_fd); mbedtls_ssl_init(&ssl); mbedtls_ssl_config_init(&conf); mbedtls_entropy_init(&
/platform/HAL_TLS_mbedtls.c:153:15: error: implicit declaration of function 'mbedtls_ssl_conf_psk'; did you mean 'mbedtls_ssl_conf_sni'? #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf ) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME__
移植指导OpenHarmony提供了mbedtls的开源三方库,路径为“//third_party/mbedtls”。 此库中提供了“mbedtls_platform_entropy_poll”、“mbedtls_hardclock_poll”、“mbedtls_havege_poll”、“mbedtls_hardware_poll 根据mbedtls的编译文件可以看出,配置宏的位置在"MBEDTLS_CONFIG_FILE=<…/port/config/config_liteos_m.h>"文件中。 defined(MBEDTLS_NO_PLATFORM_ENTROPY) mbedtls_entropy_add_source( ctx, mbedtls_platform_entropy_poll #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) mbedtls_entropy_add_source( ctx, mbedtls_hardware_poll
其他开发板也可以) LD3320语音模块 板载wifi(ESP8266也可以) “一张会说话的嘴” 软件环境 RT-Thread studio 版本2.1.1 软件包 webclient V2.1.2 mbedtls 软件包) MbedTLS support:配置 MbedTLS 功能支持 Version :配置软件包版本 mbedtls软件包 使能mbedtls功能之后,mbedtls软件包自动添加,mbedTLS : An portable and flexible SSL/TLS library # 打开 mbedtls 软件包 Store the AES tables in ROM # 将 AES = MBEDTLS_ERR_SSL_WANT_READ && ret ! = MBEDTLS_ERR_SSL_WANT_WRITE) { rt_kprintf("mbedtls_ssl_write returned -0x%x\n",
openssl自不用说了,mbedtls主要是为了如果需要用到Android或者iOS上的话,用mbedtls比较容易一些。接入的过程中主要有三个问题。 的简洁多了,都不用裁剪: int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen, ) { const mbedtls_ecp_curve_info *curve_info; if( ( curve_info = mbedtls_ecp_curve_info_from_grp_id ( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt, int format, size_t 封装接口的时候,其实我是选取了mbedtls目前支持的全部算法。其实openssl本身支持的更多,并且可以裁剪算法。
说明: 1、mbedTLS的前身是PolarSSL,开源免费。 2、mbedTLS支持的加密算法含对称加密和非对称加密 (1)mbedTLS支持的对称加密算法有:AES,ARCFOUR,Blowfish/BF,Camellia,DES/3DES,GCM,XTEA (2)mbedTLS支持的非对称加密算法有:Diffie-Hellman-Merkle,RSA,Elliptic Curves over GF(p),Elliptic Curve Digital Signature 2、mbedTLS支持密钥种子和密钥的生成,其中密钥种子函数提示要在Windows或者unix平台才可以使用,所以程序里面直接用的密钥生成函数。 安装最新的mbedTLS软件包: ? ? 测试效果: ?
/mbedtls \ -DENABLE_TESTING=OFF \ -DUSE_SHARED_MBEDTLS_LIBRARY=OFF \ -DUSE_STATIC_MBEDTLS_LIBRARY mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM , MBEDTLS_SSL_PRESET_DEFAULT); mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random mbedtls_ssl_conf_max_version(&conf, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION _2); mbedtls_ssl_conf_min_version(&conf, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION
比如,我的atsf4g-co里可以用mbedtls来加解密,但是mbedtls只有cmake文件,并没有编译iOS版本的文档。就可以通过上面的命令编译打包静态库。 脚本地址: https://github.com/owent-utils/bash-shell/blob/master/Build/mbedtls/build_mbedtls_ios.sh 再然后,因为我们的项目有用到 所以,还是和上面iOS的编译一样,我写了个给atsf4g-co使用的mbedtls的打包脚本,地址: https://github.com/owent-utils/bash-shell/blob/master /Build/mbedtls/build_mbedtls_android.sh 同时,也对pbc的cmake适配写了打包android动态库的脚本: https://github.com/owent-contrib
resource/cnblogs/LearnW5500" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe>
关于mbedtls mbedtls 是一个加密库,此库中有各种加密套件 比较常用的有sha,md5,SSL 打开这节的工程 1.keil自带mbedTLS包如果用户没有安装过,则会有以下提示! 用户点击 是 安装 mbedTLS包 ? 2.安装中 ? ? 3.编译下工程 ? 4,该程序是把 yang 做了SHA1加密,然后输出 ? ? ? ? ?openssl的接口实在太晦涩,而mbedtls的接口设计比openssl好太多,所以接口使用了mbedtls的形式。 实际测下来,openssl的性能比mbedtls高一个数量级,所以服务器还是用openssl比较好。 既然扩充了,就顺便增加一下openssl和mbedtls都支持的其他cipher。 配合上原来的测试数据,然后CI里的构建矩阵同时开openssl和mbedtls两种模式。这样所有支持的算法就都在测试集中了。 这样如果嵌入式设备和移动终端使用mbedtls的话,即便cipher里没有,也可以用这个库来提供 chacha20 的支持。