mbedtls TLS密码套件由什么决定?如何切换指定加密套件?
mbed TLS密码套件选择相关问题解答
密码套件选中CHACHA20-POLY1305的决定因素
- 客户端与服务端的密码套件支持交集:TLS握手阶段客户端会先发送ClientHello报文,携带自身支持的所有密码套件列表,服务端仅会从自身支持、同时也在客户端列表中的选项里挑选最终使用的套件。
- 服务端配置的套件优先级:如果服务端配置中CHACHA20-POLY1305相关套件的优先级高于AES类套件,就算两类套件都在双方支持的交集中,也会优先选择CHACHA20-POLY1305套件。多数嵌入式、移动端场景会默认把CHACHA20-POLY1305优先级设得更高,因为它不需要AES硬件加速就能达到不错的性能。
- 服务端证书的算法类型:你当前选中的套件是
TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256,说明服务端当前部署的是RSA类型的证书,密钥交换、签名环节必须匹配证书的算法类型,ECDSA类套件只有对应ECDSA证书才会被纳入可选范围。 - 硬件支持情况:如果服务端或客户端所在设备没有AES硬件加速指令,mbed TLS内部逻辑也会优先选择性能更优的CHACHA20-POLY1305。
切换为TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256的操作步骤
- 替换服务端证书:目标套件的签名算法为ECDSA,需要先为服务端生成/申请ECDSA类型的证书,密钥曲线推荐使用P-256,和套件要求匹配。
- 调整mbed TLS编译配置:确认mbed TLS的编译选项开启了对应套件的支持,需要保证以下宏被定义:
若之前关闭了上述功能,需要重新编译mbed TLS库。MBEDTLS_ECDH_C MBEDTLS_ECDSA_C MBEDTLS_AES_C MBEDTLS_GCM_C MBEDTLS_SHA256_C MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - 调整密码套件优先级配置:在服务端和客户端的mbed TLS配置代码中,调用
mbedtls_ssl_conf_ciphersuites()函数,将TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256放在优先级列表的最前面,同时可以将不需要的CHACHA20类套件优先级调低,或者直接从支持列表中移除。 - 验证配置:重新编译运行应用,查看握手阶段日志,确认ClientHello和ServerHello报文中目标套件已被纳入双方支持列表,且最终被选中。
内容的提问来源于stack exchange,提问作者gogogo
相关产品推荐
相关产品推荐

