Stiamo scrivendo un'app che deve comunicare con alcuni server tramite HTTPS. Ha bisogno di comunicare con AWS (usando le librerie AWS) e anche con alcuni dei nostri servizi interni che utilizzano TLS 1.2.HttpClient che supporta più protocolli TLS
Ho iniziato cambiando il mio HttpClient utilizzare un 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 questa SchemeRegistry nell'oggetto DefaultHttpClient (via primavera), ma facendo che ricevo gli errori da AWS e così presumo (potrei sbagliarmi) che AWS non supporta TLS 1.2 (non ottengo questo messaggio se mi basta usare il DefaultHttpClient normale):
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 definiti in primavera, uno che usa TLS 1.2 e uno che è l'impostazione predefinita, ottengo il foll errore, che presumo a causa significa che la primavera non piace istanziare e autowiring due oggetti HttpClient:
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 in modo da potreste gente gentile darmi qualche consiglio per favore? 1) Come potrei ottenere Spring per consentire due oggetti HttpClient e uno per essere collegato ai bean stuff di AWS e l'altro per essere collegato agli altri bean per accedere ai servizi TLS1.2 2) Oppure è possibile cambiare l'unico oggetto HttpClient per provare TLS1.2 (tramite SSLContext, o SchemeRegistry o qualcosa del genere) e se fallisce provare TLS1.1 o 1.0? 3) Se entrambi sono possibili, quale sarebbe il modo migliore di farlo?
si ottiene lo stesso errore quando si utilizza 'SSLContext.getInstance ("TLSv1.1")' o ' SSLContext.getInstance ("TLS") '? – Bruno
Sì, ho lo stesso errore lì. Mi chiedo se sia il mio certificato sul lato client a rovinarlo piuttosto che la versione TLS. – agentgonzo
Provare ad usare il 'SSLContext' predefinito nel caso in cui (' SSLContext sslContext = SSLContext.getDefault() ', già inizializzato). Altrimenti, prova meno personalizzazioni: 'sslContext.init (createKeyManager(), null, null)' dovrebbe usare l'impostazione predefinita per TM e SecureRandom. Non c'è un default per il keymanager, quindi potrebbe esserci ancora qualcosa di sbagliato nel codice keymanager (utile solo se il server richiede un certificato client). – Bruno