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?
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
TLS è dotata di un meccanismo di negoziare la versione del protocollo è quello di essere utilizzato. Da RFC 5246 (allegato E):
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 conSSLSocket.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()
ecreateTrustManager()
). Forse il server che stai utilizzando non è compatibile con TLS 1.2 e la versione meccanismo di negoziazione. C’è questo commento insun.security.ssl.SSLContextImpl
:è 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