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.

[参考译文] BOOSTXL-CC3135:MQTT 安全通信程序

Guru**** 2394305 points
Other Parts Discussed in Thread: BOOSTXL-CC3135, UNIFLASH, CC3135

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/877877/boostxl-cc3135-mqtt-secure-communication-procedure

器件型号:BOOSTXL-CC3135
主题中讨论的其他器件:UNIFLASH

您好!  

我正在尝试评估 MQTT_CLIENT 示例的安全通信功能   、该示例是我创建并从 simplelink_sdk_wifi 插件_2_40_00_22\examples\rtos\MSP_EXP432E401Y\demos\MQTT_CLIENT 移植到 STM32L4微控制器和 BoostXL-CC3135评估模块。  

 我了解到、首先我必须在 CC3135 模块的闪存中刷写我的亚马逊证书。  

因此、在我的嵌入式软件中、我添加了代码、允许我在 CC3135 闪存中的所用代码下方写入证书文件:  

1
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18
19.
20.
21.
22.
23
24
25
26
27.
28.
29.
30
31.
32
33.
34
#define CERT_WRITE_CHUNK_SIZE 1500
int32_t writeCert(uint8_t *data , uint32_t len)
{
  int32_t fHdl;
  uint8_t fileName[] = "/cert/iot/cert.pem";
  int32_t status;
  uint32_t offset;
  uint32_t writeLen;
  fHdl = sl_FsOpen(fileName, SL_FS_CREATE | SL_FS_OVERWRITE |
                   SL_FS_CREATE_PUBLIC_READ | SL_FS_CREATE_MAX_SIZE( len ), NULL);
  if( fHdl >= 0 )
  {
    offset = 0;
    do
    {
      if(len < CERT_WRITE_CHUNK_SIZE)
      {
        writeLen = len;
      }
      else
      {
        writeLen = CERT_WRITE_CHUNK_SIZE;
      }
      status = sl_FsWrite(fHdl, offset, &(data[offset]), writeLen);
      offset += writeLen;
    }while(offset < len);
    sl_FsClose(fHdl,0,0,0);
    return0;
  }
  else
  {
    return-1;
  }
}

成功执行此函数后、我尝试使用安全选项连接到 MQTT 代理、遗憾的是、连接结果失败、代码为-688 (sl_error_BSD_ESEC_ASn_NO_signer_E)。  

请注意、我使用了在  https://www.amazontrust.com/repository/SFSRootCAG2.pem 下找到的 CA 证书。  

我对该论坛进行了多次研究、并了解到我应该使用此链接中提供的证书:https://certs.secureserver.net/repository/sf-class2-root.crt、并且证书未正确添加到 CC3135 闪存中。  

因此、借助 Uniflash 工具、我能够刻录我在以下链接中找到的亚马逊根证书: https://certs.secureserver.net/repository/sf-class2-root.crt。 因此、安全 MQTT 连接已建立、 因此我有几个问题需要补充:  

  1. 使用 Uniflash 工具编写 CA 证书与我上面提到的代码源有何区别? (writeCert 函数),请注意,对于相同的 CA 文件,如果我使用 Uniflash 烧录证书 ,相反,使用 writeCert 函数,MQTT 连接函数返回失败(-456),MQTT 就可以正常工作。 我认为我应该修改 sl_FsClose (fHdl、0、0);函数参数、 方法和原因?
  2. 我使用的是非 TI wifi 模块,为了进行安全 MQTT 通信,我使用的是在 https://www.amazontrust.com/repository/SFSRootCAG2.pem 下找到的 CA 证书。 我在 CC3135 WIFI 模块中使用了相同的 CA 文件,结果是-688,为什么? 之后,我在该链接(https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/p/789112/2919312#2919312 )中找到 应该使用名为 SF-class2-root 的证书。 那么、这些证书之间有什么区别?为什么我应该使用 SF-class2-root 证书而不是 SFSRootCAG2证书?  
  3. 当使用 MQTT 客户端示例进行安全 MQTT 通信时、UART 日志为:  

.CONNACK:

连接成功

客户已在/Broker/To/cc3135上订阅

,次 Ack:

授予的 QoS 级别包括:

/Broker/To/cc3135 :QoS 0


那么,如何验证 SSL 握手是否成功完成? 我是否可以假设我的通信是安全的?  

是否有任何方法 可以检查握手过程?   

 我发现唯一一个有意义的注释是在 sl_SSL_notification_connected 安全回调案例下从未执行的,我认为这是因为它是在 sl_socket_ASYNC_EVENT 事件( simplelink_sdk_wifi 插件_2_40_00_22\examples\rtos\mqTT 客户端示例的 network_ic.c 文件)  

4.我在使用安全通信之前和之后测量了 MQTT 吞吐量, 我注意到即使使用安全通信,MQTT 吞吐量结果也不会改变! 这是正常的吗?

我知道在使用 SSL 通信时、每个传输的数据包都添加了几个数据、因此 我预计会丢失吞吐量。  

那么、我的吞吐量不会改变是正确的吗?

如果不是,通常是通过 MQTT 吞吐量结果的除法来实现的?  

此致、  

Ghada  

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

    您好、Ghada、

    通常,如果 writeCert ()函数不能成功连接,那么 root_ca_pem []数组的格式不正确。 您可以查看此主题、该主题还介绍了如何连接到 AWS IoT 以获得格式正确的证书阵列:

    https://e2e.ti.com/support/tools/ccs/f/81/t/876972

    但是、您在代码中使用的 SL_FS* API 将产生与 Uniflash 写入串行闪存相同的输出。 对器件进行编程时、Uniflash 实际上会向 NWP 发送命令以使用这些相同的 API。

    2.至于您需要提供的根 CA,特别是 Starfield Class 2认证机构,而不是您以前使用的证书,这与服务器的证书链的交叉签名方式有关。 有关更详细的说明、请参阅我的文章:

    https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/p/789112/2919312#2919312

    握手中的任何错误都将导致 SimpleLinkSockEventHandler()接收事件或直接在 MQTT 连接函数处收到错误。 如果没有返回错误、则 TLS 连接成功。

    4.您在测试前后测量的吞吐量是多少?您是如何执行测试的? 尽管实现了安全性、但吞吐量仍能保持恒定的原因有很多。 最明显的是服务器端限制您。 但是、如果吞吐量保持相同的安全性、我不会过于担心。

    如果您需要进一步澄清或有进一步的问题、请告诉我。

    此致、

    Michael