Dot-Net

SSL 失敗 - 將 HttpWebRequest 與客戶端證書一起使用時收到 SSL/TLS 異常

  • April 25, 2017

我有一個帶有 IIS 7 的 Windows 2008 伺服器,它使用 .NET C# 應用程序向 PayPal 發送請求以處理付款。幾個月前,我安裝了 Verisign 購買的證書。安裝後,我能夠執行我的 WebClient 程式碼以成功創建 SSL 連接,並通過 PayPal NVP API(名稱值對)處理付款。

最近,我在 SSL Transaction 期間收到錯誤消息。具體錯誤如下:

無法創建 SSL/TLS 安全通道

我已經檢查了我能想到的所有內容,並閱讀了 StackOverflow 和網路上其他地方的許多文章。

我找到的最好的資源是:

請求被中止:無法創建 SSL/TLS 安全通道

在這篇文章中查找錯誤http://support.microsoft.com/kb/915599 解析度 J。也可能是您沒有提供客戶端證書。這很可能是使用 TLS 或 SSL3 並且伺服器不理解它的問題。

http://blogs.msdn.com/b/jpsanders/archive/2009/01/07/you-receive-one-or-more-error-messages-when-you-try-to-make-an-http-request-in-an-application-that-is-built-on-the-net-framework-2-0.aspx

這是我嘗試閱讀和實施他們的解決方案的所有其他資源的列表:

我嘗試過的各種連結:

http://support.microsoft.com/kb/901183

無法創建 SSL/TLS 安全通道 - 問題可能出在代理伺服器上嗎?

請求被中止:無法創建 SSL/TLS 安全通道

請求被中止:無法創建 SSL/TLS 安全通道 - 解密返回 SEC_I_RENEGOTIATE

http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/99d49286-5c3a-4311-a1e3-499f035ce979/

http://blogs.msdn.com/b/jpsanders/archive/2009/01/07/you-receive-one-or-more-error-messages-when-you-try-to-make-an-http-request-in-an-application-that-is-built-on-the-net-framework-2-0.aspx

http://forums.iis.net/t/1156690.aspx

我嘗試了以下解決方案:

  1. 重新安裝證書,並將其放入各個商店(個人、本地電腦)
  2. 添加了此 ServiceManager 程式碼:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
  1. 啟用日誌記錄以獲得更詳細的詳細資訊
  2. 上述連結中列出的各種其他解決方案

令人沮喪的是,幾個月前它工作得很好,現在我收到了這個錯誤。起初,我以為證書過期了,但似乎沒問題。

它可能是 Windows Server 的 Service Pack 或 Hotfix 創建了破壞 SSL 的新設置或方案。我認為重新安裝證書可以解決這個問題。

需要注意的是,當我重新安裝時,我只是將它添加到各個商店(點兩下證書並安裝)。我沒有創建“證書請求”。由於它已經安裝並綁定到我的 IIS 應用程序的 SSL 埠,它應該沒問題。

這是創建 Web 請求的程式碼:

    public static Hashtable DoWebReq(string strNVP, string strNVPSandboxServer)
   {
       ServicePointManager.Expect100Continue = true;
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

       string _strNVP = strNVP; 

       //Create web request and web response objects, make sure you using the correct server (sandbox/live)
       var wrWebRequest = (HttpWebRequest)WebRequest.Create(strNVPSandboxServer);
       wrWebRequest.Method = "POST"; // POST

       var requestWriter = new StreamWriter(wrWebRequest.GetRequestStream());


       requestWriter.Write(_strNVP);
       requestWriter.Close();

       // Get the response.
       var hwrWebResponse = (HttpWebResponse)wrWebRequest.GetResponse();
       var responseReader = new StreamReader(wrWebRequest.GetResponse().GetResponseStream());

       //and read the response
       string responseData = responseReader.ReadToEnd();
       responseReader.Close();

       string result = System.Web.HttpContext.Current.Server.UrlDecode(responseData);

       string[] arrResult = result.Split('&');
       Hashtable htResponse = new Hashtable();
       string[] responseItemArray;
       foreach (string responseItem in arrResult)
       {
           responseItemArray = responseItem.Split('=');
           htResponse.Add(responseItemArray[0], responseItemArray[1]);
       }

       return htResponse; 
   }

下面是一組螢幕截圖,展示了 SSL 機器的各種組件:

這是 IIS 中的 SSL 綁定設置: SSL 綁定

以下是已安裝證書的概述: 證書1

這是我收到的錯誤: SSL 錯誤

證書2

已安裝證書: 在此處輸入圖像描述

證書詳情 在此處輸入圖像描述

任何有關修復此錯誤的建議將不勝感激。我考慮過但未解決的一些可能性是:

  1. 請求會花費太長時間嗎?它似乎足夠快……但我讀過這可能是一個問題。
  2. 在 Internet Explorer 中,我確實看到了綠色的“SSL 欄”,表明該站點已被驗證為安全。這告訴我證書安裝正確,這是真的嗎?
  3. 有沒有我可以使用某種 HTTP 請求執行的簡單測試來幫助縮小問題的根源?
  4. 這可能與PayPal有關嗎?貝寶是否有可能因為他們的憑據而拒絕請求?
  5. 實現ICertificatePolicy 介面對調試問題有幫助嗎?我希望我能修復它。

我認為 SSL 是否可以工作,它根本與 PayPal 沒有任何關係/依賴性……但我可能是錯的。

我覺得我應該能夠只使用由 WebClient 類建構的名稱值對 URL,並通過 IE 通過管道發送它並接收響應。

我認為問題可能不在您的客戶端證書中,而在 PayPal 中。

關於你的問題:

在 Internet Explorer 中,我確實看到了綠色的“SSL 欄”,表明該站點已被驗證為安全。這告訴我證書安裝正確,這是真的嗎?

不,這意味著 PayPal 的伺服器證書是由您的瀏覽器驗證的,即 PayPal 的證書是由添加為您的證書頒發機構的人簽名的。但是,PayPal 的證書不會添加到您的受信任證書中。

我還注意到,PayPal 目前的證書從 23.3.2011 開始有效。也許在那之前您的應用程序一直在工作,而現在它已更改,應用程序已停止工作。

基於此,我建議嘗試安裝 PayPal 自己的證書作為伺服器證書。

引用自:https://stackoverflow.com/questions/9242724