Вопрос

Привет, у меня возникли проблемы при попытке опубликовать веб-запрос в разделе Https.

я получил следующие ошибки

1.-Базовое соединение было закрыто:Невозможно подключиться к удаленному серверу.

2.-операция TimeOut

3-Базовое соединение было закрыто:Не удалось установить безопасный канал для SSL/TLS.

Я пробовал использовать примерно 3 или 4 разных прокси-сервера моей компании и компании-клиента, и даже когда я напрямую обращаюсь к провайдеру Интернета без ограничений, я получаю вышеуказанные ошибки при выполнении следующего метода

WebRequest.GetRequestStream() 

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

Это под .NET Framework 1.1, а запрос уже содержит сетевые учетные данные.

что может быть?

Обновлять

внутреннее исключение, третья ошибка следующая:Функция завершилась успешно, но ее необходимо вызвать еще раз, чтобы завершить контекст.

согласно iisper.h документация эта ошибка относится к

//
// MessageId: SEC_I_CONTINUE_NEEDED
//
// MessageText:
//
//  The function completed successfully, but must be called
//  again to complete the context
//
#define SEC_I_CONTINUE_NEEDED            ((HRESULT)0x00090312L)

на MSDN это относится к

SEC_I_CONTINUE_NEEDED Клиент должен отправить выходной токен на сервер и ждать токена возврата.Возвращенный токен затем передается в другом вызове InitializeSecurityContext (Schannel).Выходной токен может быть пустым.

означает ли это, что на компьютере отсутствует сертификат клиента?

Это было полезно?

Решение

Есть целый ряд вещей, которые могут усложнить ситуацию, например, несоответствия сертификатам SSL и т. д.Но сначала вам следует выполнить базовую отладку, чтобы исключить очевидные вещи:

-- Пробовали ли вы отправить простой веб-запрос на другие серверы?Попробуйте оба (незащищенный) http и (защищенный) https.

-- Вы пытались подключиться с другого компьютера или из другой сети?Вы упомянули, что клиент находится за прокси;сначала попробуйте компьютер без прокси, чтобы исключить это.

-- Вы делаете несколько веб-запросов в течение сеанса?Существует жесткое ограничение на количество открытых запросов, поэтому обязательно закрывайте их после получения WebResponse.Возможно, сделать тестовую программу всего с одним запросом.

Если это не сужает круг вопросов, то, вероятно, это что-то более сложное, с сервером или прокси.Вы можете отслеживать исходящие сетевые пакеты с помощью такой программы, как netshark, чтобы попытаться отследить, где что-то застревает.

Другие советы

Вы можете отслеживать HTTP-трафик, используя Скрипач или инструмент для анализа сетевых пакетов, например эфирный Виршарк на машине, где он работает, и на одной из других машин и сравните результаты.Это довольно низкий уровень, но может пролить некоторый свет на проблему.

  • Если вы можете подключиться к номеру 443 с разных компьютеров, то это не первые два, поскольку это означает, что клиентский компьютер получает запросы на этот порт.

В окнах это будет

telnet <domainname> 443

и если он подключится, экран погаснет (нажмите Enter несколько раз, чтобы выйти)

  • Прокси-серверы могут или не могут на самом деле заботиться о вашем запросе, если он находится под HTTPS, поскольку они не могут его прочитать.

  • Установлены ли на других машинах сертификат клиента и цепочка сертификатов?

Вероятно, имя сертификата SSL не совпадает.Это часто происходит с самозаверяющими сертификатами.

Решение состоит в том, чтобы написать собственную процедуру аутентификации, в которой вы либо всегда возвращаете true, либо выполняете необходимую аутентификацию, чтобы убедиться, что сертификат действителен.

// .NET 2.0+
...
ServicePointManager.ServerCertificateValidationCallback += MyValidationCallback
...
public bool MyValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors err)
{
  return true;
}

// .NET 1.1
public class MyCertificatePolicy : ICertificatePolicy
{
  public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
  {
    return true;
  }
}
...
ServicePointManager.CertificatePolicy = new MyCertificatePolicy();
...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top