用https协议报ERROR_INTERNET_INVALID_CA错误处理方法

Again:
try
{
pHttpFile->SendRequest();
}
catch(CInternetException* e)
{
int err = GetLastError();
if (err == ERROR_INTERNET_INVALID_CA)
{
DWORD dwFlags = 0;
DWORD dwBuffLen = sizeof(dwFlags);

//无用户界面

pHttpFile->QueryOption(INTERNET_OPTION_SECURITY_FLAGS,(LPVOID)&dwFlags,&dwBuffLen);
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;

pHttpFile->SetOption(INTERNET_OPTION_SECURITY_FLAGS,&dwFlags,sizeof(dwFlags));

//有用户界面

// if (pHttpFile->ErrorDlg(GetDesktopWindow(),err, FLAGS_ERROR_UI_FILTER_FOR_ERRORS
// | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA
// | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
// NULL) != ERROR_SUCCESS)
// {
// throw e;
// }

goto Again;
}

}


以下摘自http://support.microsoft.com/kb/182888/zh-cn

方法 1。与用户界面 (生成一个消息框,类似于 Internet Explorer):

   ...
   Again:
   if (!HttpSendRequest (hReq,...))
       dwError = GetLastError ();

   if (dwError == ERROR_INTERNET_INVALID_CA)
   {
       // Make sure to check return code from InternetErrorDlg
       // user may click either OK or Cancel. In case of Cancel
       // request should not be resumbitted.
       InternetErrorDlg (GetDesktopWindow(),
                         hReq,
                         ERROR_INTERNET_INVALID_CA,
                         FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
                         FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
                         FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
                         NULL);
      goto again;
   }
   ...
				
方法 2。而无需用户界面:
   ...
   Again:
   if (!HttpSendRequest (hReq,...))
      dwError = GetLastError ();
   if (dwError == ERROR_INTERNET_INVALID_CA)
   {
      DWORD dwFlags;
      DWORD dwBuffLen = sizeof(dwFlags);

      InternetQueryOption (hReq, INTERNET_OPTION_SECURITY_FLAGS,
            (LPVOID)&dwFlags, &dwBuffLen);

      dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
      InternetSetOption (hReq, INTERNET_OPTION_SECURITY_FLAGS,
                            &dwFlags, sizeof (dwFlags) );
      goto again;
   }
   ...
				
与 MFC WinInet 类可以使用相似的逻辑。在这种情况下,下面的 MFC 方法对应于 WinInet 上面使用的 Api:

  • CInternetFile::SendRequest
  • CInternetFile::QueryOption
  • CInternetFile::SetOption
  • CInternetFile::ErrorDlg
请注意缺少 Visual C++ 5.0 CInternetFile::ErrorDlg,CInternetFile::QueryOption 和 CInternetFile::SetOption 文档。请参阅 Inet.cpp MFC 源代码文件有关如何使用此方法。

注 1: InternetErrorDlg 可能会返回下列值:
   ERROR_SUCCESS
   ERROR_CANCELLED
   ERROR_INTERNET_FORCE_RETRY.
				
仅当返回 ERROR_INTERNET_FORCE_RETRY 时,应重新提交请求。在 Internet Explorer 4.0 和 4.01 中,但是,该请求必须重新提交即使返回 ERROR_SUCCESS。

Microsoft 已经确认这是 InternetErrorDlg API 中的问题。注 2: SECURITY_FLAG_IGNORE_UNKNOWN_CA 在 Internet Explorer 3.0 和 3.02 未实现。

InternetErrorDlg 仍然起作用,但有以下例外。此 API 生成对话框中不允许忽略无效的证书颁发机构的错误 ;它是只是通知给用户的页面无法查看。

注 3: 发生错误前,不能设置选项,将忽略此错误。首先,您必须尝试发送请求,收到错误消息,然后设置选项 (或调用 InternetErrorDlg),并重新提交。

你可能感兴趣的:(用https协议报ERROR_INTERNET_INVALID_CA错误处理方法)