《线程》中讨论的其他部件:UNIFLASH, CC3235S
TI 专家:您好!
我正在使用 SimpleLinkNetAppRequestEventHandler 来处理来自 HTML 页面的获取/发布请求。 因此,Fat 可以与 http 服务器配合使用,但现在当我从 Uniflash 启用了安全 http 服务器时,在此之后我无法接收 SimpleLinkNetAppRequestEventHandler 中的任何事件以进行 POST 请求。
我做了什么错?
谢谢
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.
TI 专家:您好!
我正在使用 SimpleLinkNetAppRequestEventHandler 来处理来自 HTML 页面的获取/发布请求。 因此,Fat 可以与 http 服务器配合使用,但现在当我从 Uniflash 启用了安全 http 服务器时,在此之后我无法接收 SimpleLinkNetAppRequestEventHandler 中的任何事件以进行 POST 请求。
我做了什么错?
谢谢
您是否能够运行本地 OTA 示例? 此请求使用 POST 请求,默认情况下使用安全连接。
如果您正确设置了证书和密钥-这将会起作用。 您还需要设置 SL_NetApp_HTTP_primary_port_security_mode。
请参阅启用 HTTP 服务器的代码示例:
typedef struct
{
uint16_t primaryPort; /* set to primary port or 0 to use default (80) */
uint16_t secondaryPort; /* set to secondary port or 0 to use default (no secondary) */
char *pServerCert; /* set to HTTPS server's certificate, or to NULL (when using HTTP) */
char *pServerKey; /* set to HTTPS server's private key (null when usign HTTP) */
char *pClientRootCa; /* set to Client root CA (if needed), or to NULL (if not needed) */
} HTTPSRV_IF_params_t;
//*****************************************************************************
//
//! \brief This function configures the HTTPS server
//!
//! \param pServerCert Server's Certificate filename (NULL if no security is needed)
//!
//! \param pServerKey Server's Private Key filename
//!
//! \param pClientRootCACert Clients' root CA (if client authentication is needed)
//!
//! \return NetApp error codes or 0 upon success.
//!
//*****************************************************************************
int HTTPSRV_IF_config(HTTPSRV_IF_params_t *pSrvParams)
{
int rc = 0;
int status = 0;
SlFsFileInfo_t FsFileInfo;
uint16_t primaryPort = DEFAULT_HTTP_SRV_PORT;
uint16_t secondaryPort = 0;
uint8_t securityMode = 0;
uint8_t secondaryPortEnable = 0;
/* By default - only set primary to HTTP (not secure) port
*/
if(pSrvParams)
{
/* Update the primary/secondary ports if needed */
if(pSrvParams->primaryPort != 0)
{
primaryPort = pSrvParams->primaryPort;
}
secondaryPort = pSrvParams->secondaryPort;
/* Check for HTTPS params */
if(pSrvParams->pServerCert)
{
LOG_DEBUG("Configure Server for secured mode...");
securityMode = 1;
/* Check if the file used for SSL exists in the FS */
status = sl_FsGetInfo((const uint8_t *)pSrvParams->pServerCert, 0, &FsFileInfo);
if(status < 0)
{
if (status == SL_ERROR_FS_FILE_NOT_EXISTS)
{
LOG_ERROR("File %s status=SL_ERROR_FS_FILE_NOT_EXISTS\r\n",pSrvParams->pServerCert);
}
else
{
LOG_ERROR("Error sl_FsOpen %s, Status=%d\r\n", pSrvParams->pServerCert, status);
}
return status;
}
/* Check if the file used for SSL key exists in the FS */
status = sl_FsGetInfo((const uint8_t *)pSrvParams->pServerKey, 0, &FsFileInfo);
if(status < 0)
{
if (status == SL_ERROR_FS_FILE_NOT_EXISTS)
{
LOG_ERROR("File %s status=SL_ERROR_FS_FILE_NOT_EXISTS\r\n",pSrvParams->pServerKey);
}
else
{
LOG_ERROR("Error sl_FsOpen %s, Status=%d\r\n", pSrvParams->pServerKey, status);
}
return status;
}
/* Set the file names used for SSL key exchange */
setNetAppHttp(&rc, SL_NETAPP_HTTP_DEVICE_CERTIFICATE_FILENAME,
strlen((char *)pSrvParams->pServerCert), (const uint8_t *)pSrvParams->pServerCert);
setNetAppHttp(&rc, SL_NETAPP_HTTP_PRIVATE_KEY_FILENAME,
strlen((char *)pSrvParams->pServerKey), (const uint8_t *)pSrvParams->pServerKey);
if(pSrvParams->pClientRootCa)
{
setNetAppHttp(&rc, SL_NETAPP_HTTP_CA_CERTIFICATE_FILE_NAME,
strlen((char *)pSrvParams->pClientRootCa), (const uint8_t *)pSrvParams->pClientRootCa);
}
}
}
setNetAppHttp(&rc, SL_NETAPP_HTTP_PRIMARY_PORT_NUMBER,
sizeof(primaryPort), (uint8_t *)&primaryPort);
if(secondaryPort)
{
/* Enable secondary HTTP port (can only be used for redirecting
connections to the secure primary port) */
setNetAppHttp(&rc, SL_NETAPP_HTTP_SECONDARY_PORT_NUMBER,
sizeof(secondaryPort), (uint8_t *)&secondaryPort);
secondaryPortEnable = 1;
}
setNetAppHttp(&rc,
SL_NETAPP_HTTP_SECONDARY_PORT_ENABLE,
sizeof(secondaryPortEnable),
&secondaryPortEnable);
setNetAppHttp(&rc,
SL_NETAPP_HTTP_PRIMARY_PORT_SECURITY_MODE,
sizeof(securityMode),
&securityMode);
if(rc >= 0)
{
rc = sl_NetAppStop(SL_NETAPP_HTTP_SERVER_ID);
LOG_DEBUG("HTTP Server Stopped");
rc = sl_NetAppStart(SL_NETAPP_HTTP_SERVER_ID);
while (rc == SL_ERROR_HTTP_SERVER_ENABLE_FAILED)
{
sleep(1);
rc = sl_NetAppStart(SL_NETAPP_HTTP_SERVER_ID);
}
LOG_DEBUG("HTTP Server Re-started");
}
return rc;
}
您好,
感谢您的及时回复。 我使用云 OTA 作为参考代码。 我在这里附加了我用来建立安全服务器的功能,它运行正常,能够毫无问题地访问 https 服务器,还可以添加和删除配置文件功能, 但这样做后,我没有从用于设备配置参数的 html 页面获得任何置换请求。
int32_t ConfigureHttpsServer(void)
{
int32_t retVal = 0;
int32_t status = 0;
uint8_t httpsPort[] = { 0xBB, 0x01 }; /* 0x1BB = 443 */
uint8_t secondaryPort[] = { 0x50, 0x00 }; /* 0x050 = 80 */
uint8_t secondaryPortEnable[] = { 0x1 };
uint8_t securityMode = 1;
SlFsFileInfo_t FsFileInfo;
UART_PRINT("ConfigureHttpsServer for secured mode...\n\r");
/* Check if the file used for SSL exists in the FS */
status = sl_FsGetInfo((const uint8_t*) SSL_SERVER_CERT, 0, &FsFileInfo);
if (status < 0)
{
if (status == SL_ERROR_FS_FILE_NOT_EXISTS)
{
UART_PRINT(
" [ERROR] File %s status=SL_ERROR_FS_FILE_NOT_EXISTS\r\n",
SSL_SERVER_CERT);
}
else
{
UART_PRINT(" [ERROR] Error sl_FsOpen %s, Status=%d\r\n",
SSL_SERVER_CERT,
status);
}
return status;
}
/* Check if the file used for SSL key exists in the FS */
status = sl_FsGetInfo((const uint8_t*) SSL_SERVER_KEY, 0, &FsFileInfo);
if (status < 0)
{
if (status == SL_ERROR_FS_FILE_NOT_EXISTS)
{
UART_PRINT(
" [ERROR] File %s status=SL_ERROR_FS_FILE_NOT_EXISTS\r\n",
SSL_SERVER_KEY);
}
else
{
UART_PRINT(" [ERROR] Error sl_FsOpen %s, Status=%d\r\n",
SSL_SERVER_KEY,
status);
}
return status;
}
/* Set the file names used for SSL key exchange */
SetNetAppHttp(&retVal, SL_NETAPP_HTTP_DEVICE_CERTIFICATE_FILENAME,
strlen((char*) SSL_SERVER_CERT),
(const uint8_t*) SSL_SERVER_CERT);
SetNetAppHttp(&retVal,
SL_NETAPP_HTTP_PRIVATE_KEY_FILENAME,
strlen((char*) SSL_SERVER_KEY),
(const uint8_t*) SSL_SERVER_KEY);
/* Activate SSL security on primary HTTP port and change it to
443 (standard HTTPS port) */
SetNetAppHttp(&retVal,
SL_NETAPP_HTTP_PRIMARY_PORT_SECURITY_MODE,
sizeof(securityMode), &securityMode);
SetNetAppHttp(&retVal,
SL_NETAPP_HTTP_PRIMARY_PORT_NUMBER,
sizeof(httpsPort), httpsPort);
/* Enable secondary HTTP port (can only be used for redirecting
connections to the secure primary port) */
SetNetAppHttp(&retVal,
SL_NETAPP_HTTP_SECONDARY_PORT_NUMBER,
sizeof(secondaryPort), secondaryPort);
SetNetAppHttp(&retVal,
SL_NETAPP_HTTP_SECONDARY_PORT_ENABLE,
sizeof(secondaryPortEnable), secondaryPortEnable);
if (retVal >= 0)
{
retVal = sl_NetAppStop(SL_NETAPP_HTTP_SERVER_ID);
UART_PRINT("[Provisioning App] HTTP Server Stopped\n\r");
retVal = sl_NetAppStart(SL_NETAPP_HTTP_SERVER_ID);
if (retVal == SL_ERROR_HTTP_SERVER_ENABLE_FAILED)
{
do
{
sleep(1);
retVal = sl_NetAppStart(SL_NETAPP_HTTP_SERVER_ID);
}
while (retVal == SL_ERROR_HTTP_SERVER_ENABLE_FAILED);
}
UART_PRINT("[Provisioning App] HTTP Server Re-started\n\r");
}
return retVal;
}大家好,我发现安全服务器证书可能存在问题。 我已经 使用 postman 工具测试了相同的 PUT 请求,当我禁用 SSL 验证时,它运行正常。 可以从 cc3235设备端禁用 SSL 证书验证。settings.html 文件中的所有其他功能都可以正常使用 https 服务器。 在 simplelinknetapprequesteventerandler 中,仅收到 PUT 请求。 “mysimplelink.net ”安全服务器是否有任何证书可用。
http_server 可以在没有安全保护的情况下使用(http 而不是 https)-请参阅 SL_NetApp_HTTP_primary_port_security_mode 设置(在这种情况下不提供证书)。
在 LocalOta 示例中,我们使用的是虚拟“运动场”证书(在这种情况下,浏览器需要在其“已验证”证书列表中包括伪根 CA 证书)。 这可以用于开发,但在构建真实产品时必须用正式证书(由已知 CA 签署)替换。