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.

[参考译文] CC3220SF:证书错误 MQTT Google IoT Core

Guru**** 2553260 points
Other Parts Discussed in Thread: CC3220SF, UNIFLASH

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/981590/cc3220sf-certificate-error-mqtt-google-iot-core

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

大家好、

我正在尝试使用 MQTT 连接到 Google IoT Core、但到目前为止它无法正常工作。

我已经验证了本地 MQTT 客户端所需的凭据(例如 ClientID 和密码)(在本例中为 google 的物联网内核所需的 JWT 令牌)是否正确。 我能够连接到我的注册设备并发布消息。

但是、当我尝试将其与 CC3220SF 连接时、串行终端上会显示以下错误消息:  

我检查了证书、并验证它实际上是 GlobalSign 证书、所以我在这里真的很困惑。 这是我偶尔会遇到的最常见的错误、但根据我上传的根证书、有时也会遇到-468、-458、-457或-2005。 我尝试过的所有根证书都直接从 google 下载、从证书存储库(PKI.goog/repository/)或从其 MQTT-bridge 示例页面 cloud.google.com/iot/docs/how-tos/mqtt-bridge下载。  

我通过 Uniflash 按此方式上传它们:

我遵循了 SDK 中的空 MQTT 示例、并能够通过安全连接连接到 eclipse 代理。 我扩展了代码并添加了 Google IoT 内核所需的凭据、但我必须做一些错误、因为我无法连接到他们的 MQTT 代理。

以下是我的代码的一部分:

#define ClientID "projects/myProjectId/locations/europe-west1/Registry/myRegistry/devices/qdevice"
#define MQTT_CLIENT_PASSWORD "myJWTtoken"
#define MQTT_CLIENT_USERNAME "未使用"#define
MQTT_CLIENT_KEEPALIVE 60
#define MQTT_CLIENT_CLEAR_CONNECT TRUE
#define MQTT_CLIENT_MQTT_V3_1 false
#define MQTT_CLIENT_BLOCK_SEND true
char * MQTTClient_secureFiles[1]={"gsr2.pem"};

#define MQTT_CONNECTION_FLAGS MQTTCLIENT_NETCONN_URL | MQTCLIENT_NETCONN_SEC
#define MQTT_CONNECT_ADDRESS "mqtt.googleapis.com
#define MQTT_CONNECT_PORT_NUMBER 8883

#define SL_TASKSTACKSIZE 2048
#define sawn_task_priority 9

MQTT_IF_InitParams_t mqttInitParams =
{
MQTT_MODULE_TASK_STACK_SIZE、// MQTT 模块的堆栈大小
MQTT_MODULE_TASK_PRIORITY // MQTT 的线程优先级
};

MQTT_IF_ClientParams_t mqttClientParams =
{
ClientID、 //客户端 ID
MQTT_CLIENT_USERNAME、 //用户名
MQTT_CLIENT_PASSWORD、 //密码
MQTT_CLIENT_KEEPALIVE、 //保持活动时间
MQTT_CLIENT_CLEAR_CONNECT、//清除连接标志
MQTT_CLIENT_MQTT_V3_1、 // true = 3.1,false = 3.1.1
MQTT_CLIENT_Blocking_send、//阻止发送标志
};

MQTTClient_ConnParams mqttConnParams =
{
MQTT_CONNECT_FLAGS、 //连接标志
MQTT_CONNECT_ADDRESS、 //服务器地址
MQTT_CONNECT_PORT_NUMBER、 // MQTT 服务器的端口号
SLNETSOCK_SEC_METHOD_TLSv1_2、 //安全套接字的方法
SLNETSOCK_SEC_Cip_full_list、 //安全套接字的密码
1、 //安全连接的文件数
MQTTClient_sureFiles //安全文件
};


//调用 MQTT_IF_handler 时,应使用提供事件回调。
* MQTT 客户端模块将使用此回调在发生某些 MQTT 事件(例如连接、断开等)时通知主应用程序*/
void MQTT_EventCallback (Int32_t 事件)
{
switch (event){
案例 MQTT_EVENT_CONNACK:
{
log_info ("mqTT_event_CONNACK\r\n");
中断;
}
案例 MQTT_EVENT_CLIENT_DISCONNECT:
{
log_info ("mqTT_event_client_ddisconnect\r\n");
中断;
}
案例 MQTT_EVENT_SERVER_DISCONNECT:
{
log_info ("mqTT_event_Server_disconnect\r\n");
中断;
}
案例 MQTT_EVENT_SA销毁:
{
log_info ("mqTT_event_destroy\r\n");
中断;
}
默认值:
{
log_info ("未知 MQTT 事件\r\n);
中断;
}
}
}/*

WiFi 初始化器*/

int WifiInit(){
int32_t ret;
SlWlanSecParams_t security_params;
pthread_t spawn_thread =(pthread_t) NULL;
pthread_attr_t pattrs_spawn;
struct sched_param prI_param;

pthread_attr_init (&pattrs_spawn);
PRI_param.sched_priority = sawn_task_priority;
RET = pthread_attr_setschedparam (&pattrs_spawn、&pri_param);
RET |= pthread_attr_setstacksize (&pattrs_spawn、sl_TASKSTACKSIZE);
RET |= pthread_attr_setdetachstate (&pattrs_spawn、pthread_create_detached);
RET = pthread_create (&spawn_thread、&pattrs_spawn、sl_Task、NULL);
if (ret!= 0){
log_error ("无法创建 simplelink 任务\n\r");
while (1);
}

network_if_ResetMCUStateMachine();

network_if_deInitDriver();

RET = Network_IF_InitDriver (Role_STA);
if (ret < 0){
log_error ("无法启动 SimpleLink 设备\n\r");
while (1);
}

// SetClientIdNamefromMacAddress();

security_params.Key =(signed char*) security_key;
security_params.KeyLen = strlen (security_key);
security_params.Type = security_type;

RET = Network_IF_ConnectAP (SSID_NAME、SECURITY_params);
if (ret < 0){
log_error ("连接到 AP 失败\n\r\n);
}
否则{
RET = sl_WlanProfileAdd ((signed char*) ssn_name、strlen (ssid_name)、0、&security_params、NULL、 7、0);
if (ret < 0){
log_error ("添加配置文件%s\r\n 失败"、SSID_NAME);
}
否则{
log_info ("配置文件已添加%s\r\n、SSID_NAME);
}
}

return;
}

void MQTTDemo (char* topic、char* payload、uint8_t QoS)
{
log_info ("主题:%s 有效载荷:%s QoS:%d\r\n"、主题、有效载荷、QoS);
}

/*
=== mainThread ====
//
void * mainThread (void * arg0)
{
/* 1秒延迟*/
uint32_t 时间= 1;

/* MQTT 变量*/
int32_t ret;
UART_Handle uartHandle;
MQTTClient_handle mqttClientHandle;

GPIO_init();
spi_init();

/*打开 UART 实例以启用应用程序打印*/
uartHandle = InitTerm();
UART_CONTROL (uartHandle、UART_CMD_RXDISABLE、空);

/*初始化 MQTT 客户端模块的 IP 网络服务层*/
RET = ti_net_slNet_initconfig();
if (0!= ret)
{
log_error ("初始化 SlNetSock\n\r\n 失败");
}

/*调用 WifiInit()以启动网络处理器并连接到接入点*/
RET = WifiInit();
if (ret < 0){
while (1);
}

settime();

/*初始化 MQTT 客户端模块*/
RET = MQTT_IF_Init (mqttInitParams);
if (ret < 0){
while (1);
}

RET = MQTT_IF_Subscribe (mqttClientHandle、"/devices/mydevice/events、MQTT_QOS_1、MQTTDemo);//Google 不支持 QoS 2
if (ret < 0){
while (1);
}
否则{
log_info ("已成功订阅所有主题\r\n);
}

/*连接 MQTT 代理并注册事件回拨*/
mqttClientHandle = MQTT_IF_Connect (mqttClientParams、mqttConnParams、MQTT_EventCallback);
if (mqttClientHandle < 0){
while (1);
}

while (1){
睡眠(时间);
MQTT_IF_Publish (mqttClientHandle、
"/devices/qdevice/events "、
"您好\r\n、
strlen ("hello\r\n")、
MQTT_QOS_0);
}
}

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

    您好!

    错误-468是 sl_error_BSD_ESECUNKNOWNROOTCA、这可能意味着这是正确的证书、但 CC3220SF 无法在受信任根证书目录中验证它。

    您可以在 source/ti/drivers/net/wifi/errors.h 中找到所有错误代码

    您能否检查您在器件中刷写了哪些服务包和证书目录? 您可以在 SDK 的 tools/cc32xx_tools 文件夹中找到服务包的最新版本和证书目录。

    此致、

    Sarah

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

    你好!

    我目前正在使用最新的 SDK 版本 simplelink_cc32xx_sdk_4_40_00_07。

    从 SDK 中,我刷写了以下服务包:

    和以下证书目录  :

    将 certcatalog20200715.lst.signed_3220.bin 作为签名源文件。

    我仍然遇到同样的问题。

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

    您好、我是 Yining、

    您需要查找由受信任证书颁发机构签名的根 CA 证书(在 certcatalog 自述文件中列出)。 此根 CA 不能由 Google 自行签名。 由于 Google 的连接响应要求提供 GlobalSign 证书、我建议先尝试这些证书。

    此主题与查找连接到 AWS 的正确证书相关、但调试步骤和说明可能会帮助您: e2e.ti.com/.../789112

    此致、

    Sarah

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

    你好,Sarah!

    我已经解决了这个问题、并且能够连接到 Google 的物联网核心。

    我使用的是完整的 Google  根 CA 认证包 ,该证书包作为单个文件下载:root.pem。 CC3220SF 在 连接到 google 时似乎无法处理此大文件并传递正确的证书。 我找到的解决方案是删除 root.pem 文件中所有不必要的根 CA 证书,并仅保留 google 使用的证书。

    还有其他论坛帖子提到 CC3220SF 无法接受.pem 格式的文件、而是必须将其文件转换为.der 格式。 在讨论我的解决方案之前、我还尝试了完整的软件包文件、但这似乎也不适合我。 从 root.pem 文件中删除所有不必要的根 CA 证书后、我能够以.pem 格式上传它、并使用它成功连接到 Google 的物联网内核。