Понимание SSL-соединений с помощью HttpWebRequest .NET

StackOverflow https://stackoverflow.com/questions/400428

  •  03-07-2019
  •  | 
  •  

Вопрос

Кажется, я не могу уложиться в этом.Я использую HttpWebRequest, чтобы попытаться отправить некоторые данные на другой сайт.Я пытаюсь найти лучший способ настроить наши брандмауэры, но теряюсь.Судя по трассировке NetMon, создается впечатление, что он игнорирует то, что я ему говорю;заголовки HTTP, которые я вижу, исходят из запроса (не запроса браузера на мой сервер, а запроса моего сервера на удаленный сервер), не складываются.

Http: Request, CONNECT some.random.url:443
Command: CONNECT
URI: some.random.url:443
    Location: some.random.url:443
ProtocolVersion: HTTP/1.1
Host: some.random.url
ProxyConnection: Keep-Alive
HeaderEnd: CRLF

TCP DstPort также всегда начинается с HTTP(80).Кажется, изначально я не могу заставить его обрабатывать 443, несмотря ни на что;SSL начинается с согласования порта 80, прежде чем он начнет «реальную» передачу?Для загрузки этот запрос, похоже, игнорирует любые настройки HttpWebRequest, которые я пытаюсь установить перед инициированием запроса:даже если я устанавливаю HTTP 1.0 или для параметра Keep-Alive значение false, он все равно начинается с вышеуказанных заголовков.

Что он делает?Я хотел бы знать, как это пропустить, но я не уверен, почему он демонстрирует такое поведение?

Код ниже, если это поможет.

Uri newUri = new Uri("https://some.random.url:443/random");
System.Net.HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(newUri);
wr.Method = "POST";
wr.ContentType = "application/x-www-form-urlencoded";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] requestBytes = encoding.GetBytes("test");
wr.ContentLength = requestBytes.Length;
System.IO.Stream stream = wr.GetRequestStream(); //FAILS HERE, ServerProtocolViolation

Я изучил Google и другие проблемы SSL/HttpWebRequest, но не смог найти серебряной пули.

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

Решение

Похоже, ваша проблема заключается в прокси-сервере между вашим сервером ASP.NET и удаленным сервером.Вы можете попробовать не использовать прокси-сервер (wr.Proxy = null), но это может потребоваться для настройки вашей сети.

Я бы порекомендовал поговорить с тем, кто отвечает за сеть, в которой находится ваш сервер, и посмотреть, поддерживает ли прокси-сервер сквозную передачу SSL (через команду CONNECT, которую .NET отправляет от вашего имени).

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

я сделал HttpWebRequest звонит через SSL и никогда не сталкивался с этой проблемой.Единственное, что я вижу, что вы делаете, чего я никогда не делал, это включение номера порта (443) в URL-адрес.

.NET должен обрабатывать создание SSL-соединения, не сообщая, какой порт использовать при использовании https протокол.Если вы еще этого не сделали, попробуйте без номера порта.Если да, то у меня нет идей ;)

попробуйте это и дайте мне знать, как вы это найдете!

htw.Credentials = новые NetworkCredentials (имя пользователя, пароль)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top