не можете опубликовать https WebRequest в .net?
-
08-07-2019 - |
Вопрос
Привет, у меня возникли проблемы при попытке опубликовать веб-запрос в разделе 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();
...