器件型号:CC3220
我正在努力使用 CA 证书在 CC3220上设置安全 MQTT TLS 通信。 我知道我有一个从 Windows "DST root CA X3"中的证书寄存器获得的有效 CA 证书、该证书以 mqtt_cert.der/或.MQTT_cert.PEM"格式保存、这些副本都使用 MQTT.FX 进行测试、以在安全 TLS 模式下连接到 m2m.eclipse.org 代理、并且工作正常。
但是、在尝试设置安全套接字并连接到此套接字时、将此证书存储在 CC3220 Launchpad 中会导致问题(请查看下面的代码):
//Step 6:连接到服务器
iStatus = sl_Connect (SsockID、(SlSockAddr_t *)&sAddr、iAddrSize);-->错误 iStatus =-456、这意味着:
#define SL_ERROR_BSD_ESECBADCAFILE (-456L)/*错误安全级别错误 CA 文件*/
我认为这与我在示例项目中存储证书的方式/位置有关?!! 您对此问题有什么想法吗?
我尊重介绍如何使用 Uniflash 刷写证书的文档 、但我不知道为什么会出现此问题?
*使用 TLS 连接到代理安全模式
秘书长的报告 /
#define SL_TLS_CA_CERT_FILE_NAME "mqtt_cert.der"
#define SERVER_NAME "m2m.eclipse.org
{
SlSockAddrIn_t sAddr;
Int iStatus;
//TODO:由代理信息更新
//填充 TCP 服务器套接字地址
G_ulDestinationIp_= IP_Addrs;
sAddr.sin 系列= sl_AF_iNet;
sAddr.sin 端口= sl_Htons (无符号短整型) MQTT_TLSport);
sAddr.sin addr.s_addr = sl_Htonl ((unsigned int) g_ulDestinationIp_);
iAddrSize = sizeof (SlSockAddrIn_t);
// certifications.PrivateKey = sl_so_secure_files_private_key_file_name; //映射私钥,0文件不存在
// certifications.Certificate = sl_SO_SECURE_FILES _certificate_file_name; //映射证书,0文件不存在
// certifications.ca = sl_SO_SECURE_FILES_CA_FILE_NAME/*129*/;//映射 CA,0文件不存在
// certifications.dh = sl_SO_SECURE_FILES_PEER_CERT_OR_DH_KEY_FILE_NAME; //映射证书,0文件不存在
certificates->SecureFiles[0]= 0;
certificates->SecureFiles[1]=0;
certificates->SecureFiles[2]=sl_so_secure_files_CA_file_name;
certificates->SecureFiles[3]=0;
//设置设备中的当前时间(必需)
iStatus = SET_TIME();
if (iStatus < 0)
{
UART_PRINT ("无法在设备中设置时间");
返回 iStatus;
}
// unsigned int uiIP;
// iStatus = sl_NetAppDnsGetHostByName (g_Host、strlen ((const char *) g_Host)、(unsigned long*)&uiIP、sl_AF_iNet);
//
// if (iStatus < 0)
// {
// uart_print ("设备无法检索主机名\n\r");
// 返回 iStatus;
// }
//
// sAddr.sin 系列= sl_AF_iNet;
// sAddr.Sin_port = sl_Htons (MQTT_TLSport);
// sAddr.sin addr.s_addr = sl_Htonl (uiIP);
// iAddrSize = sizeof (SlSockAddrIn_t);
/// CC3220器件必须打开安全套接字。
//sl_Socket ()函数可与设置为 SL_SEC_Socket (值=100)的"协议"参数一起使用。
SsockID = sl_Socket (sl_AF_iNet、sl_sock_stream、sl_SEC_Socket);
IF (SsockID < 0)
{
UART_PRINT ("设备无法创建安全套接字\n\r");
ASSERT_ON_ERROR (SOCKET_CREATE_ERROR);
}
//Step 3:Force Specific Method (可选)
//默认情况下,启用 SSL 3.0和 TLS 1.2。 可以通过使用 sl_SetSockOpt ()函数强制使用特定方法。
/* unsigned char ucmethod = sl_SO_SEC_METHOD_SSLv3;
iStatus = sl_SetSockOpt (SsockID、sl_SOL_Socket、sl_SO_SECMETHOD、&ucmethod、sizeof (ucmethod));
if (iStatus < 0){
UART_PRINT ("设备无法设置套接字选项\n\r");
返回 iStatus;
}
*
//Step 4:Force Specific cipher (强制特定密码)(可选)
//默认情况下,CC3220将选择连接两侧都可以支持的最安全的密码套件。
//可以使用 sl_SetSockOpt ()函数强制使用特定的密码。
/*unsigned int uiCipher = sl_SEC_MASK_SSL_RSA_ITH_RC4_128_SHA;
if (iStatus < 0){
UART_PRINT ("设备无法设置套接字选项\n\r");
返回 iStatus;
}
*
//CC3220使用特定于 TLS/SSL 的文件、用户可以在应用程序级别定义这些文件。
//所需的文件根据连接类型在下面列出,并且必须以 DER 格式表示。
//TODO:添加证书
//添加证书:我们将在开始时使用 google 证书进行测试
//if (certificates!= NULL){
iStatus = SL_SetSockOpt (SsockID、SL_SOL_Socket、SL_SO_SECURE_FILES_CA_FILE_NAME、SL_TLS_CA_CERT_FILE_NAME、sizeof (SockSecureFiles_t));
{
UART_PRINT ("设备无法设置套接字选项\n\r");
返回 iStatus;
}
//Step 5bis:验证.....
iStatus = sl_SetSockOpt (SsockID、sl_SOL_Socket、sl_SO_SECURE_DOMAIN_NAME_VERIFICATION、g_Host、strlen ((const char *) g_Host));
if (iStatus < 0)
{
UART_PRINT ("设备无法设置套接字选项\n\r");
返回 iStatus;
}
//}
iStatus = sl_Connect (SsockID、(SlSockAddr_t *)&sAddr、iAddrSize);
如果(iStatus < 0)
{
//错误
UART_PRINT ("步骤6 \n"r);
UART_PRINT ("设备无法连接到服务器\n\r");
sl_close (SockID);
ASSERT_ON_ERROR (CONNECT_ERROR);
}
}