У меня есть сервер 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, и сервер не понимает его.
А вот список всех других ресурсов, которые я пробовал читать и внедрять их решения:
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://forums.iis.net/t/1156690.aspx
Я попробовал следующие решения:
Добавил этот код ServiceManager:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Sl3;
Включил ведение журнала для получения более подробной информации
Что так расстраивает, так это то, что все работало нормально несколько месяцев назад, а теперь я получаю эту ошибку. Сначала я подумал, что срок действия сертификата истек, но, похоже, все в порядке.
Возможно, пакет обновления или исправление для 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 либо работает, либо нет, это никак не связано/зависит от PayPal... но я могу ошибаться.
Мне кажется, что я должен быть в состоянии просто использовать URL Name Value Pair, который создается классом WebClient, и отправить его по трубе через IE и получить ответ.