This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3551E:CC3551E MQTT TLS 使用客户端证书连接至 test.mosquitto.org:8884

Guru**** 2905430 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1628551/cc3551e-cc3551e-mqtt-tls-connection-to-test-mosquitto-org-8884-using-client-certificates

器件型号: CC3551E

尊敬的 TI 团队:

我正在使用基于命令的固件开发 CC35xx 器件、并尝试与公共代理建立安全的 MQTT 连接 (TLS)。
目标代理详细信息:
*经纪商: test.mosquitto.org
*端口:8884(带客户端证书的 TLS)
1.在 Windows 上安装 OpenSSL 并生成证书:
  * client.key
  * client.csr
  * client.crt(通过 Mosquitto 测试服务器签名)
  * mosquitto.org.crt(CA 证书)
2.已使用 OpenSSL 验证 TLS 连接成功:
  *`openssl s_client -connect test.mosquitto.org:8884 -cert client.crt -key client.key -CAfile mosquitto.org.crt`
  *握手成功完成(验证返回码:0)
3.将证书转换为 DER 格式供设备使用:
  * client.der
  * client_key.der
  * ca.der
  
其他实现详细信息:
1.我计划使用 NVS(非易失性存储)将证书存储在内部闪存中。

*需要以下方面的指导:
 *在闪存中存储证书文件的正确方式(NVS 与文件系统)
 *证书是否应该写为原始二进制 Blob 或使用特定的文件结构
 *存储在闪存中时的任何对齐/大小限制
 *固件当前使用 CCS/toolbox 加载
 *供应商映像放置在插槽 0 中
 *当前未启用 OTA、如果启用、则需要进行哪些更改。
 *存储在闪存中的证书如何与应用程序映像交互。

我需要有关使用 AT 命令在 CC35xx 上实现基于 TLS 的 MQTT 的指导。

1. AT 命令的正确顺序是什么?

  *将证书上载到文件系统/闪存
  *配置安全套接字( TLS 方法,密码等)
  *将证书与 MQTT 连接关联
2.证书存储的建议方法是什么:
  *对于 NVS 有任何可用的 TI 参考实现?

您能否提供一个参考示例或推荐的配置?
此致、
Vignesh。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    即将推出的 SDK 应包含可用作参考的部分、这些部分会触及您的某些疑问。

    它将包括 OTA 示例以及 我们将为 Azure 插件发布的外部插件。

    OTA 将显示 与受安全保护的 HTTP 服务器(即使用证书)的安全客户端连接。

    在此示例中、证书驻留在代码本身(头文件)中、而不在文件系统中。

    Azure 插件也是如此。

    在这两种情况下、它都以 PEM 格式保存、这是交付到 mbedTLS 的方式。

    我几乎可以肯定您也可以执行 DER 格式、但 mbedTLS 需要相应地进行配置。

    如果要使用 本地闪存 来存储/获取文件、也可以这样做。 目前、这是存储代码和其他系统文件的位置。

    SDK 文档中介绍了一个相关的 API。 此模块称为 NVOCMP 模块。

    因此、如果改为将证书存储在闪存中、则需要在将证书设置为 mbedTLS 之前打开/读取证书。

    固件当前存储在同一闪存中、并在调用 WLAN_START API 期间加载。

    如果您有兴趣、可以查看 init_device () 下的代码、它将调用 ctrlCmdc Fw_Container.Download ()、其中的“FW"是“是固件的已知名称、也是文件系统中调用该文件的方式。 固件本身和其他文件通过工具箱或 CCS 预编程到闪存中(最终也会调用工具箱)。

    当前 MQTT 客户端示例未受安全保护。 唯一即将推出的 Azure 插件将受到保护、因此您可以将其用作参考。

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shlomi:

    感谢您的详细说明。

    当前状态:
    * Wi-Fi 连接和 IP 获取成功
    * DNS 解析有效
    * TLS 内存问题已解决(堆增加,mbedTLS 已优化)
    * TLS 握手成功启动
    但是、我在 TLS 握手过程中遇到了问题:
    调试消息:
    [TLS]握手开始...
    [TLS]握手失败:SSL — 从我们的对等设备收到致命警报消息

    在 OpenSSL 中:

    *相同的证书(CA,客户端证书,客户端密钥)在 PC 上使用 OpenSSL:
    openssl s_client -connect test.mosquitto.org:8884 \
    -cert client.crt -key client.key -CAfile mosquitto.org.crt→握手成功

    *在设备上:

    我已实施的措施:
    *使用 mbedTLS 的 TLS 层(基于 Azure 插件引用)
    *使用嵌入在代码中的 PEM 证书(无文件系统)
    *对 RNG 使用 PSA 加密 (PSA_generate_random)
    *使用 lwIP 插槽
    使用的证书:
    *CA 认证:mosquitto.org.crt
    *客户端证书:通过 Mosquitto 测试服务器生成
    *客户端密钥:匹配的私钥
    TLS 配置:
    *mbedtls_ssl_config_defaults ()
    *MBEDTLS_SSL_VERIFY_REQUIRED
    *mbedtls_ssl_conf_ca_chain()
    *mbedtls_ssl_conf_own_cert()

    *证书从 PEM 数组加载
    * PSA 加密用于 RNG

    1. CC35xx 是否有以下方面的任何特定要求或限制:

    *客户端证书解析(PEM 格式,空终止等)?
    *使用基于 PSA 的 RNG 时的私钥解析?

    您能否介绍如何调试或解决此 TLS 致命警报?

    此致、
    Vignesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我知道没有具体的限制。

    您使用的是哪个 SDK 版本?

    我问、因为 PSA 存在问题、但所有问题都是最新修复的。

    若要调试 mbedtls/lwip 问题、您可以在器件上打开日志。

    对于 LwIP、通过 lwipopt.h 简单打开所需的任何内容、

    这是一种常见的做法、只需打开 LWIP_DEBUG 以及要在同一文件上启用的协议、但将 LWIP_DBG_OFF 更改为 LWIP_DBG_ON。  

    对于 mbedtls、我会在 mbedtls 中添加一个回调函数。

    这是一个像我一样的代码片段。 只需在初始化期间添加调试函数并将其设置为 mbedtls:

    #include <mbedtls/debug.h>
    
    #define WIFI_PLATFORM_MBEDTLS_DEBUG_LOG_LEVEL    10
    
    static void mbedtlsDebugPrint( void * ctx,
                                   int level,
                                   const char * pFile,
                                   int line,
                                   const char * pStr )
    {
        extern int Report(const char *pcFormat,...);
        Report("\n\rwifi_platform_mbedtls: |%d| %s \n\r", level, pStr);
    }
    
    //mbedtls debug
    mbedtls_ssl_conf_dbg(&( pxSslContext->config ), mbedtlsDebugPrint, NULL);
    mbedtls_debug_set_threshold(WIFI_PLATFORM_MBEDTLS_DEBUG_LOG_LEVEL);

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shlomi:

    感谢您的答复和建议。
    我目前使用的是 SimpleLink SDK 9.22 版。

    根据您的建议、我已为 lwIP 和 mbedTLS 启用调试:
    已在 lwipopts.h 中启用 LWIP_DEBUG 和相关协议调试标志 添加 mbedtls_ssl_conf_dbg() 回调以捕获 TLS 日志。
    根据调试日志得出的观察结果:
    TLS 握手成功开始。 失败发生在 ClientHello 之后

    观察到的错误:

    TLS 1.3:“SSL — 收到来自对等方的致命警报消息“
    TLS 1.2:“发生致命错误(例如,链太长或验证回调失败)(0x3000)“

    这表明服务器在证书验证或握手协商期间拒绝连接。

    1.时间同步 (SNTP)
    在 CC35xx 上使用基于 lwIP 的网络时、是否需要手动实施 SNTP?
    我目前正在使用 lwIP SNTP 模块。
    我想确认:
    实现 SNTP_set_system_time() 是否足够?
    TI 是否有任何特定的要求将系统时间传播到 TLS 层?
    2. TLS 配置
    我正在将 mbedtls_ssl_config_defaults () 与 MBEDTLS_ssl_verify_required 一起使用
    证书(CA,客户端证书和私钥)从 PEM 数组加载
    其他信息:
    相同的证书可在 PC 上使用 OpenSSL 正常工作

    我随附了调试日志以供您参考。
    请告诉我是否有任何相关示例或建议的实施程序。

    再次感谢您的支持。

    此致、e2e.ti.com/.../debug_5F00_log.txt
    Vignesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我当时很兴奋,但也很兴奋。

    从日志中、您从服务器获取的证书验证似乎失败。

    错误是–12288、即 MBEDTLS_ERR_X509_FALATAL_ERROR。

    它可能与到期时间/日期验证有关。 您可以使用 SNTP 设置时钟或手动执行。

    SDK 中有一个参考代码(在 network_terminal 中)。 您可以查看 sntp_task.c/h、sntp_wrapper.c/h 和 data_time_service.c/h

    您也可以在 mbedtls 中禁用数据/时间验证、看看它是否通过了此阶段、可能会在路径中的其他地方失败。

    其编译标志为 MBEDTLS_HAVE_TIME_DATE。

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shlomi:

    感谢您的答复和建议。
    电流观察:
    我正在使用 SDK 中的 SNTP 实现 (SNTP_task、SNTP_wrapper、date_time_service)。
    SNTP 同步成功完成、使用 datetime 模块打印正确的 UTC 时间。
    但是、time() 返回的系统时间仍为 0。
    由于 mbedTLS 依赖于证书验证的系统时间 (time ()),这可能是证书验证失败的原因 (MBEDTLS_ERR_X509_FALATAL_ERROR )。
    datetime_SecondsSet() 似乎只更新应用程序级时间、而不将其传播到 mbedTLS 使用的系统时钟。

    请确认:
    SDK 中是否有建议的方法来同步 SNTP 时间与系统时钟 (time())?
    确保 mbedTLS 正确使用时间是否需要任何其他配置?

    我随附了调试日志和 TLS 实现代码以供您参考。

    再次感谢您的 support.e2e.ti.com/.../debug-log1.txte2e.ti.com/.../tls.txt

    此致、
    Vignesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我需要检查一下。

    根据我的记忆、通过包装器设置时间可设置日期/时间、证书链验证应通过。

    Shlomi