Comprensione delle connessioni SSL con HttpWebRequest di .NET
-
03-07-2019 - |
Domanda
Non riesco a capirlo. Sto usando HttpWebRequest per provare e inviare alcuni dati a un altro sito. Sto cercando di capire il modo migliore per configurare i nostri firewall, ma sono in perdita. Osservando la traccia di NetMon, sembra che stia ignorando ciò che gli dico; le intestazioni HTTP che vedo escono dalla richiesta (non la richiesta dal browser al mio server, ma la richiesta dal mio server al server remoto) non si sommano.
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
Anche il TCP DstPort sembra iniziare sempre con HTTP (80). Non riesco a convincerlo a gestire inizialmente 443, non importa quale; SSL inizia con una porta 80 negoziata prima che inizi "reale"? trasmissione? Per avviare, questa richiesta sembra ignorare tutte le impostazioni di HttpWebRequest che provo a configurare prima di avviare la richiesta: anche se ho impostato HTTP 1.0 o keep-alive su false, inizia comunque con le intestazioni sopra.
Cosa sta facendo? Mi piacerebbe sapere come farlo passare, ma non sono sicuro del perché mostri quel comportamento?
Codice di seguito, se aiuta.
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
Ho cercato su Google e altri problemi SSL / HttpWebRequest, ma non riesco a trovare un proiettile d'argento.
Soluzione
Il tuo problema sembra essere il server proxy tra il tuo server ASP.NET e il server remoto. Puoi provare a non utilizzare il server proxy (wr.Proxy = null), ma potrebbe essere necessario per la configurazione della tua rete.
Consiglio di parlare con chiunque sia responsabile della rete in cui si trova il tuo server e di vedere se il proxy supporta il pass-through SSL (tramite il comando CONNECT che .NET invia per tuo conto).
Altri suggerimenti
Ho effettuato chiamate HttpWebRequest
su SSL e non ho mai riscontrato questo problema. L'unica cosa che posso vedere che non hai mai fatto è includere il numero di porta (443) nell'URL.
.NET dovrebbe gestire la creazione della connessione SSL senza che venga detto quale porta utilizzare quando si utilizza il protocollo https
. Se non l'hai già fatto, prova senza il numero di porta. Se hai, allora sono senza idee;)
prova questo e fammi sapere come lo trovi!
htw.Credentials = new NetworkCredentials (nome utente, password)