2010-06-12 14 views
9

La mia applicazione deve comunicare con host diversi tramite https e l'impostazione predefinita di ServicePointManager.SecurityProtocol = TLS mi è stata utile fino ad oggi. Ora ho alcuni host che (come mostra il log di traccia System.Net) non rispondono al messaggio iniziale di handshake TLS ma mantengono aperta la connessione sottostante finché non scade, generando un'eccezione di timeout. Ho provato a impostare il timeout HttpWebRequest fino a 5 minuti, con lo stesso risultato. Presumibilmente questi host stanno aspettando un handshake SSL3 poiché sia ​​IE che Firefox sono in grado di connettersi a questi host dopo un ritardo di 30-40 secondi. Sembra esserci un meccanismo di fallback in .NET che degrada TLS in SSL3, ma non entra in gioco per qualche motivo.Come usare SSL3 invece di TLS in un particolare HttpWebRequest?

FWIW, ecco il messaggio di stretta di mano la mia richiesta è l'invio (un normale TLS 1.0 CLIENT CIAO messaggio):

00000000 : 16 03 01 00 57 01 00 00-53 03 01 4C 12 39 B4 F9 : ....W...S..L.9.. 
00000010 : A3 2C 3D EE E1 2A 7A 3E-D2 D6 0D 2E A9 A8 6C 03 : .,=..*z>......l. 
00000020 : E7 8F A3 43 0A 73 9C CE-D7 EE CF 00 00 18 00 2F : ...C.s........./ 
00000030 : 00 35 00 05 00 0A C0 09-C0 0A C0 13 C0 14 00 32 : .5.............2 
00000040 : 00 38 00 13 00 04 01 00-00 12 00 0A 00 08 00 06 : .8.............. 
00000050 : 00 17 00 18 00 19 00 0B-00 02 01 00    : ............  

C'è un modo per utilizzare SSL3 invece di TLS in un particolare HttpWebRequest, o di forzare un ripiego ? Sembra che l'impostazione di ServicePointManager sia globale e mi dispiacerebbe dover degradare l'impostazione del protocollo di sicurezza su SSL3 per l'intera applicazione.

+0

Hai effettivamente testato la tua ipotesi modificando l'impostazione della connessione su SSL3? – Amnon

+0

Sì, l'ipotesi si è rivelata corretta. I padroni di casa erano Netware e sembra che sia la politica di Netware in merito a richieste non riconosciute/non valide a non rispondere o a dare messaggi di errore, presumibilmente per ridurre la superficie di attacco. –

risposta

12

In realtà, le impostazioni di ServicePointManager sono per-appdomain. Questo mi ha permesso di aggirare il problema creando un set di appdomain separato per utilizzare solo SSL3, rendendo l'oggetto di raccolta dati MarshalByRefObject (entrambi WebClient e WebRequest sono marshal-by-ref, ma meglio ridurre il numero di chiamate cross-appdomain) e creando lì. Ha funzionato perfettamente combinato con uno schema di rilevamento basato sul timeout.

+0

Dove hai scritto questo pezzo di codice? 'System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls' –

+0

@AnishV oa chi può interessare: l'oggetto' ServicePointManager' proviene dallo spazio dei nomi 'System.Net' e mantiene uno stato di tipo statico. Quindi, solo "usando" quel namespace ed esegui 'ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; '* once * prima di eseguire le operazioni interessate fa il trucco. – kmonsoor

3

.NET contiene disposizioni per negoziare automaticamente verso il basso per le versioni inferiori del protocollo. Il valore di ServicePointManager.SecurityProtocol determina il comportamento. Può assumere 3 valori diversi: SecurityProtocol.Ssl3, SecurityProtocol.Tls, or SecurityProtocol.Ssl3 | SecurityProtocol.Tls. Sebbene sia globale, può essere modificato secondo necessità.

Non riesco a identificare una soluzione senza avere accesso a un server con lo stesso comportamento di buggy. Circa l'unico suggerimento che posso fare è tentare di connettersi con l'impostazione Ssl3 | Tls, e se ciò non funziona, riprovare con l'impostazione Ssl3. Prova a ridurre il timeout e a rilevare l'eccezione di timeout e riprovare.

EDIT

Molto di quello che ho scritto nella precedente versione di questa risposta era sbagliato.

+3

In un'applicazione pesantemente multithreading, la modifica delle impostazioni globali non è una buona idea e 'ServicePointManager.SecurityProtocol' deve rimanere invariato per la durata della richiesta, quindi l'ho fatto in un altro modo. –

Problemi correlati