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.

[参考译文] LAUNCHXL-CC3235SF:MQTT TLS 连接失败

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1227423/launchxl-cc3235sf-mqtt-tls-connect-failed

器件型号:LAUNCHXL-CC3235SF
主题中讨论的其他器件:CC3235SFSysConfig

您好!

我尝试使用"simplelink_cc32xx_sdk_7_10_00_13"上的"mqt_client_over_TLS_1_3_CC3235SF_LAUNCHXL_tirtos7_gcc"通过 TLS 连接到 MQTT 代理。

但我收到一个"连接失败:-3001"。

我指的是打印日志、mbedtls_xxx_parse 返回错误。

- mbedtls_x509_crt_parse (远程根 CA 证书)::XXXXX 返回-8576

- mbedtls_x509_crt_parse (本地 PEM 证书)::XXXXX 返回-8576

- mbedtls_pk_parse_key (私钥):XXXXX returned -15616

当我使用 PC+Python 时,我确认  使用这些证书文件访问 MQTT 代理。

I 设置、

- SysConfig : 1.16.1

- mqtt_client_app.h

char *MQTTClient_secureFiles[4] = {"private_key.pem", "certificate.pem", "root_ca.pem", NULL};

MQTTClient_ConnParams mqttConnParams =
{
    MQTT_CONNECTION_FLAGS,                  // connection flags
    MQTT_CONNECTION_ADDRESS,                // server address
    MQTT_CONNECTION_PORT_NUMBER,            // port number of MQTT server
    SLNETSOCK_SEC_METHOD_SSLv3_TLSV1_2,     // method for secure socket
    SLNETSOCK_SEC_CIPHER_FULL_LIST,         // cipher for secure socket
    4,                                      // number of files for secure connection
    MQTTClient_secureFiles                  // secure files
};

此外、还使用基础"RootCACerts.pem"返回该错误。

- mqtt_client_app.h

char *MQTTClient_secureFiles[1] = {"RootCACerts.pem"};

是否有办法避免此错误?

如果您有任何反馈、指导或建议、我将不胜感激。

最后、我插入打印日志(带有屏蔽的私有信息)。

-打印日志

        ============================================
           MQTT client Example Ver: 2.0.3
        ============================================

         CHIP: 0x31100019
         MAC:  3.7.0.1
         PHY:  3.1.0.26
         NWP:  4.13.0.2
         ROM:  8738
         HOST: 3.0.1.71
         MAC address: XXXXXXXXXXXXXXXXXX

        ============================================
[WIFI::INFO]  [SlWifiConnEventHandler] POWERED_UP
[WIFI::INFO]    MAC address: XXXXXXXXXXXXXXXXXX
[WIFI::INFO]   [Event] STA connected to AP - BSSID:XXXXXXXXXXXXXXXXXX, SSID:XXXXXXXXXXXXXXXXXX
[WIFI::INFO]  [NETAPP EVENT] IP Acquired: IP=XXXXXXXXXXXXXXXXXX , Gateway=XXXXXXXXXXXXXXXXXX
[SlNetConnEventHandler] I/F 1 - CONNECTED (IP LEVEL)!
[SlNetConnEventHandler] I/F 1 - CONNECTED (INTERNET LEVEL)!
startSNTP: Current time: Wed May 17 00:56:41 2023

[MQTT_APP::INFO]  Subscribed to all topics successfully

[MQTT_APP::INFO]  Wi-Fi connection is UP
[SL-MBEDTLS::INFO]  InitTlsSocket:: sd=1, pTlsSock=2000c1d8 slSock=1

[SL-MBEDTLS::ERROR]  failed
  !  mbedtls_x509_crt_parse (Remote Root CA Certificate):: root_ca.pem returned -8576

[SL-MBEDTLS::ERROR]  failed
  !  mbedtls_x509_crt_parse (Local PEM Certificate):: certificate.pem returned -8576

[SL-MBEDTLS::ERROR]  failed
  !  mbedtls_pk_parse_key (Private Key):: private_key.pem returned -15616

[SL-MBEDTLS::INFO]    . Connect on tcp/*/4433 ...

[SL-MBEDTLS::INFO]   ConfigClientSocket: . Setting up the TLS data...

[SL-MBEDTLS::INFO]  Performing the mbedTLS SSL/TLS handshake...
[SL-MBEDTLS::ERROR]    Failed ! mbedtls_ssl_handshake returned -0x7880
[SL-MBEDTLS::INFO]  SlNetIfWifi_close:: Connection Socket 1 was removed

[SL-MBEDTLS::INFO]  SlNetIfWifi_close:: Listener Socket 1 was removed

[MQTT_IF::ERROR] connect failed: -3001

[MQTT_APP::INFO]  MQTT_EVENT_SERVER_DISCONNECT

[MQTT_APP::INFO]  MQTT_EVENT_DESTROY


- 打印日志(使用底座"RootCACerts.pem")

        ============================================
           MQTT client Example Ver: 2.0.3
        ============================================

         CHIP: 0x31100019
         MAC:  3.7.0.1
         PHY:  3.1.0.26
         NWP:  4.13.0.2
         ROM:  8738
         HOST: 3.0.1.71
         MAC address: XXXXXXXXXXXXXXXXXX

        ============================================
[WIFI::INFO]  [SlWifiConnEventHandler] POWERED_UP
[WIFI::INFO]    MAC address: XXXXXXXXXXXXXXXXXX
[WIFI::INFO]   [Event] STA connected to AP - BSSID:XXXXXXXXXXXXXXXXXX, SSID:XXXXXXXXXXXXXXXXXX
[WIFI::INFO]  [NETAPP EVENT] IP Acquired: IP=XXXXXXXXXXXXXXXXXX , Gateway=XXXXXXXXXXXXXXXXXX
[SlNetConnEventHandler] I/F 1 - CONNECTED (IP LEVEL)!
[SlNetConnEventHandler] I/F 1 - CONNECTED (INTERNET LEVEL)!
startSNTP: Current time: Wed May 17 01:09:48 2023

[MQTT_APP::INFO]  Subscribed to all topics successfully

[MQTT_APP::INFO]  Wi-Fi connection is UP
[SL-MBEDTLS::INFO]  InitTlsSocket:: sd=1, pTlsSock=2000c1a8 slSock=1

[SL-MBEDTLS::ERROR]  failed
  !  mbedtls_x509_crt_parse (Remote Root CA Certificate):: RootCACerts.pem returned -8576

[SL-MBEDTLS::INFO]    . Connect on tcp/*/4433 ...

[SL-MBEDTLS::INFO]   ConfigClientSocket: . Setting up the TLS data...

[SL-MBEDTLS::INFO]  Performing the mbedTLS SSL/TLS handshake...
[SL-MBEDTLS::ERROR]    Failed ! mbedtls_ssl_handshake returned -0x2700
[SL-MBEDTLS::INFO]  SlNetIfWifi_close:: Connection Socket 1 was removed

[SL-MBEDTLS::INFO]  SlNetIfWifi_close:: Listener Socket 1 was removed

[MQTT_IF::ERROR] connect failed: -3001

[MQTT_APP::INFO]  MQTT_EVENT_SERVER_DISCONNECT

[MQTT_APP::INFO]  MQTT_EVENT_DESTROY

谨致问候。

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

    -8576 (0x2180)为 MBEDTLS_ERR_X509_INVALID_FORMAT。

    PEM 格式的证书出现问题、您可以 在 mbedtls 论坛中进行检查(因为堆栈不考虑格式)。

    您还可以调试 mbedtks_x509_crt_parse (在 x509_crt.c 中)(以查找问题来源)。

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

    你好 Kobi。

    感谢您的支持。

    看到"pk.h:mbedtls_pk_parse_key"后、我发现下面的注释。

    *\ 参数键 要解析的输入缓冲区。
    *缓冲器必须完全包含输入、不能
    *额外的牵引材料。 对于 PEM、缓冲器必须
    *包含以 null 结尾的字符串
    *\ param keylen 以字节为单位的\b 密钥的大小
    *对于 PEM 数据,这包括终止空字节,
    *`s\p keylen 必须等于` trlen(key)+ 1。

    我更改了 pBuf (位于 slefifWIFI.c LoadCertificateFile 中。) 长度设为+1并添加以 null 结尾的、则  mbedtls_xxx_parse 错误消失。

    因此、  当选择 PEM 时、mbedtls_xxx_parse 似乎需要以 null 结尾。

    ... 但在此之后、   

    mbedtls_ssl_handshake 返回 MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY。

    [SL-MBEDTLS::ERROR]    Failed ! mbedtls_ssl_handshake returned -0x7880

    是否有办法避免此错误?

    如果您有任何反馈、指导或建议、我将不胜感激。

    谨致问候。

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

    您好、Uru:

    是否可以提供更改  LoadCertificateFile()后当前获得的日志,并  在 slnestifWIFI.c 中将 debug_level 调整为3?

    一般情况下 ,mbedtls 使用.der 而不是.pem 有一个更容易的界面,所以 id 尝试转换您的 证书 ,看看这是否有用。

    此致、

    AVI Epstein.

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

    您好、Avi。

    感谢您的支持。

    >您能否提供日志。

    我插入日志。 (我用"XXXXXXXXXXXX"掩蔽了私人信息)

    e2e.ti.com/.../print_5F00_log.txt

    >转换证书并查看这是否有用。

    好的。 我会努力的。

    此外、作为其他信息、

    我尝试使用"mqtt_client_over_TLS_1_3_CC3235SF_LAUNCHXL_tirtos7_gcc"连接 AWS Core IoT。

    我在基本项目中更改了 MQTT 设置下方。

    MQTT_WAIT_QoS :mqtt_qos_0

    mqtt_连接_标志 MQTTCLISENT_NETCONN_URL | MQTTCLIENT_NETCONN_SEC

    mqtt_连接_地址 :AWS REST 端点

    客户端 ID[13] :我的 ID

    secureFiles :在登记物联网时提供

    char *MQTTClient_secureFiles[4] =
    {
    "private.pem.key", \
    "certificate.pem.crt", \
    "AmazonRootCA1.pem", \
    NULL
    };

    非常感谢您的支持。

    谨致问候。

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

    您好、Avi。

    感谢您的支持。

    有一点进展、因此我进行了更新。

    我放松 AWS IoT 核心策略,然后"SSL/TLS 握手完成"打印!!

    [SL-MBEDTLS::INFO]  Performing the mbedTLS SSL/TLS handshake...
    [SL-MBEDTLS::INFO]     Success ! SSL/TLS handshake completed !
    [SL-MBEDTLS::INFO]  Verifying peer X.509 certificate...
    [SL-MBEDTLS::INFO]     Success !

    但是...在这之后、打印了以下错误(MBEDTLS_ERR_SSL_CONN_EOF???)。

    [SL-MBEDTLS::ERROR]  mbedtls_ssl_read returned 0

    你能想到什么原因吗?

    我插入详细信息日志(在"SSL/TLS 握手完成"之后)。

    e2e.ti.com/.../mbedtls_5F00_ssl_5F00_read.txt

    我试过,

    >转换证书并查看这是否有用。

    使用、

    openssl x509 -inform pem -in xxxx.pem -outform der -out xxxx.der
    
    openssl rsa -inform pem -in xxxxKey.pem -outform der -out xxxxKey.der
    

    结果相同(mbedtls_ssl_read 返回0)。

    如果您有任何反馈、指导或建议、我将不胜感激。

    谨致问候。

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

    似乎服务器已关闭连接(在您发送第一条消息后)。 您能否从服务器端获得日志?

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

    嗨、Uru:

    在日志行55中:

    [SL-MBEDTLS::INFO_[?]  /../../../library/ssl_msg.c:2144:0x2000c1c8:ssl->f_recv (_timeout)()返回0 (-0x0000)

    我们可以看到 在 slnestifWIFI.c 函数回调中,SlRecvTimeout()返回0。  

    因此, SSL_msg.c mbedtls_SSL_fetch_input ()触发文件结束错误(MBEDTLS_ERR_SSL_CONN_EOF -0x7280)

    (根据服务器的行为、它可能是长度为0的消息或服务器未发送任何内容、或 Kobi 提到 对等设备的连接复位)

    我将设置 AWS IoT 服务器来重现 此问题。

    同时,我建议 更改 SlRecvTimeout()以将 recv 值0设置 为超时:

    static int SlRecvTimeout( void *h, unsigned char *buf, size_t len,
                          uint32_t timeout )
    {
        int ret;
        int sd = ((mbedtls_net_context *) h)->fd;
        WifiSock_t *pWifiSock = &ctx.wifiSocks[sd];
        if(pWifiSock == NULL)
            return SL_ERROR_BSD_EBADF;
    
        if(timeout)
        {
            SlNetSock_Timeval_t timeVal;
            // recv time out options
            //LOG_INFO("SlRecvTimeout timout length: %d ",timeout);
            timeVal.tv_sec =  timeout / 1000;// Seconds
            timeVal.tv_usec = (timeout%1000) * 1000;  // Microseconds. 10000 microseconds resolution
    
            // setting receive timeout option on socket
            sl_SetSockOpt(pWifiSock->slSock, SLNETSOCK_LVL_SOCKET, SLNETSOCK_OPSOCK_RCV_TIMEO, &timeVal, sizeof(timeVal));
        }
    
        //end of setting receive timeout option on socket
        ret = sl_Recv( pWifiSock->slSock, buf, len, 0);
        mbedtls_trace("net_recv_timeout:: fd=%d, len=%d (%d) \n\r",  pWifiSock->slSock, ret, len);
        PrintBuff(buf, ret);
    
        if(ret == SL_ERROR_BSD_EAGAIN || 0 == ret)
        {
            ret = MBEDTLS_ERR_SSL_TIMEOUT;
        }
        else if (ret < 0)
        {
            ret = MBEDTLS_ERR_NET_RECV_FAILED;
        }
        return (ret);
    }
    

    预期的输出应该 是 这样的:(这是一个有着很小的服务器连接的地方)

    [SL-MBEDTLS::INFO]     Success ! SSL/TLS handshake completed !
    [SL-MBEDTLS::INFO]  Verifying peer X.509 certificate...
    [SL-MBEDTLS::INFO]     Success !
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:5914: 0x2000c190: => write
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2793: 0x2000c190: => write record
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:0718: 0x2000c190: => encrypt buf
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:0979: 0x2000c190: before encrypt: msglen = 64, including 0 bytes of padding
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:1271: 0x2000c190: <= encrypt buf
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2881: 0x2000c190: output record: msgtype = 23, version = [3:3], msglen = 80
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2177: 0x2000c190: => flush output
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2194: 0x2000c190: message length: 85, out_left: 85
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2201: 0x2000c190: ssl->f_send() returned 85 (-0xffffffab)
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2229: 0x2000c190: <= flush output
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2937: 0x2000c190: <= write record
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:5938: 0x2000c190: <= write
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:5632: 0x2000c190: => read
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:4002: 0x2000c190: => read record
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:1962: 0x2000c190: => fetch input
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2116: 0x2000c190: in_left: 0, nb_want: 5
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2141: 0x2000c190: in_left: 0, nb_want: 5
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2144: 0x2000c190: ssl->f_recv(_timeout)() returned 5 (-0xfffffffb)
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2164: 0x2000c190: <= fetch input
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:3733: 0x2000c190: input record: msgtype = 23, version = [0x303], msglen = 74
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:1962: 0x2000c190: => fetch input
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2116: 0x2000c190: in_left: 5, nb_want: 79
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2141: 0x2000c190: in_left: 5, nb_want: 79
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2144: 0x2000c190: ssl->f_recv(_timeout)() returned 74 (-0xffffffb6)
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2164: 0x2000c190: <= fetch input
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:1306: 0x2000c190: => decrypt buf
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:1928: 0x2000c190: <= decrypt buf
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:3088: 0x2000c190: handshake message: msglen = 57, type = 4, hslen = 57
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:4076: 0x2000c190: <= read record
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:5478: 0x2000c190: received post-handshake message
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:5466: 0x2000c190: NewSessionTicket received
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:5632: 0x2000c190: => read
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_tls.c:3790: 0x2000c190: => handshake
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2177: 0x2000c190: => flush output
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_msg.c:2188: 0x2000c190: <= flush output
    [SL-MBEDTLS::INFO]  [?] ../../../../library/ssl_tls.c:3709: 0x2000c190: client state: MBEDTLS_SSL_TLS1_3_NEW_SESSION_TICKET

    请告诉我这是否有帮助。

    此致、

    艾弗·爱普斯坦

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

    您好、Avi。

    感谢您的支持。

    我尝试了您的 建议(更改 SlRecvTimeout()将 recv 值0设置 为超时)  

    结果是...

    -0x6800 (可能 已重复 MBEDTLS_ERR_SSL_TIMEOUT)。

    我插入日志。

     e2e.ti.com/.../SlRecvTimeout.txt

     

    我希望您的 AWS IoT 服务器重现此问题...

    谨致问候。

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

    您好、Uru:

    我正在内部检查此问题、并将尽快返回。

    此致、

    AVI Epstein.

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

    您好、Avi。

    感谢您的支持。

    我正在等待您的反馈。

    顺便说一下、

    是否可以使用"mqtt_client_CC3235SF_LAUNCHXL_tirtos7_gcc"连接到 AWS IoT?

    我 将在等待该 TT 反馈时尝试连接。

     

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

    是的、 AWS 不需要 TLS1.3、这样您就可以在网络处理器内部使用 TLS 堆栈的标准 MqttClient。

    您还可以参阅 CC32XX-AWS 插件(https://www.ti.com/tool/download/SIMPLELINK-CC32XX-PLUGIN-FOR-AWSIOT/4.30.00.02)、该插件使用 与 CC32xx SDK 集成的 Amazon C-SDK 库和示例。 插件的最后一个版本是4.30、因此需要进行一些调整才能使其在 SDK 7.10中正常工作(主要与 syscfg 相关)。