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:根 CA 错误、返回错误信息、请求已过期的 dst 根 CA X3

Guru**** 2482105 points
Other Parts Discussed in Thread: UNIFLASH, CC3235SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1311070/cc3235sf-wrong-root-ca-error-returns-asking-for-the-expired-dst-root-ca-x3

器件型号:CC3235SF
主题中讨论的其他器件:UNIFLASH

在尝试使用安全性打开 HTTPS 连接时、我收到以下错误。

SL_SSL_NOTIFICATION_WROOT_CA

它要求的证书是 Expired LET Encrypt cert dst Root CA X3。

如何解决此问题。  我已尝试安装和使用每个新的更换认证、但似乎没有任何认证可以正常工作。

此问题是否属于服务器端问题、还是客户端的证书查找问题、如何解决?

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

    您好!

    ASN_NO_signer_E 错误意味着 TLS 堆栈无法在其目录中找到 CA 证书来正确验证对等证书。

    所以最好是替换了过期的根 CA,但服务器发送的证书无法验证目录中的任何根 CA。

    请查看底部证书的"issued by"部分、并检查它是否与目录中的一个根 CA 匹配。

    您可以在 SDK 的 tools\cc32xx_tools\certificate-catalog\readme.html 下找到所有根 CA 的列表。

    此致、

    什洛米

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

    对器件进行编程时、是否需要将证书文件从该目录添加到 Uniflash。  如果是、我尝试过该功能并得到以下错误。  我缺少什么?

    操作失败:错误:SLImageCreator.exe:fs_programming error:rett:-10287、ex_err:2694 - fs_ERR_root_ca_is_unkown

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

    您好!

    此错误表示 RootCA 不在目录中。

    当涉及到文件系统时(即文件受到保护)、您需要证书。 此证书需要位于文件系统上、并且目录需要知道与其关联的 RootCA 才能对其进行身份验证。

    通过与服务器的 SSL 连接(您的初始帖子)、从服务器发送的链也需要进行身份验证、以便 RootCA 需要被目录 所知、并且我认为实际的 RootCA 也需要在文件系统上。

    您是否已编程 RootCA?

    RootCA 是否出现在 Catalog 中?

    此致、

    什洛米

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

    Shlomi,

    目前、在 Uniflash 中、我使用在受信任根证书屏幕中编程的游乐场文件对器件进行编程。

    当我将它们更改为 certcatalog20200715.lst 和 certcatalog20200715.lst.signed_323x.bin 文件时。  我得到上方的错误。

    未选中 Use default Trusted Root Certificate Catalog (使用默认受信任的根证书目录)。 并 取消选中"Use Vendor Certificate Catalog (使用供应商证书目录)"。

    我是否需要更改这些设置中的任何一个。  "我想怎么样?

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

    您好!

    有两个目录、游乐场和值得信赖的一个。

    游乐场仅用于发展,它是自签名的。 对于游乐场目录、您需要使用 SDK 中同一位置的游乐场证书和密钥。 这将允许您向文件系统添加安全文件、以及 建立 SSL/TLS 连接。

    在真实产品中,您需要将可信目录与一些由根 CA 颁发机构签名的真实证书一起使用。

    但是、您不能将两者混合。

    同样、连接到 HTTPS 服务器需要使用受信任目录、但还需要确保根 CA 位于目录中、并且也编程到文件系统中。

    什洛米

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

    因此、当我添加  certcatalog20200715.lst 和 certcatalog20200715.lst.signed_323x.bin 文件的文件时、   未选中 Use default Trusted Root Certificate Catalog (使用默认受信任的根证书目录)。 并 取消选中"Use Vendor Certificate Catalog (使用供应商证书目录)"。

    我为什么会得到  

    操作失败:错误:SLImageCreator.exe:fs_programming error:rett:-10287、ex_err:2694 - fs_ERR_root_ca_is_unkown。

    这是因为操场的认证仍然在文件系统中的用户文件?

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

    此外、由于这些文件来自2020年7月15日、因此它们非常旧。  是 TI 为这些器件提供的更新版本、因为在文件中找到的原始 CERT 已过期。

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

    实际上没有更新的目录。

    哪些证书已过期?

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

    由 Let's Encrypt 提供的 DST 根 CA X3。

    https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/

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

    您是对的。 我不确定更新这些证书的程序是什么。

    您是否有一个链需要使用此链进行验证?

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

    是的、 这是我的原始问题。  我一直在试图确定我做了什么错或我可以做什么来让它解决一个新支持的认证.

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

    若要从列表中移到更新的受支持证书链、您需要再次对证书链进行签名。 令人困惑的是、我希望该错误更有意义、能够指示到期、而不是像它甚至不在列表中那样。

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

    另外、我没有过期的证书、无法安装到 cc3235sf 的文件系统中。

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

    嗯、即使您有它、它也不会提供太多、因为它将无法通过日期/时间到期测试。

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

    如何或从何处获得包含 Let's Encrypt 更新证书的 rootCA 的更新 lst 和 bin 文件。

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

    您好!

    无论如何,"让我们加密"根 CA 不是编目的一部分。

    该列表显示在 SDK 的自述文件中、但我需要了解如何更新它。

    我将在内部发送一份注释、以便驱动它并回复给您。

    此致、

    什洛米

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

    Shlomi,

    有任何更新吗?  只是为了说明已过期的  dst Root CA X3出现在当前列表中。

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

    您好!

    抱歉、尚未更新。 我在内部圈出了这个区域、一旦收到反馈、我就会告诉您。

    此致、

    什洛米

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

    我们还在等待。  我需要知道如何连接到使用 Let's Encrypt Cert 的服务器、并在设备上支持较新的认证。

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

    很遗憾、尚未更新。

    解决方案可能是生成一个新的证书目录、但我不了解内部谁是证书所有者的详细信息。

    我会尝试回研发页面并获得答案。

    此致、

    什洛米

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

    您好!

    回到失效的根 CA 的主要问题、我想确定预期的根 CA 是什么。 这取决于尝试连接时从服务器获得的证书链。 您能仔细检查一下吗? 我可以看到、某些器件解决了这个问题、但某些物联网器件仍然没有解决方案。 您可以在这里看到 https://letsencrypt.org/certificates/ 和 https://letsencrypt.org/2020/12/21/extending-android-compatibility (对于 Android)。

    我只是想了解我们在内部应该采取什么路径来批准连接。

    此致、

    什洛米

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

    ISRG 根 X1应为预期的根 CA、后跟 R3证书

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

    谢谢、这是我想的东西。

    在我们获得目录更新之前、您可以 通过使用套接字选项 SL_SO_SECURE_DISABLE_CERTIFICATE_STORE 来绕过目录阶段(FS_ERR_ROOT_CA_IS_UNKown 错误) 。 此为每个套接字选项。

    在用户指南中:

    此致、

    什洛米

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

    Shlomi,

    目前我使用的是 HTTPClient.h API。  您认为、为了解决当前问题、我必须使用 RAW 套接字代码手动完成所有这些操作?

    当前代码如下所示。

    void* httpTask(void* pvParameters)
    {
        bool moreDataFlag = false;
        char data[HTTP_MIN_RECV];
        int16_t ret = 0;
        int32_t len = 0;
    
        //GET THESE on the DEVICE along with the ROOTCA.
    
        httpSecParams.clientCert = "cert.pem";
        httpSecParams.privateKey = "key.pem";
        httpSecParams.rootCa = "isrgrootx1.der";
    
        Display_printf(display, 0, 0, "Sending a HTTP GET request to '%s'\n",
                       HOSTNAME);
    
        HTTPClient_Handle httpClientHandle;
        int16_t statusCode;
        httpClientHandle = HTTPClient_create(&statusCode,0);
        if(statusCode < 0)
        {
            printError("httpTask: creation of http client handle failed",
                       statusCode);
        }
    
        ret = HTTPClient_setHeader(httpClientHandle,
                                 HTTPClient_HFIELD_REQ_USER_AGENT,
                                 USER_AGENT,strlen(USER_AGENT)+1,
                                 HTTPClient_HFIELD_PERSISTENT);
        if(ret < 0)
        {
            printError("httpTask: setting request header failed", ret);
        }
    
        ret = HTTPClient_connect(httpClientHandle,HOSTNAME,&httpSecParams,0);
        if(ret < 0)
        {
            printError("httpTask: connect failed", ret);
        }
        ret = HTTPClient_sendRequest(httpClientHandle,HTTP_METHOD_GET,REQUEST_URI,
                                   NULL,0,
                                   0);
        if(ret < 0)
        {
            printError("httpTask: send failed", ret);
        }
    
        if(ret != HTTP_SC_OK)
        {
            printError("httpTask: cannot get status", ret);
        }
    
        Display_printf(display, 0, 0, "HTTP Response Status Code: %d\n", ret);
    
        len = 0;
        do
        {
            ret = HTTPClient_readResponseBody(httpClientHandle, data, sizeof(data),
                                              &moreDataFlag);
            if(ret < 0)
            {
                printError("httpTask: response body processing failed", ret);
            }
            Display_printf(display, 0, 0, "%.*s \r\n",ret,data);
            len += ret;
        }
        while(moreDataFlag);
    
        Display_printf(display, 0, 0, "Received %d bytes of payload\n", len);
    
        ret = HTTPClient_disconnect(httpClientHandle);
        if(ret < 0)
        {
            printError("httpTask: disconnect failed", ret);
        }
    
        HTTPClient_destroy(httpClientHandle);
        return(0);
    }
    

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

    您好!

    可能会更复杂一点、但由于使用 NetSock、基础设施仍然存在。

    在 HttpClient_connect ()中,可以看到 使用了 SlNetSock_secAttribSet () API。 此 API 可以获得一组选项来设置到连接。 在内部可以看到 使用了 SLNETSOCK_SEC_ATTRIB_DOMAIN_NAME。 此外、还通过此 API 来设置证书和密钥的名称。 幸运的是、另一个属性是 SLNETSOCK_SEC_ATTRIB_DISABLE_CERT_STORE、它完全用于绕过证书存储以便您可以添加它。

    此致、

    什洛米

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

    Shlomi,

    我修改了 httpclient.c 中的代码、以添加禁用证书存储。

    int16_t HTTPClient_connect(HTTPClient_Handle client, const char *hostName, HTTPClient_extSecParams *exSecParams, uint32_t flags)
    {
        HTTPClient_CB *cli = (HTTPClient_CB *)client;
        uint16_t intFlags = 0;
        uint16_t port = 0;
        int16_t  retVal;
        char     domainBuff[HTTPClient_DOMAIN_BUFLEN];
        char     *domainPtr = NULL;
    
        /*  Secure attribute memory is cleaned up in HTTPClient_disconnect */
        SlNetSockSecAttrib_t *secAttribs = NULL;
    
        /* Extract security parameters */
        if (exSecParams != NULL)
        {
            retVal = createSecAttribs(exSecParams, &secAttribs);
            if (retVal < 0)
            {
                return (retVal);
            }
            retVal = parseURI(hostName, &port, domainBuff, &intFlags);
            if ((retVal == 0) && (intFlags & ISDOMAIN))
            {
                /*
                 * Copy the domain into malloced memory to avoid pointing to the
                 * stack's memory inside secAttribs.
                 */
                domainPtr = malloc((strlen(domainBuff) + 1));
                if(!domainPtr)
                {
                    SlNetSock_secAttribDelete(secAttribs);
                    return (SLNETERR_RET_CODE_MALLOC_ERROR);
                }
                memcpy(domainPtr, domainBuff, (strlen(domainBuff) + 1));
                retVal = SlNetSock_secAttribSet(secAttribs, SLNETSOCK_SEC_ATTRIB_DOMAIN_NAME
                                                || SLNETSOCK_SEC_ATTRIB_DISABLE_CERT_STORE,
                                                domainPtr, strlen(domainPtr) + 1);
                if (retVal < 0)
                {
                    free(domainPtr);
                    SlNetSock_secAttribDelete(secAttribs);
                    return (retVal);
                }
            }
            cli->secAttribs = secAttribs;
            cli->secAttribsAllocated = true;
        }
        else if (cli->secAttribs != NULL)
        {
            /* We're attempting to reconnect to a server */
            secAttribs = cli->secAttribs;
        }
    
        retVal = HTTPClient_connect2(client, hostName, secAttribs, flags, NULL);
        if (retVal < 0)
        {
            HTTPClient_disconnect(client);
        }
        return (retVal);
    }
    

    但我仍然收到以下返回代码 SL_SSL_NOTIFICATION_WRONG_ROOT_CA、同时请求"dst Root CA X3"。

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

    您好!

    几点意见:

    • 这不是设置 SLNETSOCK_SEC_ATTRIB_DISABLE_CERT_STORE 的方法、因为每个选项都需要单独设置。 因此、请保持原始 SLNETSOCK_SEC_ATTRIB_DOMAIN_NAME 不变并添加 SLNETSOCK_SEC_ATTRIB_DISABLE_CERT_STORE。 您需要添加的代码如下所示:
      uint32_t dummyVal = 1;
      
      retVal = SlNetSock_secAttribSet(secAttribs, SLNETSOCK_SEC_ATTRIB_DISABLE_CERT_STORE, (void *)&dummyVal, sizeof(dummyVal));
      if (retVal < 0)
      {
          SlNetSock_secAttribDelete(secAttribs);
          return (retVal);
      }
    • 即使绕过了目录测试、仍需要在串行闪存上编程过期的根 CA、并由 setsockopt 指向它。

    此致、

    什洛米