带有自签名证书的 InternetOpenUrl
Posted
技术标签:
【中文标题】带有自签名证书的 InternetOpenUrl【英文标题】:InternetOpenUrl with self signed certificate 【发布时间】:2020-07-30 10:01:47 【问题描述】:以下代码用于下载文件,但如果服务器有自签名证书则不起作用:
DWORD errCode = 0;
HINTERNET intOpenHandle = InternetOpen("Snippet", LOCAL_INTERNET_ACCESS, NULL, 0, 0);
errCode = GetLastError();
if (intOpenHandle != NULL && errCode == ERROR_SUCCESS)
HINTERNET urlOpenHandle = InternetOpenUrl(intOpenHandle, url, NULL, NULL, NULL, NULL);
errCode = GetLastError();
if (urlOpenHandle != NULL && errCode == ERROR_SUCCESS)
...
有没有办法修改它以使用自签名证书?
【问题讨论】:
你得到的错误代码是什么?否则尝试使用自定义 INTERNET_OPTION_SECURITY_FLAGS docs.microsoft.com/en-us/windows/win32/wininet/option-flags 调用 InternetSetOption(如 SECURITY_FLAG_IGNORE_***)ERROR_INTERNET_INVALID_CA
(12045),并尝试使用SECURITY_FLAG_IGNORE_UNKNOWN_CA
,但仍然是同样的错误...
你是在 InternetOpenUrl 之前调用它吗?尝试其他 SECURITY_FLAG_IGNORE_ 标志也可以看到:***.com/questions/41357008/…
在 InternetOpen()
和 InternetOpenUrl()
调用之间是的,因为后者给出了错误 12045。我会尝试其他 SECURITY_FLAG_IGNORE_*
标志...
试过SECURITY_FLAG_IGNORE_UNKNOWN_CA
和SECURITY_FLAG_IGNORE_WEAK_SIGNATURE
,但无济于事...
【参考方案1】:
InternetOpenUrl()
和 InternetSetOptions()
似乎不可能:后者需要打开的连接句柄,而不是前者提供的会话句柄。
因此我不得不使用更长的版本:
DWORD errCode = 0;
HINTERNET intOpenHandle = InternetOpen("Snippet", LOCAL_INTERNET_ACCESS, NULL, 0, 0);
if (intOpenHandle != NULL)
HINTERNET httpRequest = HttpOpenRequest(intConnect, "GET", urlPath, NULL, NULL, NULL,
INTERNET_FLAG_SECURE, 0);
if (httpRequest != NULL)
DWORD dwFlags;
DWORD dwBuffLen = sizeof(dwFlags);
if (InternetQueryOption(httpRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, &dwBuffLen))
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_WEAK_SIGNATURE |
SECURITY_FLAG_IGNORE_WRONG_USAGE;
InternetSetOption(httpRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));
if (HttpSendRequest(httpRequest, NULL, 0, NULL, 0))
...
【讨论】:
如果对您有帮助,您也可以随时accept your own answers。 想等待一个upvote,看看它是否对其他人有帮助......以上是关于带有自签名证书的 InternetOpenUrl的主要内容,如果未能解决你的问题,请参考以下文章
带有自签名证书的 Amazon Beanstalk Web 服务器?
如何使用 OpenSSL 生成带有 SubjectAltName 的自签名证书? [关闭]