You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32 Azure RTOS环境连接Mosquitto Broker的证书配置问题

问题:STM32上使用Azure RTOS NX Secure对接要求客户端证书的Mosquitto MQTT Broker失败

背景

程序基于Paho SDK C库,可正常连接UNIX系统上的Mosquitto MQTT Broker,采用自签名SSL/TLS证书,这套客户端证书在MQTT Explorer和MQTT-spy中均可正常工作。每套客户端证书包含三个必要文件:

  • Server Certificate (CA)
  • Client Certificate
  • Client Key

所有证书通过OpenSSL生成,均为PEM格式的x509证书,是客户端必须内置的最小证书集合。对接的Mosquitto Broker配置如下:

  • listener 8883
  • cafile ...path to.../ca.crt
  • certfile ...path to.../broker.crt
  • keyfile ...path.../broker.key
  • require_certificate true
  • use_identity_as_username true

STM32移植问题

需要将客户端程序移植到STM32开发板,已验证ST官方MQTT示例可连接mosquitto.org测试Broker,局域网部署的Mosquitto Broker也能被Paho SDK程序正常连接,但基于Azure SDK的移植代码无法连接。

曾实现SSL/TLS匿名访问(仅加载CA证书),代码如下(包含Azure SDK必要调用),返回均为TX_SUCCESS:

nx_secure_x509_certificate_initialize(trusted_certificate_ptr, (UCHAR *)ca_crt_der, sizeof(ca_crt_der), NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
nx_secure_tls_trusted_certificate_add(TLS_session_ptr, trusted_certificate_ptr);

CA证书转换命令:

openssl base64 -d -in ../ca/ca.crt -out ca.crt.der
xxd -i ca.crt.der > ca.crt.der.h

但扩展代码以加载全部三个证书时遇到问题,尝试了两种方案:

方案1:将客户端证书和密钥合并初始化

代码如下,初始化步骤返回错误码0x18a:

nx_secure_x509_certificate_initialize(trusted_certificate_ptr, (UCHAR *)client_crt_der, sizeof(client_crt_der), NX_NULL, 0, (UCHAR *)client_key_der, sizeof(client_key_der), NX_SECURE_X509_KEY_TYPE_EC_DER);
nx_secure_tls_trusted_certificate_add(TLS_session_ptr, trusted_certificate_ptr);

客户端密钥转换命令:

openssl ec -inform pem -in client.key -outform der -out client.key.der
xxd -i client.key.der > client.key.der.h

方案2:三个证书分别初始化添加

先执行CA证书的初始化添加(成功),再执行以下代码:

// 初始化客户端证书,返回TX_SUCCESS
nx_secure_x509_certificate_initialize(trusted_certificate_ptr, (UCHAR*)client_crt_der, (USHORT)sizeof(client_crt_der), NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
// 添加客户端证书失败,错误码0x4d
nx_secure_tls_trusted_certificate_add(TLS_session_ptr, trusted_certificate_ptr);

// 尝试初始化并添加客户端密钥
nx_secure_x509_certificate_initialize(trusted_certificate_ptr, (UCHAR*)client_key_der, (USHORT)sizeof(client_key_der), NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
nx_secure_tls_trusted_certificate_add(TLS_session_ptr, trusted_certificate_ptr);

疑问

  • 是否需要为证书结构体分配更多空间?
  • 能否复用TLS_session_ptr和trusted_certificate_ptr结构体?
  • nx_secure_tls_trusted_certificate_add()是复制传入的结构体数据,还是需要为每个证书分配新的结构体空间?
  • 还有哪些可尝试的解决方法?

更新(4月27日)

针对之前的解答,查看nx_secure_tls_session_client_verify_enable()函数的微软源码注释,发现该函数仅对TLS服务端会话生效,客户端调用无效:

/**************************************************************************/
/*                                                                        */
/*  FUNCTION                                               RELEASE        */
/*                                                                        */
/*    _nx_secure_tls_session_client_verify_enable         PORTABLE C      */
/*                                                           6.1          */
/*  AUTHOR                                                                */
/*                                                                        */
/*    Timothy Stapko, Microsoft Corporation                               */
/*                                                                        */
/*  DESCRIPTION                                                           */
/*                                                                        */
/*    This function enables Client Certificate Verification for TLS       */
/*    Server instances. If enabled, the TLS Server will request and       */
/*    verify a remote TLS Client Certificate using all available crypto   */
/*    signature routines. The certificate must have space allocated using */
/*    nx_secure_tls_remote_certificate_allocate and will be checked       */
/*    against the trusted certificate store built using                   */
/*    nx_secure_tls_trusted_certificate_add.                              */
/*                                                                        */
/*    Note that this will only happen for TLS Server sessions. Enabling   */
/*    Client Certificate Verification for TLS Client sessions will have   */
/*    no effect.                                                          */

内容的提问来源于stack exchange,提问作者softeky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:07:45