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:无法为 Google GCP IoT LTS 域指定有效的根 CA 证书

Guru**** 2562120 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1049876/cc3235sf-unable-to-specify-valid-root-ca-certificate-for-google-gcp-iot-lts-domain

器件型号:CC3235SF

Tl;DR --当使用 Google 提供的根 CA 证书来支持其 长期支持(LTS)域 MQTT 服务器时,CC3235拒绝确认"GTS LTSR"证书已签名链,即使单独的测试工具能够成功连接也是如此。

因此、我们有一个项目、在该项目中、我们使用其 MQTT 端点连接到 Google GCP IoT。  如果我们连接到他们的常规端点(mqtt.googleapis.com:8883)并使用 GlobalSign Root CA 证书、我们可以成功连接。  以下是连接到此端点时的 OpenSSL 证书转储。

e2e.ti.com/.../GCP-IOT-Root-CA-mqtt.googleapis.com-2021_2D00_11_2D00_01.txt

下面是 GlobalSign 根证书、用于标记 "GTS Root R1"证书:

e2e.ti.com/.../GlobalSign-Root-CA.pem.txt

Google 还提供了 LTS (长期支持)域、旨在专门满足"最小"(读取:嵌入式)物联网系统的需求、因为它们承诺不更改 TLS 证书、或者更具体地说、更改其 TLS 证书的根 CA。  您可以 在此处阅读有关 LTS 域的更多信息。  它们提供"主要"和"备份"根 CA 证书、这意味着当您连接到 MQTT TLS 端点时、服务器证书 由这两个证书中的一个进行签名。  以下是连接到 LTS 端点(MQTT.200.ltspis.goog:8883)时的 OpenSSL 转储:

e2e.ti.com/.../GCP-IOT-Root-CA-mqtt.2030.ltsapis.goog-2021_2D00_11_2D00_01.txt 

奇怪的是,这种转储抱怨说它"无法获取本地颁发者证书",显然意味着它无法检索和转储根 CA 证书。  但是、如果您提取"GTS LTX"中间证书(该转储中的最后一个证书)并将其打开、您将看到确实有"GTS LTSR"根证书对其进行了签名。

如果我双击打开 GTS LTSR 证书并保存、它具有与"gtsltsr.crt"证书相同的"指纹"、可以直接从 Google 下载。  下面是 PEM 形式的证书:

e2e.ti.com/.../gtsltsr.pem.txt

不过这里有个问题... 无论我尝试指定哪个根 CA 证书(或其他证书)、我都无法获取 SimpleLink 以连接到 LTS MQTT 端点。  我 应该能够指定上面的 GTS LTSR 证书、但该证书不起作用。  我已经能够通过基于 PC 的独立测试工具(MQTTTX)确认我可以使用根 CA 证书、从我们的协处理器窃取 JWT、并成功连接到 LTS 域:

但是、当我尝试在我们的应用程序中使用相同的根 CA 证书时、我会收到以下消息(在 aws_secure_sockets.c 中生成):

[SimpleLinkSockEventHandler ERROR]: Root CA in file system did not sign the chain.

当套接字事件处理程序获得 sl_SSL_notification_wrong_root_CA 时、将显示此消息。  尝试任何其他证书(备份根 CA、GTS LTSX 中间证书等)也会失败。

我知道 SimpleLink 可能对要使用的根 CA 证书非常挑剔;在我为 AWS IoT 开发的另一个应用中、我知道我需要使用"Starfield"根 CA 证书、因为该证书用于对 AWS 根 CA 证书进行交叉签名。  但没有其他证书交叉签署 GTS LTSR 证书、而 SimpleLink 只是拒绝接受该证书。

正如我说过的、如果我对该域使用标准域(mqtt.googleapis.com)和根 CA 证书(GlobalSign)、我们的目标工作正常。  但是、我想使用 LTS 域帮助该器件"面向未来"、我无法说服 CC3235连接到该器件。

您能否提供一些输入、说明我为何无法连接到 Google GCP IoT LTS MQTT 端点?  您应该已经拥有了在您的末端执行某些测试所需的所有信息和根证书  谢谢。

戴维·R.

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

    您好!

    请检查以下参考代码(添加到事件处理程序)以打印所需根 CA 的确切名称。

     

    void SimpleLinkSockEventHandler(SlSockEvent_t *pSock)
    {
        if ( pSock->Event == SL_SOCKET_ASYNC_EVENT)
        {
            switch (pSock->SocketAsyncEvent.SockAsyncData.Type)
            {
            case SL_SSL_NOTIFICATION_WRONG_ROOT_CA:
                /* on socket error Restart OTA */
                LOG_INFO("SL_SOCKET_ASYNC_EVENT: ERROR - WRONG ROOT CA");
                LOG_INFO("Please install the following Root Certificate:");
                LOG_INFO(" %s\n\r", pSock->SocketAsyncEvent.SockAsyncData.pExtraInfo);
                break;
            default:
                /* on socket error Restart OTA */
                LOG_INFO("SL_SOCKET_ASYNC_EVENT socket event %d", pSock->Event);
            }
        }
    }
    

    确保所需的根 CA 确实是"GTS LTSR"。

    假设确实如此、请确保在文件系统中安装了"GTS LTSR"(例如、根文件夹中的"gts_ltsr.der")、并提供了证书到套接字的完整路径:

        - SL_SO_SECURE_FILES_CA_FILE_NAME:
        \code               
            sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_SECURE_FILES_CA_FILE_NAME,"exuifaxCaCert.der",strlen("exuifaxCaCert.der"));
        \endcode
        <br>

    根据 您用于 MQTT 连接的环境(AWS 插件或 FreeRTOS 示例、MQTT_CLIENT SDK 示例或其他内容)、 您将需要在不同的结构/API 中设置路径,但您可以在 sl_SetSockOpt ()中设置一个断点, 该断点将最终调用,以确保您的设置已按预期转发。

    BR、

    Kobi

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

    谢谢、这是我所需要的信息缺失的部分。  SimpleLink (意外)告诉我、它需要"GlobalSign Root CA"证书(与其主要域使用的根证书相同、如上所示)。  我将该证书放入我们的器件中、您知道什么、它连接在一起。  只是让我感到失望的是、当我检查"GTS LTSR"证书时、它没有显示任何其他签名、而查看主域的根证书则显示了 GlobalSign 证书签名。  再次感谢您帮助解决问题。

    戴维·R.