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.

[参考译文] CC3235SF:MQTT 安全问题

Guru**** 2487425 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1212794/cc3235sf-mqtt-security-question

器件型号:CC3235SF

您好!

我正在尝试让 MQTT 通信渠道的安全性发挥作用。 我当前收到-111错误(SLNETERR_ESEC_BAD_CERTIFIED)。 通过使用 slChecker 检查服务器似乎没有根证书。 我正在进行下载、但在翻过文档后、我不清楚如何将证书整合到 FW 中。 (这是我第一次使用 SSL/TLS 证书)。

欢迎提供任何建议。

谢谢

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

    请参阅 证书处理指南中的第2.5章(如果需要、请阅读更多信息)

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

    尊敬的 Kobi:

    我已经多次阅读了文档的这一部分、但它没有任何帮助。 我强烈怀疑我配置有问题、但不知道是什么。 下面我将介绍设置和问题。 我尝试过两种不同的证书。 一个是用于使 HTTP 安全正常工作的 Marty、另一个是我从我们的服务器获取的时候生成的。 Marty 的证书名为 bd-ca-cert.pem、会导致-111 (BSD_ECONNREFUSED)错误、我的证书名为 ca.intelliport.local.pem、并导致-688 (ASN_NO_signer_E)错误。 下面是我的各种设置:

    /// \details Broker Address Type, whether connection is secure (TLS) or not
    #define MQTT_CONNECTION_FLAGS           MQTTCLIENT_NETCONN_IP4
    /// \details Broker Address
    #define MQTT_CONNECTION_ADDRESS         "40.76.139.29"    // "4.240.112.28" "intelliportgw.eastus.cloudapp.azure.com"
    /// \details Broker Port
    #define MQTT_CONNECTION_PORT_NUMBER     8883
    
    #define GW_ROOT_CA                      "bd-ca-cert.pem"
    #define INTELLIPORT_CA                  "ca.intelliport.local.pem"
    #define MAX_CACERT_SIZE                 4096
    
    /* Number of files used for secure connection                                */
    #define CLIENT_NUM_SECURE_FILES  1
    
    /// \details MQTT Client ID
    static char                 g_client_id[13]     = "Test Client";
    /// \details Topic to publish next MQTT message to
    static char                 g_topic[255]        = {'\0'};
    /// \details Next MQTT message to publish
    static char                 g_mqtt_msg[765]     = {'\0'};
    /// \details Broker Address
    static char                 g_broker_addr[MAX_MQTT_BROKER_ADDR_LENGTH]  = {'\0'};
    /// \details Broker Port
    static uint16_t             g_broker_port;
    /// \details Broker Address Type, whether connection is secure (TLS) or not
    static uint32_t             g_broker_flags;
    /// \details Offset in topic buffer for end of serial number
    static uint8_t              g_sn_offset = 0;
    /// \details Flag for whether MQTT parameters should be changed or not
    static bool                 g_freeze_mqtt_param = false;
    /// \details Whether or not the broker address has been set yet
    static bool                 g_broker_addr_set   = false;
    /// \details Whether or not the broker port has been set yet
    static bool                 g_broker_port_set   = false;
    /// \details Whether or not the broker flags have been set yet
    static bool                 g_broker_flags_set  = false;
    /// \details MQTT connection status
    static mqtt_conn_status_t   g_m_conn_status     = MQTT_CONN_STATUS_DISCONNECTED;
    /// \details Handle for MQTT connection
    static MQTTClient_Handle    g_mqtt_client_handle;
    /// \details FW Versions returned from Gateway
    static gw_msg_fw_ver_t      gw_fw_versions;
    
    /// \details MQTT Initialization parameters
    MQTT_IF_InitParams_t g_mqtt_init_params =
    {
         MQTT_MODULE_TASK_STACK_SIZE,   // stack size for mqtt module
         MQTT_MODULE_TASK_PRIORITY      // thread priority for MQTT
    };
    
    /// \details MQTT Will Message Parameters
    MQTTClient_Will g_mqtt_will_params =
    {
         MQTT_WILL_TOPIC,   // will topic
         MQTT_WILL_MSG,     // will message
         MQTT_WILL_QOS,     // will QoS
         MQTT_WILL_RETAIN   // retain flag
    };
    
    /// \details MQTT Client Parameters
    MQTT_IF_ClientParams_t g_mqtt_client_params =
    {
         g_client_id,               // client ID
         MQTT_CLIENT_USERNAME,      // user name
         MQTT_CLIENT_PASSWORD,      // password
         MQTT_CLIENT_KEEPALIVE,     // keep-alive time
         MQTT_CLIENT_CLEAN_CONNECT, // clean connect flag
         MQTT_CLIENT_MQTT_V3_1,     // true = 3.1, false = 3.1.1
         MQTT_CLIENT_BLOCKING_SEND, // blocking send flag
         &g_mqtt_will_params        // will parameters
    };
    
    static char *Mqtt_Client_secure_files[CLIENT_NUM_SECURE_FILES] = {GW_ROOT_CA};
    
    MQTTClient_ConnParams g_mqtt_conn_params =
    {
        MQTTCLIENT_NETCONN_IP4 | MQTTCLIENT_NETCONN_SEC,
        MQTT_CONNECTION_ADDRESS,                 // SERVER_IP_ADDRESS,
        MQTT_CONNECTION_PORT_NUMBER,             // SECURED_PORT_NUMBER,
        SLNETSOCK_SEC_METHOD_SSLv3_TLSV1_2,
        SLNETSOCK_SEC_CIPHER_FULL_LIST,
        CLIENT_NUM_SECURE_FILES,
        Mqtt_Client_secure_files
    };
    
    
    // The connection call looks like this
    ret = MQTTClient_connect(mMQTTContext.mqttClient);

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

    你好 Kobi

    我正在阅读一些其他论坛帖子、并意识到我可以尝试将这两个文件一起使用、因此我将安全文件计数更改为4、并将其声明为:

    Static char * mqtt_Client_secure_files[client_NUM_SECURE_FILS]={GW_ROOT_CA、NULL、INTELLIPORT_CA、NULL};

    这改变了错误返回连接到-458 (BADPRIVATEFILE)进一步增加了我的怀疑,要么使用不正确的文件,或只是在文件列表中的顺序错误。

    John

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

    最后一次尝试是错误的。  MQTT_Client_secure_files 数组中的每个文件都应具有特定的证书:第一个是服务器的根 CA、后跟用户私钥和证书等。

    请先尝试使用 ca.intelliport.local.pem、 结果为-688。

    在前面的一章中,有一种方法可以检索服务器的正确根 CA (请参见 How to update the SimpleLinkSockEventHandler ())。

    这将为您提供正确的连接证书(印在终端上)。

    请下载并使用这一个。

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

    感谢您的帮助。 快速问题、在大多数示例中、套接字事件处理程序可能是空的、或者带有提示其未使用的注释。 在我的项目案例中、它是后者。 我向 switch 语句添加了额外的条件、并在函数的开头设置一个断点。 它没有被击中。 是否有办法启用该事件、以便我可以进行下一步?

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

    默认情况下启用该功能。

    如果您得到-688、您应该参加活动。

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

    我明白你在说什么,但不幸的是,这不是我看到的。 我得到-688返回代码,我在 SimpleLinkSockEventHandler ()函数的开头的 switch 语句上有一个断点。 该断点永远不会被命中。

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

    另一个数据点。 我不知道这是否重要,但我已经 尝试了我们的服务器上的 sslchecker。 当我针对默认端口运行它时、我返回一个未经供应商签名且 sslchecker 表示不可信的证书。 当我针对端口8883运行 sslchecker 时、我返回一个错误、指示没有找到证书。

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

    请添加打印消息(Marty 之前添加了此消息、以便他可以提供帮助)-可能断点未设置在正确的位置(由于优化)。

    您还可以向我们发送空气监听器日志、以 查找所需的确切证书。

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

    对于是否调用该事件处理程序函数、我们有不同的意见、因此我将 asm ("bkpt 1")设置为函数中的第一条指令。 拆解如下。 您可以看到该指令没有被优化掉、其下方是文档第2.5节中的代码。 我没有无线监听器、因此调用事件处理程序更为可取。 做了该实验后、我通过更改断点验证了该技术、其中我将-668返回代码返回到 asm ("bkpt 2");。 是有效的、因此该技术是有效的。

    //  338 //*****************************************************************************
    //  339 //
    //  340 //! This function handles socket events indication
    //  341 //!
    //  342 //! \param[in]  pSock - Pointer to Socket Event Info
    //  343 //!
    //  344 //! \return None
    //  345 //!
    //  346 //*****************************************************************************
    
            SECTION `.text`:CODE:NOROOT(2)
            THUMB
    //  347 void SimpleLinkSockEventHandler(SlSockEvent_t *pSock)
    //  348 {
    SimpleLinkSockEventHandler:
            PUSH     {R4,LR}
            MOVS     R4,R0
    //  349     asm("bkpt 1");
            bkpt 1
    //  350         
    //  351     if ( pSock->Event == SL_SOCKET_ASYNC_EVENT)
            LDR      R0,[R4, #+0]
            CMP      R0,#+2
            BNE.N    ??SimpleLinkSockEventHandler_0
    //  352     {
    //  353         switch (pSock->SocketAsyncEvent.SockAsyncData.Type)
            LDRB     R0,[R4, #+5]
            CMP      R0,#+5
            BNE.N    ??SimpleLinkSockEventHandler_1
    //  354         {
    //  355             case SL_SSL_NOTIFICATION_WRONG_ROOT_CA:
    //  356                 /* on socket error Restart OTA */
    //  357                 UART_PRINT("SL_SOCKET_ASYNC_EVENT: ERROR - WRONG ROOT CA\n\r");
            LDR.W    R0,??DataTable16_19
            BL       Report
    //  358                 UART_PRINT("Please install the following Root Certificate:\n\r");
            LDR.W    R0,??DataTable16_20
            BL       Report
    //  359                 UART_PRINT(" %s\n\r", pSock->SocketAsyncEvent.SockAsyncData.pExtraInfo);
            ADDS     R1,R4,#+8
            LDR.W    R0,??DataTable16_21
            BL       Report
    //  360             break;
            B.N      ??SimpleLinkSockEventHandler_0
    //  361 
    //  362             default:
    //  363                 /* on socket error Restart OTA */
    //  364                 UART_PRINT("SL_SOCKET_ASYNC_EVENT socket event %d \n\r", pSock->Event);
    ??SimpleLinkSockEventHandler_1:
            LDR      R1,[R4, #+0]
            LDR.W    R0,??DataTable16_22
            BL       Report
    //  365             break;
    //  366         }
    //  367     }
    //  368 
    //  369     /* This application doesn't work w/ socket - Events are not expected     */
    //  370     switch(pSock->Event)

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

    一些更多信息。 当我更改测试以使 MQTT 连接返回一个-342错误的证书错误时、事件处理程序中的断点被触发。 引发的事件是 SL_ERROR_BSD_ECLOSE (-15)、而不是我们正在寻找的事件。 因此、正在调用事件处理程序、但在-668错误的情况下不是这样。

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

    您得到的是-688还是-668?

    您需要 自己的连接证书还是仅需要服务器的根 CA?

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

    今天上午,我有条理地介绍了我们当前密钥和证书的所有可能的用途。 结果位于随附的文字文档中。 每个案例都包含文件、连接错误代码、连接标志以及是否存在套接字事件的详细信息。  

    e2e.ti.com/.../MQTT_5F00_Errors.docx

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

    111可能表示服务器未关闭以前的连接。 这可能是与证书设置无关的临时问题(如果使用相同的配置重试、则会得到不同的响应。 似乎只需要一个证书(服务器证书的根 CA)。  GW_ROOT_CA 不是正确的。

    -688必须与事件处理程序一起出现(我从未见过像你描述的那样的任何东西)。 如果您曾尝试打印、但仍然没有获得任何新信息-我建议您尝试使用另一个根 CA (例如、SDK 中的虚拟根 CA)。

    确保您已安装最新的 Service Pack。

     建议您 安装嗅探器。 请参阅 Wireshark 以了解详细信息并检查支持的软件狗。 它不应该太贵。

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

    感谢您提供的信息。 我正在寻找 Wireshark 来探测 Wi-Fi 数据包。 我需要了解它是否甚至允许它作为人们笔记本电脑上的应用程序。 我可以看出他们可能对此不满意的原因。 几年前、我在另一个 Wi-Fi 项目中使用了 Airpcap 的 Wireshark、它非常有用、所以您的观点非常好。  

    有趣的是,您说只需要服务器的根 CA。 当我将证书放入 sslChecker 时、它指示根 CA 缺失、并提供了下载。 可悲的是,它没有工作,没有下载完成。

    我将查看服务包。

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

    尝试使用 dummy-root-ca-cert.连接 您应该得到-688、希望它会附带异步套接字事件。