HttpClient supporto di più protocolli TLS

Stiamo scrivendo un’applicazione che deve comunicare con un paio di server, utilizzando HTTPS.
Ha bisogno di comunicare con AWS (utilizzando il AWS biblioteche) e anche con alcuni dei nostri servizi interni che utilizza TLS 1.2.

Ho iniziato cambiando la mia HttpClient di utilizzare TLS 1.2 SSLContext:

public static SchemeRegistry buildSchemeRegistry() throws Exception {
    final SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init(createKeyManager(), createTrustManager(), new SecureRandom());
    final SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(new Scheme("https", 443, new SSLSocketFactory(sslContext)));
    return schemeRegistry;
}

e l’iniezione di questo SchemeRegistry in DefaultHttpClient oggetto (via primavera), ma ciò che ottengo errori da AWS e quindi presumo (posso sbagliarmi) che AWS non supporta TLS 1.2 (non ricevo questo messaggio se mi basta usare il normale DefaultHttpClient):

AmazonServiceException: Status Code: 403, AWS Service: AmazonSimpleDB, AWS Request ID: 5d91d65f-7158-91b6-431d-56e1c76a844c, AWS Error Code: InvalidClientTokenId, AWS Error Message: The AWS Access Key Id you provided does not exist in our records.

Se cerco di avere due HttpClients definito in primavera, uno che utilizza TLS 1.2 e uno che è il default, ottengo il seguente errore, che presumo significa che la Primavera non come istanziare e autowiring due HttpClient oggetti:

SEVERE: Servlet /my-refsvc threw load() exception
java.lang.NullPointerException
at com.company.project.refsvc.base.HttpsClientFactory.<clinit>(BentoHttpsClientFactory.java:25)
...
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1031)
at 
...
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)

Non ho usato HTTPS molto in java, potrebbe, per tipo di persone mi date qualche consiglio per favore?
1) Come faccio a ottenere la Primavera per consentire a due HttpClient oggetti e per uno per essere collegato AWS roba fagioli e l’altro per essere collegati agli altri fagioli per l’accesso TLS1.2 servizi
2) O è possibile cambiare l’uno HttpClient oggetto per essere in grado di provare TLS1.2 (via SSLContext, o il SchemeRegistry o qualcosa del genere) e se non funziona allora prova TLS1.1 o 1.0?
3) Se entrambi sono possibili, quale sarebbe il migliore modo per farlo?

Si ottiene lo stesso errore quando si utilizza SSLContext.getInstance("TLSv1.1") o SSLContext.getInstance("TLS")?
Sì, ottengo lo stesso errore. Mi chiedo se è il mio lato client certificato di mandare tutto all’aria piuttosto che il TLS versione.
Provare a utilizzare l’impostazione predefinita SSLContext solo nel caso in cui (SSLContext sslContext = SSLContext.getDefault(), già inizializzato). In caso contrario, provare un minor numero di personalizzazioni: sslContext.init(createKeyManager(), null, null) deve utilizzare il valore predefinito per il TM e SecureRandom. Non c’è di default per il keymanager, quindi, ci potrebbe essere ancora qualcosa di sbagliato nella vostra keymanager codice (utile solo se il server richiede un certificato client).
Ho creato un piccolo blog post su come abilitarlo per android 4.1+ blog.dev-area.net/2015/08/13/…

OriginaleL’autore agentgonzo | 2013-08-14

1 risposta

  1. 4

    TLS è dotata di un meccanismo di negoziare la versione del protocollo è quello di essere utilizzato. Da RFC 5246 (allegato E):

    TLS versioni 1.0, 1.1 e 1.2, e SSL 3.0 sono molto simili, e
    uso compatibili ClientHello messaggi; quindi, il sostegno di tutti loro
    è relativamente facile. Allo stesso modo, i server possono facilmente gestire i clienti
    cercando di utilizzare le versioni future di TLS, come lungo come il ClientHello
    formato rimane compatibile, e il client supporta il massimo
    protocollo versione disponibile nel server.

    Un TLS 1.2 cliente che intende negoziare con vecchi server
    invia una normale TLS 1.2 ClientHello, contenente, { 3, 3 } (TLS
    1.2) ClientHello.client_version. Se il server non supporta questa versione, risponderà con un ServerHello contenente un
    numero di versione precedente. Se il cliente si impegna ad utilizzare questa versione,
    la trattativa procede come appropriato per il negoziato
    il protocollo.

    Inoltre, modificare il numero di versione nel SSLContext.getInstance(...) cambia solo che i protocolli sono abilitati per impostazione predefinita. L’impostazione attuale versione di protocollo è effettuata con SSLSocket.setEnabledProtocols(...) (vedi questa domanda). Io non sono sicuro circa il resto delle librerie che si sta utilizzando, ma è possibile che imposta i protocolli attivati da qualche parte.

    Ci sono un paio di possibilità:

    • Quello che stai facendo nella tua createKeyManager() differisce dal comportamento di default. Se il servizio viene utilizzato il certificato client di autenticazione, cattiva configurazione ci sarebbe certamente portare ad un errore 403.

    • (Meno probabile, credo, ma è difficile da dire senza vedere il vostro createKeyManager() e createTrustManager()). Forse il server che stai utilizzando non è compatibile con TLS 1.2 e la versione meccanismo di negoziazione. C’è questo commento in sun.security.ssl.SSLContextImpl:

      I protocolli SSL/TLS specificare la compatibilità e la versione
      roll-back attacco protezioni, tuttavia, un certo numero di SSL/TLS server
      fornitori di non implementare correttamente questi aspetti, e un po ‘ di corrente
      SSL/TLS server può rifiutare di parlare con TLS 1.1 o successiva client.

    Stiamo usando client-certificato di autenticazione, ma non so se il tentativo di autenticare con AWS server con un certificato client quando non ci aspettiamo una causa di errori o di non. AWS utilizza HMAC firma per l’autenticazione, ma più di questo non so davvero. createKeyManager e createTrustManager basta caricare un .jks file e restituire gli oggetti da che (non posso postare il codice in questo commento)
    è possibile modificare la tua domanda se vuoi postare il codice più. Non è l’applicazione (per impostazione predefinita) tenta di utilizzare altre impostazioni per il keystore (javax.net.ssl.* proprietà)? Che cosa succede se si ottiene in altri contesti (TLS e TLSv1.1)?

    OriginaleL’autore Bruno

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *