文章編號: 182888 - 上次校閱: 2004年7月1日 - 版次: 2.1

如何處理使用 Wininet 無效的憑證授權單位時發生錯誤

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
全部展開 | 全部摺疊

結論

如果伺服器 SSL 憑證發出由未知或無效的憑證授權單位 Wininet HttpSendRequest API 或 MFC CInternetFile::SendRequest 將失敗,錯誤 12045 (ERROR_INTERNET_INVALID_CA)。

當 Internet Explorer 嘗試存取相同的 URL 時,會報告類似的錯誤。

其他相關資訊

當用戶端不知道發出伺服器憑證之憑證授權單位時,就會發生這個錯誤。問題可能會修正藉由安裝憑證授權單位的根憑證。從 Internet Explorer,可檢視所有已安裝的憑證清單。從 [檢視] 功能表按一下 [網際網路選項],按一下 [內容] 索引標籤然後按一下 [授權]]。

它有可能略過此錯誤在 Wininet 應用程式而不安裝憑證。有兩個方法可以處理這個錯誤。您可以使用類似下列的程式碼。

方法 1。使用 (產生類似於 Internet Explorer 的訊息方塊) 的 UI:
   ...
   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。沒有 UI:
   ...
   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 傳回時,只要求應該會重新提交。重新在網際網路總管 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),並重新提交。

?考

如需詳細資訊請參閱下列的發行項 「 Microsoft 知識庫 」 中:
168151? (http://support.microsoft.com/kb/168151/EN-US/ ) 如何讓使用 Wininet SSL 要求

這篇文章中的資訊適用於:
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
關鍵字:?
kbmt kberrmsg KB182888 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:182888? (http://support.microsoft.com/kb/182888/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
Retired KB Article依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。