2015-04-14 15 views
6

Ho una web app che rende frequenti TIdHTTP le chiamate alle API di Google Analytics (circa 25,000-50,000 al giorno). Ogni tanto chiamate all'API falliscono con il messaggio di errore nella riga dell'oggetto (non spesso - meno di 1 su 1000 volte). Non sono mai stato in grado di trovare un modello per farlo accadere. E riprovare la chiamata fallita di solito funziona. Quindi sembra del tutto casuale."1408F10B: routine SSL: SSL3_GET_RECORD: numero di versione errata chiamata:" su Indy

Ho l'ultima versione di openssl (1.0.2.1 - 03/20/2015). E l'ultima versione di Indy (file di codice sorgente del 01/07/2015).

Di seguito è riportato il codice sorgente di base per effettuare queste chiamate.

Qualcuno ha qualche idea di cosa potrebbe essere?

Effettuare due chiamate simultanee all'API influisce su alcune cose (ciò avviene in una Web App multi-thread)?

IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil); 
IdSSLIOHandlerSocket1.PassThrough := True; 
IdHTTP := TIdHTTP.create(nil); 
IdHTTP.reusesocket := rsTrue; 
IdSSLIOHandlerSocket1.reusesocket := rsTrue; 
idhttp.handleredirects := True; 
with IdSSLIOHandlerSocket1 do begin 
    SSLOptions.Method := sslvTLSv1_2; 
    SSLOptions.SSLVersions := [sslvTLSv1_2]; 
    SSLOptions.VerifyMode := []; 
    SSLOptions.VerifyDepth := 2; 
end; 
with IdHTTP do begin 
    IOHandler := IdSSLIOHandlerSocket1; 
    ProxyParams.BasicAuthentication := False; 
    Request.UserAgent := 'EmbeddedAnalytics API Interface'; 
    Request.ContentType := 'text/html'; 
    request.connection := 'close'; 
    Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; 
    Request.BasicAuthentication := False; 
    Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)'; 
    HTTPOptions := [hoForceEncodeParams]; 
    Request.AcceptEncoding := 'gzip,deflate'; 
    Request.CustomHeaders.Add('Accept-Language: en-us,en;q=0.5'); 
    idhttp.Request.CustomHeaders.Add('Authorization: Bearer '+FToken); 
end; 
idhttp.get(':https://www.googleapis.com/analytics/v3/data/realtime?ids=..........'); 

Update 1 aggiornamento alcune righe di codice a:

SSLOptions.Method := sslvSSLv3; 
SSLOptions.SSLVersions := [sslvSSLv3]; 

Funziona. Controllerò e vedrò se gli errori SSL andranno via.

Soluzione Si scopre che è stato corretto apportare le modifiche a sslVSSLv3. Non ho più errori! Questo è un po 'sorprendente visto che la maggior parte degli altri servizi sta invece adottando TLS.

+0

Non correlato alla tua domanda, ma dovresti 1) non usare 'ReuseSocket', 2) non aggiungere manualmente' deflate' o 'gzip' in' Request.AcceptEncoding' (imposta il 'TIdHT Proprietà TP.Compressor'), 2) usa 'Request.AcceptLanguage' invece di' Request.CustomHeaders.Add() ', e 4) rimuovi': 'davanti all'URL che stai passando a' Get() ' . E se stai facendo così tante richieste, potresti prendere in considerazione l'uso di 'Request.Connection: = 'keep-alive'' invece di'' close'' in modo da poter riutilizzare una singola connessione HTTP per più richieste. –

+0

Grazie ancora @RemyLebeau per il tuo monitoraggio attivo dei problemi di Indy. Darò un'occhiata ai tuoi suggerimenti. Ho scoperto che tornare a sslvSSLv3 per le chiamate all'API di Google si prende cura del problema. Sorprendente vedere così tanti altri servizi si stanno allontanando da questo a causa di POODLE. Hai una spiegazione del perché la maggior parte delle volte sslvTLSv1_2 ha funzionato, ma ogni tanto no? –

+0

@RemyLebeau - Grazie. Li ho implementati. In realtà ho un'impostazione per passare da 'close' e' keep-alive'. Al momento era impostato su "chiudi". Domanda: il "keep-alive" sarà efficace Se dopo la chiamata ho liberato l'oggetto idhttp? Inoltre, riguardo a ':', questo era un errore di battitura. –

risposta

5

Problema risolto modificando questo:

SSLOptions.Method := sslvTLSv1_2; 
SSLOptions.SSLVersions := [sslvTLSv1_2]; 

A tal:

SSLOptions.Method := sslvSSLv3; 
SSLOptions.SSLVersions := [sslvSSLv3]; 

Si potrebbe desiderare di provare TLS 1.0, invece, per evitare SSLv3.

Ci sono due cose da considerare con Google e TLS 1.2. E alcuni di questi potrebbero essere cambiati ormai. (Questa discussione è molto specifica e si applica solo ai server di Google e TLS 1.2).

In primo luogo, è necessario disabilitare la compressione se si utilizza TLS 1.2 e ECDSA. Questo strano fatto è apparso in una discussione sulla mailing list OpenSSL sotto ECDHE-ECDSA Support. Ecco un ticket di supporto relativo generato: Bug 3277: OpenSSL s_client doc missing option.

In secondo luogo, se non si utilizzano i cifrari ChaCha20/Poly1305, è necessario prestare attenzione alle suite di crittografia fallback per TLS 1.2. Non sono mai riuscito a capirlo (soprattutto perché tutte le suite DH temporanee dovrebbero essere supportate), ma so che è il usato per il test. Quindi, essere sicuri di includere le seguenti per fallback (questo è necessario anche per i server Microsoft che eseguono IIS 8 (o forse 7) e precedenti):

  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_128_CBC_SHA
+0

Grazie - tornerò indietro e apporterò le modifiche come suggerito. E ti farà sapere i risultati. Remy Lebeau ha sottolineato che la compressione non dovrebbe essere impostata. –

+1

@MSchenke - Penso che TLS 1.2 sia una buona scelta per le suite di crittografia AES/GCM (AEAD) o ChaCah20/Poly1305. Dovresti provare a farlo funzionare. Se non è possibile, tornare a "TLS 1.0 e versioni successive". Ci vorranno 1,2 se può essere negoziato; altrimenti prenderà il TLS più alto che può ottenere. Ecco come eseguire "TLS 1.0 e versioni successive" in C: [Come bloccare i protocolli SSL in favore di TLS?] (Http://stackoverflow.com/a/29291287/608639). Ma non so come farlo con Delphi o Indy. – jww

0

Dubito che Google consenta ancora l'accesso ai propri server tramite SSLv3 (vedere attacco Poodle).

L'attacco BARBONCINO (che sta per "Imbottitura Oracle On degradata Legacy Encryption") è un uomo-in-the-middle exploit che si vantaggio di fallback Internet e software per la sicurezza dei clienti di SSL 3.0.

Così, se il cliente riceve un messaggio di errore SSLv3 relative vorrei contattare un esperto di rete per verificare se questo messaggio di errore può essere causato da un attacco di tipo man-in-the-middle.

Potrebbe anche essere un semplice problema di rete, in quanto non è riproducibile.

Per una diagnosi più approfondita, una registrazione di Wireshark sarebbe utile (per l'esperto, non per me).

+0

Grazie per il commento. Entro l'anno ho dovuto aggiornare da Indy 9 a Indy 10 per la sola ragione dell'attacco di POODLE. In tal caso è stato per far funzionare l'interfaccia di PayPal. Non ho la versione esatta, ma stavo usando qualcosa prima di sslvTLSv1_2. L'aggiornamento a Indy 10 e l'utilizzo di questa nuova versione ha risolto il problema.Dici che dubiti che Google autorizzi ancora l'accesso usando SSLv3. Se così fosse, non avrebbe senso negare TUTTE le richieste? Certamente non permetterebbero un passaggio attraverso ma non altri? –

+0

* "L'attacco di POODLE ... è un man-in-the-middle ..." * - non è un attacco MitM. Se l'uomo fosse nel mezzo, avrebbe accesso diretto al materiale e non avrebbe bisogno di usare l'oracolo imbottito. Gli attacchi che ho visto sono più simili a un MitB (Man nel browser) a cui è consentito effettuare richieste non autenticate. Nel browser, è semplicemente un [CSRF] (https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29) – jww

+0

@jww la [fonte originale] (https: //web.nvd. nist.gov/view/vuln/detail?vulnId=CVE-2014-3566) dice che SSLv3 'rende più facile agli aggressori man-in-the-middle ottenere dati in chiaro tramite un attacco padding-oracle, detto anche" POODLE " ' – mjn

1

Problema risolto modificando questo:

SSLOptions.Method := sslvTLSv1_2; 
SSLOptions.SSLVersions := [sslvTLSv1_2]; 

A tal:

SSLOptions.Method := sslvSSLv3; 
SSLOptions.SSLVersions := [sslvSSLv3]; 

Ciò è sorprendente visto che la maggior parte dei servizi si stanno muovendo per TLS, invece.

+0

Ho riscontrato problemi con i server TLS 1.2 * e * Google. Guarda la risposta qui sotto che potrebbe spiegare alcune delle cose che stai vivendo e alcuni potenziali problemi di funzionamento. – jww

Problemi correlati