主题中讨论的其他器件:UNIFLASH、
在尝试使用安全性打开 HTTPS 连接时、我收到以下错误。
SL_SSL_NOTIFICATION_WROOT_CA
它要求的证书是 Expired LET Encrypt cert dst Root CA X3。
如何解决此问题。 我已尝试安装和使用每个新的更换认证、但似乎没有任何认证可以正常工作。
此问题是否属于服务器端问题、还是客户端的证书查找问题、如何解决?
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.
在尝试使用安全性打开 HTTPS 连接时、我收到以下错误。
SL_SSL_NOTIFICATION_WROOT_CA
它要求的证书是 Expired LET Encrypt cert dst Root CA X3。
如何解决此问题。 我已尝试安装和使用每个新的更换认证、但似乎没有任何认证可以正常工作。
此问题是否属于服务器端问题、还是客户端的证书查找问题、如何解决?
您好!
ASN_NO_signer_E 错误意味着 TLS 堆栈无法在其目录中找到 CA 证书来正确验证对等证书。
所以最好是替换了过期的根 CA,但服务器发送的证书无法验证目录中的任何根 CA。
请查看底部证书的"issued by"部分、并检查它是否与目录中的一个根 CA 匹配。
您可以在 SDK 的 tools\cc32xx_tools\certificate-catalog\readme.html 下找到所有根 CA 的列表。
此致、
什洛米
您好!
此错误表示 RootCA 不在目录中。
当涉及到文件系统时(即文件受到保护)、您需要证书。 此证书需要位于文件系统上、并且目录需要知道与其关联的 RootCA 才能对其进行身份验证。
通过与服务器的 SSL 连接(您的初始帖子)、从服务器发送的链也需要进行身份验证、以便 RootCA 需要被目录 所知、并且我认为实际的 RootCA 也需要在文件系统上。
您是否已编程 RootCA?
RootCA 是否出现在 Catalog 中?
此致、
什洛米
Shlomi,
目前、在 Uniflash 中、我使用在受信任根证书屏幕中编程的游乐场文件对器件进行编程。
当我将它们更改为 certcatalog20200715.lst 和 certcatalog20200715.lst.signed_323x.bin 文件时。 我得到上方的错误。
未选中 Use default Trusted Root Certificate Catalog (使用默认受信任的根证书目录)。 并 取消选中"Use Vendor Certificate Catalog (使用供应商证书目录)"。
我是否需要更改这些设置中的任何一个。 "我想怎么样?
您好!
有两个目录、游乐场和值得信赖的一个。
游乐场仅用于发展,它是自签名的。 对于游乐场目录、您需要使用 SDK 中同一位置的游乐场证书和密钥。 这将允许您向文件系统添加安全文件、以及 建立 SSL/TLS 连接。
在真实产品中,您需要将可信目录与一些由根 CA 颁发机构签名的真实证书一起使用。
但是、您不能将两者混合。
同样、连接到 HTTPS 服务器需要使用受信任目录、但还需要确保根 CA 位于目录中、并且也编程到文件系统中。
什洛米
因此、当我添加 certcatalog20200715.lst 和 certcatalog20200715.lst.signed_323x.bin 文件的文件时、 未选中 Use default Trusted Root Certificate Catalog (使用默认受信任的根证书目录)。 并 取消选中"Use Vendor Certificate Catalog (使用供应商证书目录)"。
我为什么会得到
操作失败:错误:SLImageCreator.exe:fs_programming error:rett:-10287、ex_err:2694 - fs_ERR_root_ca_is_unkown。
这是因为操场的认证仍然在文件系统中的用户文件?
由 Let's Encrypt 提供的 DST 根 CA X3。
https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/
您好!
回到失效的根 CA 的主要问题、我想确定预期的根 CA 是什么。 这取决于尝试连接时从服务器获得的证书链。 您能仔细检查一下吗? 我可以看到、某些器件解决了这个问题、但某些物联网器件仍然没有解决方案。 您可以在这里看到 https://letsencrypt.org/certificates/ 和 https://letsencrypt.org/2020/12/21/extending-android-compatibility (对于 Android)。
我只是想了解我们在内部应该采取什么路径来批准连接。
此致、
什洛米
Shlomi,
目前我使用的是 HTTPClient.h API。 您认为、为了解决当前问题、我必须使用 RAW 套接字代码手动完成所有这些操作?
当前代码如下所示。
void* httpTask(void* pvParameters)
{
bool moreDataFlag = false;
char data[HTTP_MIN_RECV];
int16_t ret = 0;
int32_t len = 0;
//GET THESE on the DEVICE along with the ROOTCA.
httpSecParams.clientCert = "cert.pem";
httpSecParams.privateKey = "key.pem";
httpSecParams.rootCa = "isrgrootx1.der";
Display_printf(display, 0, 0, "Sending a HTTP GET request to '%s'\n",
HOSTNAME);
HTTPClient_Handle httpClientHandle;
int16_t statusCode;
httpClientHandle = HTTPClient_create(&statusCode,0);
if(statusCode < 0)
{
printError("httpTask: creation of http client handle failed",
statusCode);
}
ret = HTTPClient_setHeader(httpClientHandle,
HTTPClient_HFIELD_REQ_USER_AGENT,
USER_AGENT,strlen(USER_AGENT)+1,
HTTPClient_HFIELD_PERSISTENT);
if(ret < 0)
{
printError("httpTask: setting request header failed", ret);
}
ret = HTTPClient_connect(httpClientHandle,HOSTNAME,&httpSecParams,0);
if(ret < 0)
{
printError("httpTask: connect failed", ret);
}
ret = HTTPClient_sendRequest(httpClientHandle,HTTP_METHOD_GET,REQUEST_URI,
NULL,0,
0);
if(ret < 0)
{
printError("httpTask: send failed", ret);
}
if(ret != HTTP_SC_OK)
{
printError("httpTask: cannot get status", ret);
}
Display_printf(display, 0, 0, "HTTP Response Status Code: %d\n", ret);
len = 0;
do
{
ret = HTTPClient_readResponseBody(httpClientHandle, data, sizeof(data),
&moreDataFlag);
if(ret < 0)
{
printError("httpTask: response body processing failed", ret);
}
Display_printf(display, 0, 0, "%.*s \r\n",ret,data);
len += ret;
}
while(moreDataFlag);
Display_printf(display, 0, 0, "Received %d bytes of payload\n", len);
ret = HTTPClient_disconnect(httpClientHandle);
if(ret < 0)
{
printError("httpTask: disconnect failed", ret);
}
HTTPClient_destroy(httpClientHandle);
return(0);
}
您好!
可能会更复杂一点、但由于使用 NetSock、基础设施仍然存在。
在 HttpClient_connect ()中,可以看到 使用了 SlNetSock_secAttribSet () API。 此 API 可以获得一组选项来设置到连接。 在内部可以看到 使用了 SLNETSOCK_SEC_ATTRIB_DOMAIN_NAME。 此外、还通过此 API 来设置证书和密钥的名称。 幸运的是、另一个属性是 SLNETSOCK_SEC_ATTRIB_DISABLE_CERT_STORE、它完全用于绕过证书存储以便您可以添加它。
此致、
什洛米
Shlomi,
我修改了 httpclient.c 中的代码、以添加禁用证书存储。
int16_t HTTPClient_connect(HTTPClient_Handle client, const char *hostName, HTTPClient_extSecParams *exSecParams, uint32_t flags)
{
HTTPClient_CB *cli = (HTTPClient_CB *)client;
uint16_t intFlags = 0;
uint16_t port = 0;
int16_t retVal;
char domainBuff[HTTPClient_DOMAIN_BUFLEN];
char *domainPtr = NULL;
/* Secure attribute memory is cleaned up in HTTPClient_disconnect */
SlNetSockSecAttrib_t *secAttribs = NULL;
/* Extract security parameters */
if (exSecParams != NULL)
{
retVal = createSecAttribs(exSecParams, &secAttribs);
if (retVal < 0)
{
return (retVal);
}
retVal = parseURI(hostName, &port, domainBuff, &intFlags);
if ((retVal == 0) && (intFlags & ISDOMAIN))
{
/*
* Copy the domain into malloced memory to avoid pointing to the
* stack's memory inside secAttribs.
*/
domainPtr = malloc((strlen(domainBuff) + 1));
if(!domainPtr)
{
SlNetSock_secAttribDelete(secAttribs);
return (SLNETERR_RET_CODE_MALLOC_ERROR);
}
memcpy(domainPtr, domainBuff, (strlen(domainBuff) + 1));
retVal = SlNetSock_secAttribSet(secAttribs, SLNETSOCK_SEC_ATTRIB_DOMAIN_NAME
|| SLNETSOCK_SEC_ATTRIB_DISABLE_CERT_STORE,
domainPtr, strlen(domainPtr) + 1);
if (retVal < 0)
{
free(domainPtr);
SlNetSock_secAttribDelete(secAttribs);
return (retVal);
}
}
cli->secAttribs = secAttribs;
cli->secAttribsAllocated = true;
}
else if (cli->secAttribs != NULL)
{
/* We're attempting to reconnect to a server */
secAttribs = cli->secAttribs;
}
retVal = HTTPClient_connect2(client, hostName, secAttribs, flags, NULL);
if (retVal < 0)
{
HTTPClient_disconnect(client);
}
return (retVal);
}
但我仍然收到以下返回代码 SL_SSL_NOTIFICATION_WRONG_ROOT_CA、同时请求"dst Root CA X3"。
您好!
几点意见:
uint32_t dummyVal = 1;
retVal = SlNetSock_secAttribSet(secAttribs, SLNETSOCK_SEC_ATTRIB_DISABLE_CERT_STORE, (void *)&dummyVal, sizeof(dummyVal));
if (retVal < 0)
{
SlNetSock_secAttribDelete(secAttribs);
return (retVal);
}此致、
什洛米