Подтвердить что ты не робот

Ошибки SSL - получение исключения SSL/TLS при использовании HttpWebRequest с сертификатом клиента

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

В последнее время я получаю сообщение об ошибке во время транзакции 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-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

Я пробовал следующие решения:

  • Переустановите сертификат и поместите его в различные магазины (Personal, LocalComputer).
  • Добавлен код ServiceManager:

    ServicePointManager.Expect100Continue = true;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
    
  • Включено ведение журнала, чтобы получить более подробные сведения

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

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

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

Важно отметить, что при переустановке я просто добавлял его в различные магазины (Double Click cert и install). Я не создал "Запрос сертификата". Поскольку он уже установлен и привязан к порту 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

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

  • Может ли запрос занять слишком много времени? Это кажется достаточно быстрым... но я читал, что это может быть проблемой.
  • В Internet Explorer я вижу Зеленую "SSL-панель", которая показывает, что этот сайт проверен как безопасный. Это говорит мне, что Cert установлен правильно, это правда?
  • Есть ли простой тест, который я могу выполнить с каким-либо HTTP-запросом, чтобы помочь сузить источник проблемы?
  • Может ли это иметь какое-либо отношение к PayPal? Возможно ли, что paypal отклоняет запрос из-за полномочий на их конец?
  • Внедрение ICertificatePolicy Interface может помочь в отладке проблемы? Я надеюсь, что смогу это исправить.

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

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

4b9b3361

Ответ 1

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

По вашему вопросу:

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

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

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

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

Ответ 2

Этот другой ответ SO может помочь:

Проблема с Paypal Payments Pro

В общем, вы должны просто попробовать его на реальном PP-сервере и увидеть, как он работает:)