SSL Failures - Receiving SSL/TLS exception when using HttpWebRequest with client certificate

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

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

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

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

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

Запрос был прерван: Could not create SSL/TLS secure channel

Посмотрите ошибку в этой статье 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

А вот список всех других ресурсов, которые я пробовал читать и внедрять их решения:

Various Links I've Tried:

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

Could not create SSL/TLS secure channel - Could the problem be a proxy server?

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

Запрос был прерван: Could not create SSL/TLS secure channel - Decrypt returned 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.Sl3;
    
  3. Включил ведение журнала для получения более подробной информации

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

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

Возможно, пакет обновления или исправление для 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", которая показывает, что этот сайт подтвержден как безопасный. Это говорит о том, что Cert установлен правильно, так ли это?
  3. Есть ли простой тест, который я могу выполнить с помощью HTTP-запроса, чтобы определить источник проблемы?
  4. Может ли это быть связано с PayPal? Возможно ли, что PayPal отклоняет запрос из-за учетных данных на их стороне?
  5. Может ли реализация интерфейса ICertificatePolicy Interface помочь в отладке проблемы? Я надеюсь, что смогу просто исправить это.

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

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

13
задан Community 23 May 2017 в 12:17
поделиться