Сбои SSL - получение исключения SSL / TLS при использовании HttpWebRequest с клиентским сертификатом - PullRequest
13 голосов
/ 11 февраля 2012

У меня есть Windows 2008 Server с IIS 7, который использует приложение .NET C # для отправки запросов в PayPal для обработки платежей.Несколько месяцев назад я установил Сертификат, который был приобретен Verisign.После установки я смог запустить свой код WebClient для успешного создания соединений SSL и обрабатывать платежи через PayPal NVP API (пара имя-значение).

В последнее время я получаю сообщение об ошибке во время транзакции SSL.Конкретная ошибка выглядит следующим образом:

Не удалось создать безопасный канал SSL / TLS

Я проверил все, что мог придумать, и прочитал много статей о StackOverflow идругие места в сети.

Лучший ресурс, который я нашел, был таким:

Запрос был прерван: не удалось создать безопасный канал SSL / TLS

Найти ошибку в этомarticle http://support.microsoft.com/kb/915599 Resolution 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. Переустановите сертификат и поместите его в различные магазины (Personal, LocalComputer)
  2. Добавлен этот код ServiceManager:

    ServicePointManager.Expect100Continue = true;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
    
  3. Включено ведение журнала для получения более подробной информации

  4. Различные другие решенияons, перечисленные в приведенных выше ссылках

То, что так расстраивает, это то, что это работало нормально несколько месяцев назад, и теперь я получаю эту ошибку.Сначала я подумал, что срок действия сертификата истек, но, похоже, все в порядке.

Это может быть пакет обновления или исправление для Windows Server, создающее новый параметр или сценарий, который нарушает SSL.Я полагал, что переустановка сертификата решит это.

Важно отметить, что когда я переустанавливал, я просто добавлял его в различные магазины (дважды нажмите на сертификат и установите).Я не создал "Запрос сертификата".Поскольку он уже установлен и привязан к порту SSL моего приложения IIS, все должно быть в порядке.

Это код, который создает веб-запрос:

     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-машины:

Это настройки привязки SSL в IIS: SSL Bindings

Вотобзор установленных сертификатов: certs1

Это ошибка, которую я получаю: SSL Error

certs2

Установленные сертификаты: enter image description here

Сведения о сертификате enter image description here

Буду признателен за любые советы по исправлению этой ошибки.Вот некоторые возможности, которые я рассмотрел, но не рассмотрел:

  1. Может ли запрос занять слишком много времени?Это кажется достаточно быстрым ... но я читал, что это может быть проблемой.
  2. В Internet Explorer я вижу зеленую "панель SSL", которая показывает, что этот сайт проверен как безопасный.Это говорит о том, что сертификат установлен правильно, это правда?
  3. Существует ли простой тест, который я могу выполнить с каким-либо HTTP-запросом, чтобы помочь сузить источник проблемы?
  4. Может ли это быть как-то связано с PayPal?Возможно ли PayPal отклонить запрос из-за учетных данных на их конце?
  5. Может ли реализация интерфейса ICertificatePolicy помочь в устранении проблемы?Я надеюсь, что смогу это просто исправить.

Я бы подумал, что либо SSL будет работать, либо нет, он вообще не имеет отношения к PayPal ... но я могу ошибаться.

Мне кажется, что я должен иметь возможность просто использовать URL-адрес пары имя-значение, созданный классом WebClient, и отправить его по каналу через IE и получить ответ.

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Я думаю, что есть вероятность, что проблема не в сертификате вашего клиента, а в сертификате PayPal.

На ваш вопрос:

В Internet Explorer ясм. зеленую «панель SSL», которая показывает, что этот сайт проверен как безопасный.Это говорит о том, что сертификат установлен правильно, это правда?

Нет, это означает, что сертификат сервера PayPal проверен вашим браузером, то есть сертификат PayPal подписан кем-то, добавленным при сертификациивласть.Однако сертификат PayPal не добавляется в ваши доверенные сертификаты.

Я также заметил, что действующий сертификат PayPal действует с 23.3.2011.Возможно, до этого ваше приложение работало, а теперь, когда оно было изменено, оно перестало работать.

Исходя из этого, я рекомендую установить собственный сертификат PayPal в качестве сертификата сервера.

0 голосов
/ 26 сентября 2012

Этот другой SO ответ может быть полезным:

Проблема с платежами Paypal Pro

Таким образом, вы должны просто попробовать это на живом PP сервере и посмотреть, как оно работает:)

...