您好!
我正在尝试让 MQTT 通信渠道的安全性发挥作用。 我当前收到-111错误(SLNETERR_ESEC_BAD_CERTIFIED)。 通过使用 slChecker 检查服务器似乎没有根证书。 我正在进行下载、但在翻过文档后、我不清楚如何将证书整合到 FW 中。 (这是我第一次使用 SSL/TLS 证书)。
欢迎提供任何建议。
谢谢
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.
您好!
我正在尝试让 MQTT 通信渠道的安全性发挥作用。 我当前收到-111错误(SLNETERR_ESEC_BAD_CERTIFIED)。 通过使用 slChecker 检查服务器似乎没有根证书。 我正在进行下载、但在翻过文档后、我不清楚如何将证书整合到 FW 中。 (这是我第一次使用 SSL/TLS 证书)。
欢迎提供任何建议。
谢谢
尊敬的 Kobi:
我已经多次阅读了文档的这一部分、但它没有任何帮助。 我强烈怀疑我配置有问题、但不知道是什么。 下面我将介绍设置和问题。 我尝试过两种不同的证书。 一个是用于使 HTTP 安全正常工作的 Marty、另一个是我从我们的服务器获取的时候生成的。 Marty 的证书名为 bd-ca-cert.pem、会导致-111 (BSD_ECONNREFUSED)错误、我的证书名为 ca.intelliport.local.pem、并导致-688 (ASN_NO_signer_E)错误。 下面是我的各种设置:
/// \details Broker Address Type, whether connection is secure (TLS) or not
#define MQTT_CONNECTION_FLAGS MQTTCLIENT_NETCONN_IP4
/// \details Broker Address
#define MQTT_CONNECTION_ADDRESS "40.76.139.29" // "4.240.112.28" "intelliportgw.eastus.cloudapp.azure.com"
/// \details Broker Port
#define MQTT_CONNECTION_PORT_NUMBER 8883
#define GW_ROOT_CA "bd-ca-cert.pem"
#define INTELLIPORT_CA "ca.intelliport.local.pem"
#define MAX_CACERT_SIZE 4096
/* Number of files used for secure connection */
#define CLIENT_NUM_SECURE_FILES 1
/// \details MQTT Client ID
static char g_client_id[13] = "Test Client";
/// \details Topic to publish next MQTT message to
static char g_topic[255] = {'\0'};
/// \details Next MQTT message to publish
static char g_mqtt_msg[765] = {'\0'};
/// \details Broker Address
static char g_broker_addr[MAX_MQTT_BROKER_ADDR_LENGTH] = {'\0'};
/// \details Broker Port
static uint16_t g_broker_port;
/// \details Broker Address Type, whether connection is secure (TLS) or not
static uint32_t g_broker_flags;
/// \details Offset in topic buffer for end of serial number
static uint8_t g_sn_offset = 0;
/// \details Flag for whether MQTT parameters should be changed or not
static bool g_freeze_mqtt_param = false;
/// \details Whether or not the broker address has been set yet
static bool g_broker_addr_set = false;
/// \details Whether or not the broker port has been set yet
static bool g_broker_port_set = false;
/// \details Whether or not the broker flags have been set yet
static bool g_broker_flags_set = false;
/// \details MQTT connection status
static mqtt_conn_status_t g_m_conn_status = MQTT_CONN_STATUS_DISCONNECTED;
/// \details Handle for MQTT connection
static MQTTClient_Handle g_mqtt_client_handle;
/// \details FW Versions returned from Gateway
static gw_msg_fw_ver_t gw_fw_versions;
/// \details MQTT Initialization parameters
MQTT_IF_InitParams_t g_mqtt_init_params =
{
MQTT_MODULE_TASK_STACK_SIZE, // stack size for mqtt module
MQTT_MODULE_TASK_PRIORITY // thread priority for MQTT
};
/// \details MQTT Will Message Parameters
MQTTClient_Will g_mqtt_will_params =
{
MQTT_WILL_TOPIC, // will topic
MQTT_WILL_MSG, // will message
MQTT_WILL_QOS, // will QoS
MQTT_WILL_RETAIN // retain flag
};
/// \details MQTT Client Parameters
MQTT_IF_ClientParams_t g_mqtt_client_params =
{
g_client_id, // client ID
MQTT_CLIENT_USERNAME, // user name
MQTT_CLIENT_PASSWORD, // password
MQTT_CLIENT_KEEPALIVE, // keep-alive time
MQTT_CLIENT_CLEAN_CONNECT, // clean connect flag
MQTT_CLIENT_MQTT_V3_1, // true = 3.1, false = 3.1.1
MQTT_CLIENT_BLOCKING_SEND, // blocking send flag
&g_mqtt_will_params // will parameters
};
static char *Mqtt_Client_secure_files[CLIENT_NUM_SECURE_FILES] = {GW_ROOT_CA};
MQTTClient_ConnParams g_mqtt_conn_params =
{
MQTTCLIENT_NETCONN_IP4 | MQTTCLIENT_NETCONN_SEC,
MQTT_CONNECTION_ADDRESS, // SERVER_IP_ADDRESS,
MQTT_CONNECTION_PORT_NUMBER, // SECURED_PORT_NUMBER,
SLNETSOCK_SEC_METHOD_SSLv3_TLSV1_2,
SLNETSOCK_SEC_CIPHER_FULL_LIST,
CLIENT_NUM_SECURE_FILES,
Mqtt_Client_secure_files
};
// The connection call looks like this
ret = MQTTClient_connect(mMQTTContext.mqttClient);你好 Kobi
我正在阅读一些其他论坛帖子、并意识到我可以尝试将这两个文件一起使用、因此我将安全文件计数更改为4、并将其声明为:
Static char * mqtt_Client_secure_files[client_NUM_SECURE_FILS]={GW_ROOT_CA、NULL、INTELLIPORT_CA、NULL};
这改变了错误返回连接到-458 (BADPRIVATEFILE)进一步增加了我的怀疑,要么使用不正确的文件,或只是在文件列表中的顺序错误。
John
最后一次尝试是错误的。 MQTT_Client_secure_files 数组中的每个文件都应具有特定的证书:第一个是服务器的根 CA、后跟用户私钥和证书等。
请先尝试使用 ca.intelliport.local.pem、 结果为-688。
在前面的一章中,有一种方法可以检索服务器的正确根 CA (请参见 How to update the SimpleLinkSockEventHandler ())。
这将为您提供正确的连接证书(印在终端上)。
请下载并使用这一个。
对于是否调用该事件处理程序函数、我们有不同的意见、因此我将 asm ("bkpt 1")设置为函数中的第一条指令。 拆解如下。 您可以看到该指令没有被优化掉、其下方是文档第2.5节中的代码。 我没有无线监听器、因此调用事件处理程序更为可取。 做了该实验后、我通过更改断点验证了该技术、其中我将-668返回代码返回到 asm ("bkpt 2");。 是有效的、因此该技术是有效的。
// 338 //*****************************************************************************
// 339 //
// 340 //! This function handles socket events indication
// 341 //!
// 342 //! \param[in] pSock - Pointer to Socket Event Info
// 343 //!
// 344 //! \return None
// 345 //!
// 346 //*****************************************************************************
SECTION `.text`:CODE:NOROOT(2)
THUMB
// 347 void SimpleLinkSockEventHandler(SlSockEvent_t *pSock)
// 348 {
SimpleLinkSockEventHandler:
PUSH {R4,LR}
MOVS R4,R0
// 349 asm("bkpt 1");
bkpt 1
// 350
// 351 if ( pSock->Event == SL_SOCKET_ASYNC_EVENT)
LDR R0,[R4, #+0]
CMP R0,#+2
BNE.N ??SimpleLinkSockEventHandler_0
// 352 {
// 353 switch (pSock->SocketAsyncEvent.SockAsyncData.Type)
LDRB R0,[R4, #+5]
CMP R0,#+5
BNE.N ??SimpleLinkSockEventHandler_1
// 354 {
// 355 case SL_SSL_NOTIFICATION_WRONG_ROOT_CA:
// 356 /* on socket error Restart OTA */
// 357 UART_PRINT("SL_SOCKET_ASYNC_EVENT: ERROR - WRONG ROOT CA\n\r");
LDR.W R0,??DataTable16_19
BL Report
// 358 UART_PRINT("Please install the following Root Certificate:\n\r");
LDR.W R0,??DataTable16_20
BL Report
// 359 UART_PRINT(" %s\n\r", pSock->SocketAsyncEvent.SockAsyncData.pExtraInfo);
ADDS R1,R4,#+8
LDR.W R0,??DataTable16_21
BL Report
// 360 break;
B.N ??SimpleLinkSockEventHandler_0
// 361
// 362 default:
// 363 /* on socket error Restart OTA */
// 364 UART_PRINT("SL_SOCKET_ASYNC_EVENT socket event %d \n\r", pSock->Event);
??SimpleLinkSockEventHandler_1:
LDR R1,[R4, #+0]
LDR.W R0,??DataTable16_22
BL Report
// 365 break;
// 366 }
// 367 }
// 368
// 369 /* This application doesn't work w/ socket - Events are not expected */
// 370 switch(pSock->Event)
今天上午,我有条理地介绍了我们当前密钥和证书的所有可能的用途。 结果位于随附的文字文档中。 每个案例都包含文件、连接错误代码、连接标志以及是否存在套接字事件的详细信息。
111可能表示服务器未关闭以前的连接。 这可能是与证书设置无关的临时问题(如果使用相同的配置重试、则会得到不同的响应。 似乎只需要一个证书(服务器证书的根 CA)。 GW_ROOT_CA 不是正确的。
-688必须与事件处理程序一起出现(我从未见过像你描述的那样的任何东西)。 如果您曾尝试打印、但仍然没有获得任何新信息-我建议您尝试使用另一个根 CA (例如、SDK 中的虚拟根 CA)。
确保您已安装最新的 Service Pack。
建议您 安装嗅探器。 请参阅 Wireshark 以了解详细信息并检查支持的软件狗。 它不应该太贵。
感谢您提供的信息。 我正在寻找 Wireshark 来探测 Wi-Fi 数据包。 我需要了解它是否甚至允许它作为人们笔记本电脑上的应用程序。 我可以看出他们可能对此不满意的原因。 几年前、我在另一个 Wi-Fi 项目中使用了 Airpcap 的 Wireshark、它非常有用、所以您的观点非常好。
有趣的是,您说只需要服务器的根 CA。 当我将证书放入 sslChecker 时、它指示根 CA 缺失、并提供了下载。 可悲的是,它没有工作,没有下载完成。
我将查看服务包。