SSL失败 - 在将HttpWebRequest与客户端证书一起使用时接收SSL/TLS异常

noc*_*ier 13 .net security ssl certificate

我有一个带有IIS 7的Windows 2008 Server,它使用.NET C#应用程序向PayPal发送请求以处理付款.几个月前,我安装了Verisign购买的证书.安装后,我能够运行我的WebClient代码以成功创建SSL连接,并通过PayPal NVP API(名称值对)处理付款.

最近,我在SSL交易期间收到了一个错误.具体错误如下:

无法创建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-请求功能于一个应用程序 - 即-被建 - 上的净框架-2-0.aspx

这里列出了我尝试阅读并提出解决方案的所有其他资源:

我试过的各种链接:

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

无法创建SSL/TLS安全通道 - 问题可能是代理服务器吗?

请求已中止:无法创建SSL/TLS安全通道

请求已中止:无法创建SSL/TLS安全通道 - Decrypt已返回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-请求功能于一个应用程序 - 即-被建 - 上的净框架-2-0.aspx

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

我尝试了以下解决方案:

  1. 重新安装证书,并将其放入各种商店(个人,本地计算机)
  2. 添加了此ServiceManager代码:

    ServicePointManager.Expect100Continue = true;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 启用日志记录以获取更详细的详细信息

  4. 以上链接中列出的各种其他解决方案

令人沮丧的是,这几个月前工作正常,现在我收到了这个错误.起初,我认为证书已过期,但似乎没问题.

它可能是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; 
    }
Run Code Online (Sandbox Code Playgroud)

以下是一系列屏幕截图,用于显示SSL机器的各个组件:

这是IIS中的SSL绑定设置: SSL绑定

以下是已安装的Certs的概述: certs1

这是我收到的错误: SSL错误

certs2

Certs已安装: 在此输入图像描述

证书细节 在此输入图像描述

任何有关修复此错误的建议都将非常受欢迎.我考虑但未解决的一些可能性是:

  1. 请求可能需要太长时间吗?它似乎足够快......但我读过这可能是一个问题.
  2. 在Internet Explorer中,我确实看到绿色"SSL条",它显示此站点已被验证为安全.这告诉我Cert安装正确,这是真的吗?
  3. 是否有一个简单的测试,我可以使用某种HTTP请求来帮助缩小问题的根源?
  4. 这可能与PayPal有关吗?Paypal是否有可能因为他们的凭证而拒绝该请求?
  5. 在调试问题时,实现ICertificatePolicy接口会有什么帮助吗?我希望我能解决它.

我认为无论SSL是否有效,它对PayPal都没有任何影响/依赖......但我可能是错的.

我觉得我应该只能使用由WebClient类构建的名称值对URL,并通过IE通过管道发送它并接收响应.

小智 3

我认为问题可能不在于您的客户证书,而在于 PayPal 的证书。

关于你的问题:

在 Internet Explorer 中,我确实看到绿色的“SSL 栏”,表明该网站已被验证为安全的。这表明证书已正确安装,这是真的吗?

不,这意味着PayPal的服务器证书是由您的浏览器验证的,即PayPal的证书是由您添加的证书颁发机构签名的。但是,PayPal 的证书不会添加到您的可信证书中。

我还注意到,PayPal 当前的证书自 2011 年 3 月 23 日起生效。也许在那之前您的应用程序一直在工作,而现在它已更改,应用程序已停止工作。

基于此我建议尝试安装 PayPal 自己的证书作为服务器证书。