2012-10-05 15 views
7

Amazon ha "aggiornato" la sicurezza SSL nel suo SDK Java AWS nella versione 1.3.21. Questo ha interrotto l'accesso a tutti i bucket S3 che hanno periodi nel loro nome quando utilizzano l'API Java AWS di Amazon. Sto usando la versione 1.3.21.1 che è aggiornata fino a Oct/5/2012. Ho fornito alcune soluzioni nella mia risposta di seguito, ma sto cercando un ulteriore lavoro su questo problema.Problemi SSL con S3/AWS utilizzando l'API Java: "nome host nel certificato non corrisponde"

Se si verifica questo errore, verrà visualizzato un messaggio simile al seguente messaggio nelle eccezioni/nei registri. In questo esempio, il nome del bucket è foo.example.com.

INFO: Unable to execute HTTP request: hostname in certificate didn't match: 
     <foo.example.com.s3.amazonaws.com> != <*.s3.amazonaws.com> 
     OR <*.s3.amazonaws.com> OR <s3.amazonaws.com> 
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:220) 
at org.apache.http.conn.ssl.StrictHostnameVerifier.verify(StrictHostnameVerifier.java:61) 
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:149) 
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:130) 
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390) 

Si può vedere la documentazione di questo problema sul forum di discussione AWS S3:

https://forums.aws.amazon.com/thread.jspa?messageID=387508&#387508

risposta di Amazon per il problema è il seguente.

Dovremmo essere in grado di risolvere questo problema utilizzando il metodo di stile del percorso più vecchio di indirizzamento del bucket (anziché il più recente indirizzamento di stile di host virtuale) per i bucket con questo modello di denominazione. Iniziamo con la correzione e assicuriamo che i nostri test di integrazione interna abbiano casi di test per nomi di bucket contenenti periodi.

Qualsiasi soluzione alternativa o altre soluzioni? Grazie per qualsiasi feedback.

risposta

6

Amazon ha rilasciato la versione 1.3.22 che risolve questo problema. Ho verificato che il nostro codice ora funziona. Per citare dalle loro note di rilascio:

I bucket il cui nome contiene periodi possono ora essere nuovamente indirizzati correttamente su HTTPS.

Ci sono un paio di soluzioni che posso vedere, oltre ad aspettare che Amazon rilasci una nuova API.

  1. Ovviamente è possibile eseguire il rollback alla versione 1.3.20 di AWS Java SDK. Purtroppo avevo bisogno di alcune delle funzionalità in 1.3.21.

  2. È possibile sostituire org.apache.http.conn.ssl.StrictHostnameVerifier nel classpath. Questo è un trucco che rimuoverà tutto il controllo SSL per le connessioni HTTP Apache credo. Ecco il codice che ha funzionato per me: http://pastebin.com/bvFELdJE

  3. Ho finito per scaricare e creare il mio pacchetto dal vaso di origine AWS. Ho applicato la seguente patch approssimativa all'origine HttpClientFactory.

    =================================================================== 
    --- src/main/java/com/amazonaws/http/HttpClientFactory.java  (thirdparty/aws)  (revision 20105) 
    +++ src/main/java/com/amazonaws/http/HttpClientFactory.java  (thirdparty/aws) (working copy) 
    @@ -93,7 +93,7 @@ 
    
             SSLSocketFactory sf = new SSLSocketFactory(
               SSLContext.getDefault(), 
    -        SSLSocketFactory.STRICT_HOSTNAME_VERIFIER); 
    +        SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
    
  4. La correzione giusta è quello di cambiare da domain-name gestione per la gestione basata percorso secchio.

Btw, il seguente sembra che potrebbe funzionare, ma lo fa non.Il client AWS richiede specificamente la STRICT verificatore e non utilizza quello di default:

SSLSocketFactory.getSystemSocketFactory().setHostnameVerifier(
    SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
+3

Per essere onesti, se si richiede 'https: //foo.example.com.s3.amazonaws.com/...' nel proprio URL, '* .s3.amazonaws.com' non copre questo nome host: il carattere jolly non si propaga attraverso i punti secondo [le specifiche] (http://tools.ietf.org/html/rfc2818#section-3.1) ("**. a.com corrisponde a foo.a. com ma non bar.foo.a.com * "). Quello che Amazon potrebbe fare è ottenere un certificato per '*. *. *. S3.amazonaws.com'. – Bruno

+0

Concordato @Bruno. Comunque, la domanda sta parlando usando la loro API Java. Fondamentalmente non posso fare nulla usando la loro API con un bucket che ha un punto nel suo nome. – Gray

+0

Basta leggere [RFC 6125] (http://tools.ietf.org/html/rfc6125#section-6.4.3) (specifica best practice, ma non ancora implementata). Non sono sicuro di come interpretare se '*. *. *. Qualcosa sia permesso con la regola 1. La cosa giusta (se hai davvero bisogno di un gestore personalizzato) sarebbe in effetti scrivere il tuo verificatore che si aspetta il modello giusto . Il problema con ALLOW_ALL_HOSTNAME_VERIFIER è che consente attacchi MITM. – Bruno

8

scopre che Amazon "aggiornato" la sicurezza SSL su S3 alla fine di settembre 2012. Questo ha rotto l'accesso eventuali secchi S3 che hanno periodi nel loro nome quando si utilizza l'API Java AWS di Amazon.

Questo è impreciso. La corrispondenza dei caratteri jolly SSL di S3 è stata la stessa di quando S3 è stata lanciata nel 2006. È più probabile che il team AWS Java SDK abbia abilitato la validazione più severa dei certificati SSL (buono), ma ha finito per rompere i nomi dei bucket che erano in esecuzione su SSL S3 cert (cattivo).

La risposta giusta è che è necessario utilizzare percorso in stile affrontare invece di DNS-style indirizzamento. Questo è l'unico metodo protetto per risolvere il problema con la corrispondenza con caratteri jolly sul certificato SSL. La disattivazione della verifica ti apre fino agli attacchi Man-In-The-Middle.

Quello che attualmente non so è se l'SDK Java fornisce questa opzione configurabile. Se è così, questa è la tua risposta. Altrimenti, sembra che il team dell'SDK di Java abbia detto "aggiungeremo questa funzionalità e quindi aggiungere test di integrazione per accertarci che tutto funzioni".

+0

+1 @Ryan. Avevo pensato che fosse una modifica al certificato S3. Il bug è stato introdotto nell'SDK nella versione 1.3.21. – Gray

+0

Questo fornisce il modo semplice ma efficace per rendere il tuo stile di percorso di ricerca ... https://shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html#commentform –

Problemi correlati