BabyOS支持请求https接口
早先有分享使用BabyOS请求HTTP接口获取天气信息:
BabyOS的HTTP接口获取天气 — BabyOS V0.3.2 文档
http相比https,优点是节省30~50KB内存,缺点便是少了信息安全的保障。
MCU内存资源比较珍贵。如果数据信息不敏感,没有安全要求,则能用http便不会使用https。
BabyOS需要给用户提供请求https接口的能力,最新的dev分支代码新增了b_mod_ssl软件模块。
对用户而言,http与https调用的接口一样:
int bHttpRequest(int httpfd, bHttpReqType_t type, const char *url, const char *head,
const char *body);
代码里面会根据url是以”http”还是”https”开头来决定是否使用b_mod_ssl。
实现方式
上一篇的分享也有提到BabyOS已经加入了第三方库mbedtls-3.6.0。b_mod_ssl软件模块也是基于此三方库实现。
目前b_mod_ssl提供的接口:
bSSLHandle_t bSSLInit(const char *hostname, bSSLCert_t *cert);
int bSSLDeinit(bSSLHandle_t ssl);
/**
* \brief
* \param ssl
* \param sockfd
* \return int (< 0: error) (0: success) (1: in progress)
*/
int bSSLHandshake(bSSLHandle_t ssl, int sockfd);
int bSSLRecv(bSSLHandle_t ssl, uint8_t *pbuf, uint16_t buf_len, uint16_t *rlen);
int bSSLSend(bSSLHandle_t ssl, uint8_t *pbuf, uint16_t buf_len, uint16_t *wlen);
bSSLInit
bSSLHandle_t bSSLInit(const char *hostname, bSSLCert_t *cert);
SSL初始化,传入主机名和证书信息。 这个接口里面会申请动态内存,因此需要与bSSLDeinit成对使用,保证资源可以释放。
初始化时会指定熵源,部分MCU有硬件随机数生成器,那么可以在MCU适配层实现随机数读取接口:
uint32_t bMcuRNGRead(void);
bSSLHandshake
int bSSLHandshake(bSSLHandle_t ssl, int sockfd);
SSL握手,在与对端服务器连接成功后,便调用此接口进行TLS握手。TLS握手期间客户端与服务器进行多次数据交换,完成身份验证和密钥协商。因此这个接口是需要多次调用,直到返回值为0(成功)或者 <0 (失败)。
BabyOS提供的mbedtls的配置文件:_config/b_mbedtls_config.h
里面定义了3个加密套件,如果无法满足用户的需要可以自行增加。
#define MBEDTLS_SSL_CIPHERSUITES \
MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, \
MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, \
MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
bSSLRecv/bSSLSend
int bSSLRecv(bSSLHandle_t ssl, uint8_t *pbuf, uint16_t buf_len, uint16_t *rlen);
int bSSLSend(bSSLHandle_t ssl, uint8_t *pbuf, uint16_t buf_len, uint16_t *wlen);
网络数据的发送和接收,TLS握手完成后便协商出了对称加密的方式和密钥。这时候发送和接收数据便不能使用bSend和bRecv, 需要调用SSL的接口,加密和解密都有mbedtls完成。
配置
如开头所说,并不是所有项目都需要SSL模块的支持,那么有需要的时候才勾选。
如果不使用BabyOS提供的配置文件,可以自定义配置文件:
没有硬件板子的开发者可以在linux环境基于 test/ssl/ 目录的代码进行调试。
当前的程度是能用起来,保证传输的数据是加密的,不会明文暴露。
有兴趣的开发者可以一起来做:
>加入证书数据,验证服务器证书的有效性
>优化内存
如果遇到bug请在仓库创建bug单!