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.

[参考译文] CC3100MOD:使用 TLSv1设置 TCP 连接时出现问题

Guru**** 2535740 points
Other Parts Discussed in Thread: UNIFLASH, CC3100MOD, CC3100, CC3100SDK

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/660033/cc3100mod-problems-with-setting-up-a-tcp-connection-with-tlsv1

器件型号:CC3100MOD
主题中讨论的其他器件:UNIFLASHCC3100CC3100SDK

你(们)好

我正在使用 MQTT 协议(TCP/IPv4)对物联网网络进行编程。 使用泛美卫生组织的库,我成功地制作了一个 API,其中我有正确连接、ping、pub/sub 和断开的函数。

现在、对于下一步、我想为安全连接实施 TLS。 为此,我已经采取了以下步骤来实现这一目标,但没有成功。

1.使用 OpenSSL 制作证书(适用于基于证书的 TLS)。  

我已使用 iosto 服务器和 GUI MQTT 客户端应用程序测试了证书。 所以这里没有问题。

2.将客户端的证书转换为.der 文件,并创建一个 C 应用程序,将.der 文件转换为字节数组。

我已经这样做了、因此我可以使用 FS_API (uniflash 不是一个选项)、但如果这是正确的方法、我不会这样做。 运行该应用程序后、我复制了字节阵列、该应用程序输出并将其粘贴到 CCS 应用程序中的数组中。 该文件是使用名称参数 "mqtt_ca.der"在 cc3100mod 上创建的(我已经测试过此文件)。

3.我编写了以下函数来连接到服务器:

_u32 cipher = sl_SEC_MASK_TLS_RSA_WITH_AES_128_CBC_SHA256;
_u8 method = sl_SO_SEC_METHOD_TLSv1;

int TLSConnectNetwork (int g_SockID、SlSockAddrIn_t sAddr、SlsockSecureFiles_t*证书、
unsigned char sec_method、unsigned int cipher)
{

Int addrSize;
Int RetVal;

addrSize = sizeof (SlSockAddrIn_t);

G_SockID = sl_Socket (sl_AF_iNet、sl_sock_stream、sl_SEC_Socket);
if (g_SockID < 0){
返回-1;
}

SlSockSecureMethod 方法;
method.secureMethod = sec_method;
RetVal = sl_SetSockOpt (g_SockID、sl_SOL_Socket、sl_SO_SECMETHOD、&method、sizeof (method));
if (RetVal < 0){
返回 RetVal;
}

SlSockSecureMask;
mask.secureMask =密码;
RetVal = sl_SetSockOpt (g_SockID、sl_SOL_Socket、sl_SO_SECURE_MASK、&MASK、sizeof (MASK));
if (RetVal < 0){
返回 RetVal;
}


RetVal = sl_SetSockOpt (g_SockID、sl_SOL_Socket、sl_SO_SECURE_FILES_CA_FILE_NAME、sl_SSL_CA_CERT、strlen (sl_SSL_CA_CERT));
if (RetVal < 0)
{
返回 RetVal;
}


RetVal = sl_Connect (g_SockID、(SlSockAddr_t *)&sAddr、addrSize);
if (RetVal < 0){
sl_close (g_sockID);
返回 RetVal;

}

返回 RetVal;
} 

我在网络编程方面比较陌生、从未使用过 TLS/SSL、所以有人能帮我吗?

提前感谢!

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

    必须将证书加载到串行闪存中。 请参阅之前有关此主题的 E2E 帖子:

    e2e.ti.com/.../573671

    此帖子可能会带您进入量产线指南、以便从主机将文件写入串行闪存:

    processors.wiki.ti.com/.../CC3100_Production_Line_Guide

    然后、要正确映射认证并打开 TLSv1、请参阅 CC3100 SDK 中的 CC3100 SSL 示例。 下面的 Wiki 页面:

    processors.wiki.ti.com/.../CC3200_SSL_Demo_Application

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

    是的、我查看了所有这些文档、了解 FS API 的工作原理、并了解完成安全连接所需采取的步骤。
    我遇到的问题是、在我甚至可以使用 FS API 之前、没有有关如何处理.der 文件(证书)的示例代码或文档。 我曾说过、我只需编写一个代码、该代码会将文件转换为十六进制字节数组、然后将其复制到我的代码中。

    我希望这里有人能有使用 FS API 上传证书的经验。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、卡斯帕尔、

    我认为我误解了您在证书验证过程中所处的位置。

    如果您未使用 Uniflash、那么您是否正确接收到 OTA 证书(无线)? 您接收的文件应采用.der 格式、您无需将其转换为其他格式。

    如果您需要有关 OTA 器件的帮助、请参阅以下目录中的 SDK 示例:

    C:\ti\cC3100SDK_1.2.0\cC3100-SDK\examples\ota_sample_app

    您是否已成功将证书写入串行闪存?

    有关 创建文件和写入文件系统的信息、请参阅 "一节。">www.ti.com/.../swru368的"串行闪存文件系统"一节。

    可在下面的 SDK 示例中找到写入文件系统的示例代码:

    C:\ti\cC3100SDK_1.2.0\cC3100-SDK\examples\file_operations

    希望这对您有所帮助、
    Kevin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kevin:

    感谢您再次回复。 我使用文件系统 API 上传证书、而不是 OTA API。

    否、我不知道我是否正确上传了证书。 我已将证书转换为.der 文件。 但我不知道如何正确使用文件系统 API。 该示例仅介绍如何在 CC3100上创建文件并在数组中使用文本填充该文件... 而不是在桌面上载文件。
    那么、我所做的是获取.der 文件、并使用一个自写 C 应用程序将其转换为一组十六进制数字、然后将这个十六进制字节的长字符串粘贴到一个数组中。 然后将该阵列上传到 CC3100 (希望这将正确传输文件)。

    我不知道这是不是正确的方式。 我已经阅读了所有可用的文档、但找不到任何内容。 那么、您能否逐步告诉我、如何正确使用 API 将计算机上的 certificate.der 传输到使用文件系统 API 的 cc3100?

    提前感谢

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

    您好、卡斯帕尔、

    您的 CC3100串行闪存是否已格式化、服务包是否已正确刷写? 请参阅产品线 Wiki 中的"使用主机 UART 连接格式化"一节、了解如果不使用、如何执行此操作、 请访问 http://processors.wiki.ti.com/index.php/CC3100_Production_Line_Guide

    该过程类似于产品线 Wiki 中的"从主机向串行闪存写入文件"部分中的服务包示例。

    您的.der 证书需要转换为 C 数组、正如您所说的、并存储在主机处理器上。 然后、您将需要打开/创建分配必要空间量的用户文件(以后不能增加此空间)。

    RetVal = sl_FsOpen ("CertName.dir"、
    FS_MODE_open_create (size_xx_Bytes、_FS_file_open_FLAG_COMMIT|_FS_file_public_write|等)、
    &Token、&fileHandle); 

    然后,将证书数组写入刚才创建的文件:

    /*对证书进行编程*/
    remainingLen = sizeof (certArray);
    movingOffset = 0;
    chunkLen =(_u32) find_min (1024 /* chunch_LEN*/、remainingLen);
    //由于在以后的修补程序中解决了错误,刷写操作以1024字节的块完成*/
    
    执行
    {
    RetVal = sl_FsWrite (fileHandle、movingOffset、(_u8 *)&certArray[movingOffset]、chunkLen);
    
    如果(RetVal < 0)
    {
    /*无法对证书进行编程*/
    返回-1;
    }
    
    remainingLen --chunkLen;
    movingOffset += chunkLen;
    chunkLen =(_u32) find_min (1024 /* chunch_LEN*/、remainingLen);
    
    } while (chunkLen >0); 

    然后关闭文件:

    /*关闭证书文件*/
    RetVal = sl_FsClose (fileHandle、0、0、0);
    
    if (RetVal < 0)
    {
    /*无法关闭 Service Pack 文件*/
    返回-1;
    } 

    然后、您的证书应存储在串行闪存中。

    希望这对您有所帮助、

    Kevin

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

    否、我尚未对 CC3100进行格式化。 我不知道这是必要的。 TI 是否有用于格式化闪存的示例代码?

    好的、我在刷写证书的正确路径上。 我将尝试格式化 CC3100并在之后刷写证书

    谢谢、

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

    您好、卡斯帕尔、

    串行闪存的格式化可在 uniflash 中执行、也可由主机处理器执行。

    这些步骤在 http://processors.wiki.ti.com/index.php/CC3100_Production_Line_Guide 中进行了说明。 请参阅以下章节:

    在生产线上对 CC3100 QFN 进行编程

    2.使用主机 UART 连接格式化(如果使用主机处理器进行格式化)

    最棒的

    Kevin