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.

[参考译文] CC3200 SMTP 示例移植到 CC3220SF

Guru**** 2562870 points
Other Parts Discussed in Thread: CC3220SF, CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/898006/cc3200-smtp-example-porting-to-cc3220sf

器件型号:CC3220SF-LAUNCHXL
主题中讨论的其他器件:CC3220SFCC3200

您好!

    我正在尝试将 cc3200 SMTP 示例移植到 cc3220sf。

    smtp.google.com 如何在不提供证书的情况下工作?

    仅配置 安全方法和安全密码器。

eMailServerSetting.Family = AF_iNet;
eMailServerSetting.Port = Gmail_host_port;
eMailServerSetting.SecurityMethod = SL_SO_SEC_METHOD_TLSv1_2;
eMailServerSetting.SecurityCypher = SL_SEC_MASK_TLS_RSA_ITH_AES_256_CBC_SHA;
lRetVal = sl_NetAppEmailSet (sl_NET_APP_EMAIL_ID、\
netapp_advanced_opt,\
sizeof (slNetAppEmailOpt_t)、\
(无符号字符*)&eMailServerSeting); 

  连接到 smtp.google.com 时没有提供证书我检查了源代码,也没有配置证书安全连接的工作方式?

  

谢谢、此致、

        瓦苏

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

    您好、Vasu、

    在另一侧似乎未使用证书进行验证。 请参阅_smtpConnect()函数内的代码:

    //如果成功,连接到套接
    字状态= sl_Connect (g_lSmtpSocket,(SlSockAddr_t *)&LocalAddr,
    LocalAddrSize);
    if ((Status < 0)&&(sl_ESECSNOVERIFY!= Status)
    ){
    return -1;
    }
    //成功
    返回成功; 

    如果也发生错误 SL_ESECSNOVERIFY、则返回连接成功。

    #define SL_ESECSNOVERIFY (-453)/*在没有服务器验证的情况下连接*/ 

    1月

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

    您好、Jan、

          感谢您的回答。

          已尝试在没有证书的情况下连接 smtp.gmail.com,但未从服务器接收问候消息。

          

    //如果不需要 TLS
    其他
    {
    //创建套接字
    G_lSmtpSocket = sl_Socket (sl_AF_iNet、sl_sock_stream、sl_IPPROTO_TCP);
    //检查套接字是否已成功创建
    IF (g_lSmtpSocket ==1)
    {
    sl_Stop (90);
    返回-1;
    }
    }
    //如果成功,连接到套接字
    状态= sl_Connect (g_lSmtpSocket、(SlSockAddr_t *)&LocalAddr、
    LocalAddrSize);
    if ((状态< 0)&&(sl_ESECSNOVERIFY!=状态))
    {
    返回-1;
    }
    //成功
    返回成功; 

       在连接未接收到来自服务器的任何数据包后、我使用 Wireshark 进行了检查。

       测试完成后、我尝试将一些数据写入服务器响应(TLSv1)证书错误(Wireshark)连接已关闭。

       我必须使用安全套接字?

         CC3200示例代码:

    eMailServerSetting.SecurityMethod = SL_SO_SEC_METHOD_TLSv1_2;
    eMailServerSetting.SecurityCypher = SL_SEC_MASK_TLS_RSA_ITH_AES_256_CBC_SHA; 

       源代码:

       

    //如果需要 TLS
    if (g_sEmailOpt.SecurityMethod<=5)
    {
    //创建安全套接字
    G_lSmtpSocket = sl_Socket (sl_AF_iNet、sl_sock_stream、sl_SEC_Socket);
    //检查套接字是否已成功创建
    IF (g_lSmtpSocket ==1)
    {
    sl_Stop (90);
    返回-1;
    }
    slTimeval_t tTimeout;
    tTimeout.tv_sec=10;
    tTimeout.tv_usec=90000;
    状态= sl_SetSockOpt (g_lSmtpSocket、sl_SO_RCVTIMEO、0、&tTimeout、
    sizeof (slTimeval_t));
    
    char 方法= g_sEmailOpt.SecurityMethod;
    
    长密码= g_sEmailOpt.SecurityCypher;
    
    //设置刚才定义的套接字选项
    状态= sl_SetSockOpt (g_lSmtpSocket、sl_SOL_Socket、25、&method、
    sizeof (method));
    if (状态< 0)
    {
    sl_close (g_lSmtpSocket);
    返回-2;
    
    }
    状态= sl_SetSockOpt (g_lSmtpSocket、sl_SOL_Socket、26、密码(&C)、
    sizeof (cipher);
    if (状态< 0)
    {
    sl_close (g_lSmtpSocket);
    返回-2;
    
    }
    } 

           我没有 cc3200设备,如果没有提供连接到 Gmail 服务器的证书,该怎么办?

            请提供一些解决方案来解决此问题。

    谢谢、此致、

        Vassu

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

    Vassu、您好!

    遗憾的是、我无法从 CC3200 SDK 深入挖掘此 SMTP 代码。 因为我在 CC3220器件上使用自己的 SMTP 代码、因此我没有任何移植任何旧 CC3200代码的动力。 但是、您能够使用宏 SL_ESECSNOVERIFY 在 CC3220器件上编译代码、这一点让我有一点惊讶。 因为此宏不在 CC32xx SDK 中使用、并且有不同的宏 SL_ERROR_BSD_ESECSNOVERIFY

    我可以向您提供我在代码中执行的确切步骤(与 Gmail SMTP 服务器配合使用时不会出现任何问题):

    • 创建安全套接字
      socketTCP = sl_Socket (sl_AF_iNet、sl_sock_stream、sl_SEC_Socket); 
    • 仅将安全方法设置为 TLS 1.2
      method.SecureMethod = SL_SO_SEC_METHOD_TLSv1_2;
      RetVal = SL_SetSockOpt (socketTCP、SL_SOL_Socket、SL_SO_SECMETHOD、&METHOD、 sizeof (slSockSecureMethod_t)); 
    • 设置默认密码套件掩码
      mask.SecureMask = sl_SEC_MASK_SECURE_DEFAULT;
      RetVal = sl_SetSockOpt (socketTCP、sl_SOL_Socket、sl_SO_SECURE_MASK、&MASK、 sizeof (slSockSecureMask_t)); 
    • 在我的连接代码内部,我忽略 API sl_Connect()的返回代码 SL_ERROR_BSD_ESECSNOVERIFY。 如果返回此代码、我知道已建立未经验证的安全连接。

    我不确定是否仅设置 TLS1.2的默认密码套件掩码和设置安全性是强制性步骤。 您需要自行解决这个问题。

    BTW... 不要忘记在 Gmail 设置中启用"通过不太安全的应用程序访问 Gmail "。

    1月

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

    您好、Jan、

        感谢您的回答。

        因为此宏不在 CC32xx SDK 中使用、并且有不同的宏 SL_ERROR_BSD_ESECSNOVERIFY。

              -首先从 TCP 连接开始、并尝试建立 TLS 连接、而不复制 CC3200相同的代码。

       我正在尝试连接 smtp.gmail.com 您知道我必须使用哪个证书?

        如果使用 TCP + TLS 证书,我可以从服务器接收问候消息?

    谢谢、此致、

           瓦苏

         

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

    您好、Vasu、

    个人而言、我不使用证书连接到 SMTP 服务器 smtp.gmail.com。 但是、如果您要为 G Suite 使用证书、请阅读 本文

    即使没有证书、您也会看到 SMTP 代码220的欢迎响应。

    1月

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

    您好、Jan、

         感谢您的回答。

         即使没有证书、您也会看到 SMTP 代码220的欢迎响应。

               -连接成功后,未收到任何来自服务器的数据包。

              连接 后,我正在等待读取呼叫,但没有接收任何数据包。

              -一段时间后连接关闭。

         

     

         连接后,为什么不能收到欢迎回复?

    谢谢、此致、

         瓦苏

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

    您好、Vasu、

    因为您没有使用安全连接。 SMTP 服务器需要 TCP 端口465处的 SSL/TLS 通信。 在您进行3路握手(SYN、SYN ACK、ACK)后、没有表明已正确打开安全连接的 SSL/TLS 数据交换。

    如果要测试与 SMTP 服务器的不安全连接,可以连接到端口25。 但连接后、您需要使用 SMTP 命令 STARTTLS 从不安全的套接字切换到安全套接字。 CC3200的 SMTP 客户端库不支持 StartTLS、因为设备本身不支持将套接字从不安全升级到安全。 CC3220器件支持此类套接字升级。 但您需要自己实现此功能。

    1月

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

    您好、Jan、

        感谢您的回答。

        我使用了服务器 smtp.gmail.com,端口号465使用了安全 CA 证书。

        已成功 连接到 Gmail 服务器。

        Gmail 帐户启用了不太安全的应用程序访问。

       验证登录注释出错。

       

    535-5.7.8不接受用户名和密码。 如需了解更多相关信息、请访问
     https://support.google.com/m 535 5.7.8

     您是否知道出现此错误的原因?

      

    谢谢、此致、

         瓦苏

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

    您好、Vasu、

    我不知道。 通常、这意味着凭据不正确。 请在 此处查看答案

    1月