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.

[参考译文] CC3220:在 TLS 模式下使用 M2M.eclipse 代理创建 CC3220的 CA 证书、连接到服务器时出错-456

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/714730/cc3220-creating-ca-certificate-for-cc3220-using-m2m-eclipse-broker-in-tls-mode-error--456-in-connecting-to-the-server

器件型号:CC3220

我正在努力使用 CA 证书在 CC3220上设置安全 MQTT TLS 通信。  我知道我有一个从 Windows "DST root CA X3"中的证书寄存器获得的有效 CA 证书、该证书以 mqtt_cert.der/或.MQTT_cert.PEM"格式保存、这些副本都使用 MQTT.FX 进行测试、以在安全 TLS 模式下连接到 m2m.eclipse.org 代理、并且工作正常。

但是、在尝试设置安全套接字并连接到此套接字时、将此证书存储在 CC3220 Launchpad 中会导致问题(请查看下面的代码):

   //Step 6:连接到服务器
   iStatus = sl_Connect (SsockID、(SlSockAddr_t *)&sAddr、iAddrSize);-->错误 iStatus =-456、这意味着:

#define SL_ERROR_BSD_ESECBADCAFILE                                     (-456L)/*错误安全级别错误 CA 文件*/

 我认为这与我在示例项目中存储证书的方式/位置有关?!! 您对此问题有什么想法吗?

我尊重介绍如何使用 Uniflash 刷写证书的文档 、但我不知道为什么会出现此问题?

/*********
 *使用 TLS 连接到代理安全模式
 秘书长的报告 /
#define MQTT_TLSport         8883
#define SL_TLS_CA_CERT_FILE_NAME   "mqtt_cert.der"
#define SERVER_NAME              "m2m.eclipse.org  
int connectToBroker_TLSmode()

   SlSockAddrIn_t sAddr;
   Int iAddrSize;
   Int iStatus;

   //TODO:由代理信息更新
   //填充 TCP 服务器套接字地址
   G_ulDestinationIp_= IP_Addrs;
   sAddr.sin 系列= sl_AF_iNet;
   sAddr.sin 端口= sl_Htons (无符号短整型) MQTT_TLSport);
   sAddr.sin addr.s_addr = sl_Htonl ((unsigned int) g_ulDestinationIp_);
   iAddrSize = sizeof (SlSockAddrIn_t);

   //   certifications.PrivateKey = sl_so_secure_files_private_key_file_name; //映射私钥,0文件不存在
   //   certifications.Certificate = sl_SO_SECURE_FILES _certificate_file_name; //映射证书,0文件不存在
   //   certifications.ca = sl_SO_SECURE_FILES_CA_FILE_NAME/*129*/;//映射 CA,0文件不存在
   //   certifications.dh = sl_SO_SECURE_FILES_PEER_CERT_OR_DH_KEY_FILE_NAME; //映射证书,0文件不存在
   certificates->SecureFiles[0]= 0;
   certificates->SecureFiles[1]=0;
   certificates->SecureFiles[2]=sl_so_secure_files_CA_file_name;
   certificates->SecureFiles[3]=0;
   //Step 1:设置设备验证证书的时间。
   //设置设备中的当前时间(必需)
   iStatus = SET_TIME();
   if (iStatus < 0)
   {
       UART_PRINT ("无法在设备中设置时间");
       返回 iStatus;
   }
   //Step 1bis:获取主机名
//   unsigned int uiIP;
//   iStatus = sl_NetAppDnsGetHostByName (g_Host、strlen ((const char *) g_Host)、(unsigned long*)&uiIP、sl_AF_iNet);
//
//   if (iStatus < 0)
//   {
//       uart_print ("设备无法检索主机名\n\r");
//       返回 iStatus;
//   }
//
//  sAddr.sin 系列= sl_AF_iNet;
//  sAddr.Sin_port = sl_Htons (MQTT_TLSport);
//  sAddr.sin addr.s_addr = sl_Htonl (uiIP);
//  iAddrSize = sizeof (SlSockAddrIn_t);
   //Step 2:打开安全套接字(必需)
   /// CC3220器件必须打开安全套接字。
   //sl_Socket ()函数可与设置为 SL_SEC_Socket (值=100)的"协议"参数一起使用。
   SsockID = sl_Socket (sl_AF_iNet、sl_sock_stream、sl_SEC_Socket);
   IF (SsockID < 0)
   {
       UART_PRINT ("设备无法创建安全套接字\n\r");
       ASSERT_ON_ERROR (SOCKET_CREATE_ERROR);
   }

  //Step 3:Force Specific Method (可选)
  //默认情况下,启用 SSL 3.0和 TLS 1.2。 可以通过使用 sl_SetSockOpt ()函数强制使用特定方法。
  /* unsigned char   ucmethod = sl_SO_SEC_METHOD_SSLv3;
   iStatus = sl_SetSockOpt (SsockID、sl_SOL_Socket、sl_SO_SECMETHOD、&ucmethod、sizeof (ucmethod));
   if (iStatus < 0){
       UART_PRINT ("设备无法设置套接字选项\n\r");
       返回 iStatus;
   }
    *
   //Step 4:Force Specific cipher (强制特定密码)(可选)
   //默认情况下,CC3220将选择连接两侧都可以支持的最安全的密码套件。
   //可以使用 sl_SetSockOpt ()函数强制使用特定的密码。
   /*unsigned int uiCipher = sl_SEC_MASK_SSL_RSA_ITH_RC4_128_SHA;
   iStatus = sl_SetSockOpt (SsockID、sl_SOL_Socket、sl_SO_SECURE_MASK、&uiCipher、sizeof (uiCipher));
   if (iStatus < 0){
       UART_PRINT ("设备无法设置套接字选项\n\r");
       返回 iStatus;
   }
    *
  //Step 5:为 TLS/SSL 配置 SecureFiles
  //CC3220使用特定于 TLS/SSL 的文件、用户可以在应用程序级别定义这些文件。
  //所需的文件根据连接类型在下面列出,并且必须以 DER 格式表示。
  //TODO:添加证书
    //添加证书:我们将在开始时使用 google 证书进行测试
   //if (certificates!= NULL){
       iStatus = SL_SetSockOpt (SsockID、SL_SOL_Socket、SL_SO_SECURE_FILES_CA_FILE_NAME、SL_TLS_CA_CERT_FILE_NAME、sizeof (SockSecureFiles_t));
       if (iStatus < 0)
       {
           UART_PRINT ("设备无法设置套接字选项\n\r");
           返回 iStatus;
       }
       //Step 5bis:验证.....
       iStatus = sl_SetSockOpt (SsockID、sl_SOL_Socket、sl_SO_SECURE_DOMAIN_NAME_VERIFICATION、g_Host、strlen ((const char *) g_Host));
       if (iStatus < 0)
       {
           UART_PRINT ("设备无法设置套接字选项\n\r");
           返回 iStatus;
       }
   //}
   //Step 6:连接到服务器
   iStatus = sl_Connect (SsockID、(SlSockAddr_t *)&sAddr、iAddrSize);
   如果(iStatus < 0)
   {
       //错误
       UART_PRINT ("步骤6 \n"r);
       UART_PRINT ("设备无法连接到服务器\n\r");
       sl_close (SockID);
       ASSERT_ON_ERROR (CONNECT_ERROR);
   }
   返回成功;

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

    您好、Mohammed、

    错误 -456表示 NWP 在指定文件名处找不到有效的证书文件。 通常这意味着证书文件已损坏或格式错误、但在您的情况下、最可能是由于错误的 SL API 调用导致无法正确解析证书文件的文件名。 具体而言、对于 SL_SetSockOpt (SsockID、SL_SOL_Socket、SL_SO_SECURE_FILES_CA_FILE_NAME、...) 调用、最后一个参数应为 sl_tls_CA_CERT_file_name 的 strlen()、而不是 SlSockSecureFiles_t 结构的大小。

    请将该呼叫更正为:

    iStatus = SL_SetSockOpt (SsockID、SL_SOL_Socket、SL_SO_SECURE_FILES_CA_FILE_NAME、SL_TLS_CA_CERT_FILE_NAME、strlen (SL_TLS_CA_CERT_FILE_NAME)); 

    有关安全套接字如何在 CC3220上工作的其他信息、请查看此处提供的安全套接字 SimpleLink Academy:

    http://dev.ti.com/tirex/#/?link=Software%2FSimpleLink%20CC32xx%20SDK%2FSimpleLink%20Academy%2FWi-Fi%2FWi-Fi%20Secure%20Sockets

    请告诉我、这是否能解决您的问题、或者您还有其他问题。


    此致、
    Michael

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

    非常感谢您的帮助、问题得到解决、安全套接字设置完美。

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

    您好、Michael、

    设置安全套接字后、我尝试使用该套接字发送数据、我们的实施基于泛美卫生组织库(请查看底部)、它在 MQTT 清除模式下工作正常。

    在我们的情况下,发送数据过程使用安全套接字执行,但当我使用清除模式代理(端口1883,不带 CA)订阅主题时,我还会接收数据?! 哪些不应被允许?!

    是否应该在发送命令中执行特殊操作? 或者在配置安全套接字之后?

    代码:

    #ifdef SECURE_SOCKET

      connectToBroker_TLSmode();

    其他

      connectToBroker();

    #endif //secure_socket

      //使用 MQTT 发布消息

      MQTTPacket_connectData 数据= MQTTPacket_connectData_initializer;

      unsigned char buf[200];

      MQTTString topicString = MQTTString_initializer;

      /*char* payload ="mypayload";

      int payloadlen = strlen (payload);**/

      int messagelen = strlen (message);

      int buflen = sizeof (buf);

      data.clientID.Cstring ="me";

      data.keepaliveInterval = 20;

      data.清洁= 1;

      int len = MQTTSerialize_connect (buf、buflen、&data);/* 1 */

      topicString.cstring ="muco";

      len += MQTTSerialize_publish (buf + len、buflen - len、0、0、0、0、 0、

                    topicString、(unsigned char*)消息、

                    messagelen);/* 2 */

      len += MQTTSerialize_disconnect (buf + len、buflen - len);/* 3 */

      /*

      调用在 MQTT 内发送数据的同时

      *

      SendData (buf、len);

      UART_PRINT (

          "\n\r\n 成功执行向中介程序发布 MQTT 消息\n");

     

    此致、

    穆罕默德。

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

    您如何检查您在端口1883上建立的连接是否不安全? 如果您尝试使用安全套接字连接到不支持安全连接的服务器、则应获得 sl_Other_Side Close_SSL_data_not _encrypted async 事件。

    您的服务器可能还支持端口1883上的 TLS 连接? 如果您使用 PC 连接并监控与 Wireshark 的连接、您是否看到正在发生 TLS 握手?

    此致、
    Michael