Понимание SSL-соединений с помощью HttpWebRequest .NET
-
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 (имя пользователя, пароль)