3

我正在开发一个简单的小功能,使用 WinInet 功能从启用 SSL 的网站下载文件,即 InternetOpen 和 InternetOpenURL。我最初使用 ERROR_INTERNET_INVALID_CA(12045) 调用 InternetOpenURL 失败,因为我在测试服务器上使用自签名证书,并发现 ( http://support.microsoft.com/kb/q182888/ ) 修复似乎是使用 InternetQueryOption/InternetSetOption 组合将各种标志传递给INTERNET_OPTION_SECURITY_FLAGS选项。然而,现在 InternetQueryOption 失败,ERROR_INTERNET_INCORRECT_HANDLEGetLastError() 发出 (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, ...)
4

3 回答 3

2

我曾经收到类似的错误。然后我将 HttpOpenRequest(...) 返回的句柄传递给 InternetQueryOption,它工作得很好。试试看。

于 2009-03-14T10:55:57.787 回答
1

来自 INTERNET_OPTION_SECURITY_FLAGS 的 MSDN 文档:

请注意,以这种方式检索的数据与已发生的事务相关,其安全级别无法再更改。

您的句柄上尚未发生任何交易。InternetOpen 为您提供根 HINTERNET 句柄。这可能适用于 HTTP、FTP 或 Gopher 连接——而安全选项相当特定于 HTTPS,并且很大程度上还取决于远程服务器支持的内容。因此,您正在向 Wininet 询问它无法提供给您的信息。

于 2009-02-08T11:25:40.270 回答
0

我看到你没有检查hReq你从InternetOpen. 也许这就是你问题的根源。如果您在调用后立即添加它,看看这会告诉您什么InternetOpen

if (hReq == NULL) {
    printf("InternetOpen Error: %d", GetLastError());
}
于 2008-11-10T22:35:34.150 回答