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模块的支持,那么有需要的时候才勾选。

img

如果不使用BabyOS提供的配置文件,可以自定义配置文件:

img

没有硬件板子的开发者可以在linux环境基于 test/ssl/ 目录的代码进行调试。

当前的程度是能用起来,保证传输的数据是加密的,不会明文暴露。

有兴趣的开发者可以一起来做:

>加入证书数据,验证服务器证书的有效性

>优化内存

如果遇到bug请在仓库创建bug单!