невозможно опубликовать веб-запрос https в .net? - PullRequest
1 голос
/ 13 ноября 2008

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

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

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

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

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

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

WebRequest.GetRequestStream() 

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

это под .net framework 1.1 и запрос уже содержит сетевые учетные данные.

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

Обновление

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

согласно документации 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). Выходной токен может быть пустым.

означает ли это, что на ПК отсутствует сертификат клиента?

Ответы [ 4 ]

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

На окнах, которые будут

telnet <domainname> 443

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

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

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

1 голос
/ 13 ноября 2008

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

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

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

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

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

1 голос
/ 13 ноября 2008

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

0 голосов
/ 13 ноября 2008

Возможно, имя 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();
...
...