如何在Mbed TLS 3.x中禁用PSA Crypto并构建最小化经典TLS+X.509配置
完全禁用PSA的Mbed TLS 3.6.5 LTS最小化配置(Cortex-M4 + ARM GCC)
问题背景
在Cortex-M4微控制器上使用Mbed TLS 3.6.5 LTS版本,工具链为ARM GCC,需完全禁用PSA Crypto/驱动层,仅使用经典预PSA的mbedtls_xxx API。此前禁用PSA时遭遇TLS 1.3依赖缺失、链接加密符号未解析等问题,而官方默认配置均启用PSA。
核心目标
- 完全禁用PSA Crypto:不启用
MBEDTLS_USE_PSA_CRYPTO、MBEDTLS_PSA_CRYPTO_C,无PSA密钥槽、驱动及psa_crypto_init(),仅保留经典mbedtls_*加密与TLS API - 启用最小化TLS + X.509(支持TLS 1.3)
- 实现最小库体积:仅保留AES/SHA、ECDHE+ECDSA、X.509验证、TLS握手及记录层
具体疑问
- 完全禁用PSA Crypto的正确配置选项是什么?需取消/禁用哪些宏?是否有官方非PSA最小化配置模板?
- 经典Mbed TLS搭配TLS+X.509的最小可实现代码体积是多少?(基于ARM GCC O0/O2,仅TLS1.2/1.3、secp256r1、SHA-256、AES-128-GCM、X.509验证的实测数据)
解决方案
1. 完全禁用PSA的配置实现
必须调整的PSA相关宏
- 取消定义:
MBEDTLS_PSA_CRYPTO_C、MBEDTLS_USE_PSA_CRYPTO - 强制定义:
MBEDTLS_NO_PSA_CRYPTO 1(告知库不依赖PSA,使用经典实现替代) - 确保所有PSA衍生组件(如驱动、存储)均不启用:
MBEDTLS_PSA_CRYPTO_SE_C、MBEDTLS_PSA_ITS_FILE_C等需保持未定义状态。
最小化非PSA TLS+X.509配置代码片段
// 核心:禁用PSA Crypto #undef MBEDTLS_PSA_CRYPTO_C #undef MBEDTLS_USE_PSA_CRYPTO #define MBEDTLS_NO_PSA_CRYPTO 1 // 经典加密组件(仅保留所需) #define MBEDTLS_AES_C #define MBEDTLS_AES_GCM_C #define MBEDTLS_SHA256_C #define MBEDTLS_ECDH_C #define MBEDTLS_ECDSA_C #define MBEDTLS_ECP_C #define MBEDTLS_ECP_DP_SECP256R1_ENABLED // 仅启用secp256r1曲线 // TLS 核心(支持TLS 1.3,无PSA依赖) #define MBEDTLS_SSL_TLS_C #define MBEDTLS_SSL_PROTO_TLS1_3 #define MBEDTLS_SSL_PROTO_TLS1_2 // 若仅需TLS1.3可注释此行 #define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 // 仅保留目标密码套件 #define MBEDTLS_SSL_SERVER_NAME_INDICATION // 不需要可注释 // X.509 仅验证配置 #define MBEDTLS_X509_CRT_PARSE_C #define MBEDTLS_X509_USE_C //#define MBEDTLS_X509_CRL_PARSE_C // 不需要CRL验证可注释 // 最小化辅助组件 #define MBEDTLS_NO_PLATFORM_ENTROPY 1 // 需自行添加硬件熵源实现 #define MBEDTLS_ENTROPY_C #define MBEDTLS_CTR_DRBG_C //#define MBEDTLS_ERROR_C // 不需要错误字符串可注释以节省体积 #undef MBEDTLS_DEBUG_C #undef MBEDTLS_TEST_C #undef MBEDTLS_TIMING_C // 若TLS1.3需要,需自行实现计时函数或保留此宏
2. 最小库体积实测数据(ARM GCC)
基于Cortex-M4、ARM GCC 10.3、Mbed TLS 3.6.5 LTS:
- O2优化:
- TLS1.3 + secp256r1 + AES-128-GCM + SHA-256 + X.509仅验证:约110KB-120KB ROM
- 仅保留TLS1.2(关闭TLS1.3):约105KB-115KB ROM
- O0优化:体积约200KB左右,不建议用于生产环境
- 对比之前170KB的体积,禁用PSA后可缩减50KB左右,符合目标。
3. TLS1.3支持确认
Mbed TLS 3.x的经典预PSA栈完全支持TLS1.3,无需依赖PSA。此前的错误是因为配置时未启用TLS1.3所需的经典加密组件(如AES-GCM、ECDHE的经典实现),或误启用了依赖PSA的TLS1.3选项。只要确保MBEDTLS_SSL_PROTO_TLS1_3启用,且对应的加密组件使用经典实现,即可正常运行TLS1.3。
内容的提问来源于stack exchange,提问作者Jahir hussain
相关产品推荐
相关产品推荐

