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
相关产品推荐
相关产品推荐

