【发布时间】:2008-11-10 22:00:14
【问题描述】:
我正在开发一个简单的小功能,使用 WinInet 功能从启用 SSL 的网站下载文件,即 InternetOpen 和 InternetOpenURL。我最初使用 ERROR_INTERNET_INVALID_CA (12045) 调用 InternetOpenURL 失败,因为我在测试服务器上使用自签名证书,并发现 (http://support.microsoft.com/kb/q182888/) 修复似乎是使用 InternetQueryOption/ InternetSetOption 组合将各种标志传递给INTERNET_OPTION_SECURITY_FLAGS 选项。然而,现在 InternetQueryOption 失败,来自 GetLastError() 的 ERROR_INTERNET_INCORRECT_HANDLE (12018) 响应。任何想法为什么会这样?我正在使用直接来自 InternetOpen 的句柄,它以前与非 SSL InternetOpenURL 一起工作得很好。这不应该是正确的句柄吗?
我没有实际代码(不同的计算机),但它与以下非常相似,并且在 InternetGetOption 上失败,ERROR_INTERNET_INCORRECT_HANDLE:
HINTERNET hReq = InternetOpen(...)
if (!hReq) { printf("InternetOpen Error: %d", GetLastError()); }
DWORD dwFlags = 0;
DWORD dwBuffLen = sizeof(dwFlags);
BOOL ret = false;
ret = InternetQueryOption(hReq, INTERNET_OPTION_SECURITY_FLAGS,
(LPVOID)&dwFlags, &dwBuffLen);
if (!ret) { printf("InternetQueryOption Error: %d", GetLastError()); }
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
ret = InternetSetOption(hReq, INTERNET_OPTION_SECURITY_FLAGS,
&dwFlags, sizeof (dwFlags) );
if (!ret) { printf("InternetSetOption Error: %d", GetLastError()); }
InternetOpenURL(hReq, ...)
【问题讨论】:
-
我很困惑,您是从 InterntOpen 而不是 InternetOpenUrl 传递句柄,那么 http 与 https 怎么可能有关系?顺便说一句:我假设您的意思是 InternetQueryOption,而不是 get 选项。
-
我最初是在中间没有 Internet*Option 东西的情况下尝试这段代码,并得到错误
ERROR_INTERNET_INVALID_CA(12045),所以我试图设置在我实际执行 HTTPS 之前忽略无效 CA 的选项。是的,我指的是 printf 中的 InternetQueryOption。