前言

概述

本文档主要介绍TLS/DTLS组件的开发实现示例。

TLS/DTLS以及其他加密套基于开源组件mbedtls 3.1.0实现,详细说明请参见官方说明:https://tls.mbed.org/api/index.html

如果官方说明版本与SDK版本不一致,请参考官方release说明:https://github.com/ARMmbed/mbedtls/releases

产品版本

与本文档相对应的产品版本如下。

产品名称

产品版本

WS63

V100

读者对象

本文档主要适用于以下工程师:

  • 技术支持工程师

  • 软件开发工程师

符号约定

在本文中可能出现下列标志,它们所代表的含义如下。

符号

说明

表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。

表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。

表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

“须知”不涉及人身伤害。

对正文中重点信息的补充说明。

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

修改记录

文档版本

发布日期

修改说明

02

2024-10-14

更新“关于FCC认证默认配置变更说明”小节内容。

01

2024-04-10

第一次正式版本发布。

00B01

2024-03-15

第一次临时版本发布。

API接口说明

结构体说明

mbedtls详细的结构体说明请参考官方说明文档:https://tls.mbed.org/api/annotated.html

API列表

mbedtls详细的API说明请参考官方说明文档:https://tls.mbed.org/api/globals_func.html

配置说明

mbedtls详细的配置项说明请参考官方说明文档:https://tls.mbed.org/api/config_8h.html#ab3bca0048342cf2789e7d170548ff3a5

开发指南

mbedtls详细的开发DEMO请参考官方说明文档:https://tls.mbed.org/api/modules.html

硬件适配

配置说明

在工程的build\config\target_config\ws63\config.py中的对应编译目标中添加MBEDTLS_HARDEN_OPEN宏,开启硬件加速回调接口注册功能。

在mbedtls_v3.1.0\harden\platform\connect\mbedtls_platform_hardware_config.h中开启对应的算法宏,会直接调用硬件驱动接口。

目前支持的硬件算法有AES,RSA,HASH,大数模幂,随机数,ECP算法。

适配说明

AES适配

  • 使能MBEDTLS_AES_ALT后,AES算法在使用硬件加速器时,会锁定硬件加速器资源,即AES操作是阻塞的,直至驱动获取资源或超时返回失败。

大数模幂适配

  • 使能MBEDTLS_BIGNUM_EXP_MOD_USE_HARDWARE后,会调用硬件驱动接口完成大数模幂运算。

随机数适配

使能MBEDTLS_ENTROPY_HARDWARE_ALT后,系统会选用默认增加硬件随机数作为一个强随机数源。如果此宏被关闭,而用户也没有注册其他强随机数源,会导致mbedTLS无法提供安全随机数,影响系统的安全性。

RSA数字签名适配

使能MBEDTLS_RSA_ALT编译宏之后,mbedTLS会对RSA数字签名操作和验签操作进行硬件加速。

HASH算法适配

目前WS63规格支持的硬件加速HASH算法有SHA1,SHA224,SHA256,SHA384,SHA512,分别开启MBEDTLS_SHA1_USE_HARDWARE,MBEDTLS_SHA224_USE_HARDWARE,MBEDTLS_SHA256_USE_HARDWARE,MBEDTLS_SHA384_USE_HARDWARE,MBEDTLS_SHA512_USE_HARDWARE来使能。

ECP适配

目前WS63规格支持的硬件加速ECP算法有SECP192R1, SECP224R1,SECP256R1,SECP384R1,SECP521R1,BP256R1,BP384R1,BP512R1,CURVE25519,CURVE448,分别开启MBEDTLS_SECP192R1_USE_HARDWARE,MBEDTLS_SECP224R1_USE_HARDWARE,MBEDTLS_SECP256R1_USE_HARDWARE,MBEDTLS_SECP384R1_USE_HARDWARE,MBEDTLS_SECP521R1_USE_HARDWARE,MBEDTLS_BP256R1_USE_HARDWARE, MBEDTLS_BP384R1_USE_HARDWARE, MBEDTLS_BP512R1_USE_HARDWARE, MBEDTLS_CURVE25519_USE_HARDWARE,MBEDTLS_CURVE448_USE_HARDWARE来开启。

注意事项

关于配置SSL接收缓存的注意事项

  • SSL接收缓存由编译项MBEDTLS_SSL_IN_CONTENT_LEN控制,默认为16KB。如果实际应用中,用户可以确保SSL上层数据包的最大长度不超过2KB或4KB,则可以通过mbedtls_ssl_conf_max_frag_len接口设置SSL接收缓存的长度,达到节省内存的目的。

    注意:mbedtls_ssl_conf_max_frag_len接口的调用必须先于mbedtls_ssl_setup接口。

  • 考虑到多级数字证书可能导致TLS握手包的长度大于1KB,因此调用mbedtls_ssl_conf_max_frag_len接口时,只有mfl_code为MBEDTLS_SSL_MAX_FRAG_LEN_2048或MBEDTLS_SSL_MAX_FRAG_LEN_4096时,mbedtls才会修改接收缓存;如果mfl_code为MBEDTLS_SSL_MAX_FRAG_LEN_512或MBEDTLS_SSL_MAX_FRAG_LEN_1024,则接收缓存仍然为16KB。

  • 如果修改SSL接收缓存为2KB或4KB后,Client端接收到Server端的一个大于2KB或4KB的数据包,此时mbedtls_ssl_read接口会返回失败,错误码为MBEDTLS_ERR_SSL_MSG_TOO_LONG(此为新增的一个特定错误码),当用户获得此错误码时,必须关闭SSL连接,不允许继续从SSL链路接收数据。

  • 通过mbedtls_ssl_conf_max_frag_len接口设置SSL接收缓存,目前只对SSL Client有效。

关于数字证书有效期验证的注意事项

由于WS63平台无Real Time Controller,因此系统启动后,无法获取UTC时间,这种情况下数字证书的有效期验证会失败,导致TLS建链失败。针对此种情况,mbedtls默认关闭MBEDTLS_HAVE_TIME_DATE,此时TLS的证书校验会关闭。如果用户可以确保TLS证书校验之前,可以通过其他方式获取UTC时间(例如:SNTP),则可以打开MBEDTLS_HAVE_TIME_DATE编译宏。

关于部分默认配置变更的说明

MbedTLS安全库的默认配置见include/mbedtls/mbedtls_config.h文件。开源版本默认开启大部分功能,LiteOS对MbedTLS的默认配置进行了适度修改,主要目的是增强MbedTLS的安全性,降低代码体积。修改后的MbedTLS满足IoT绝大部分场景,改动的主要原则如下:

  • 默认配置必须保证安全性要求。

  • 关闭不安全算法或功能。

  • 关闭不适合IoT场景的功能,例如TLS Server模式、X509证书签名请求CSR。

  • 关闭不适合IoT场景的算法,例如SECP521R1 ECC曲线,IoT场景下推荐使用128比特安全强度的ECC曲线。

  • 关闭不常用算法或功能,例如IoT场景不常用的PKCS#12证书。如果打开PKCS#12,可能存在一定的应用风险。

关于FCC认证默认配置变更说明

FCC认证为EMC强制性认证, 主要针对 9K-3000GHZ的电子电器产品,内容涉及无线电、通信等各方面。FCC认证过程依赖KEY_EXCHANGE_ECDHE_RSA算法,此算法默认未开启。如果设备有通过FCC认证的需求,可以开启此算法。开启方法:修改open_source/mbedtls/mbedtls_v3.1.0/harden/platform/connect/mbedtls_platform_hardware_config.h文件,将#undef MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED注释掉。