HttpClient prise en charge de plusieurs protocoles TLS

Nous sommes en train d'écrire une application qui doit communiquer avec un peu de serveurs en utilisant le protocole HTTPS.
Il a besoin de communiquer avec AWS (en utilisant les bibliothèques AWS) et aussi avec certains de nos services internes que l'utilisation de TLS 1.2.

J'ai commencé par changer mon HttpClient pour utiliser 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;
}

et de l'injection de ce SchemeRegistry dans le DefaultHttpClient objet (par ressort), mais le fait que j'ai des erreurs de AWS et donc je suppose (j'ai peut-être tort) que AWS ne prend pas en charge le protocole TLS 1.2 (je n'ai pas ce message si je viens d'utiliser la 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.

Si j'essaie d'avoir deux HttpClients défini au printemps, celle qui utilise le protocole TLS 1.2, qui est la valeur par défaut, j'obtiens l'erreur suivante, ce qui je suppose signifie que le Printemps n'aime pas l'instanciation et permettra à l'autowiring deux HttpClient objets:

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)

Je n'ai pas utilisé HTTPS beaucoup en java donc, pourriez-vous l'amabilité de me donner quelques conseils s'il vous plaît?
1) Comment puis-je obtenir de Printemps pour permettre à deux HttpClient des objets et des pour un pour être raccordé à la AWS trucs de haricots et de l'autre pour être raccordé à l'autre de haricots pour accéder à la TLS1.2 services
2) Ou est-il possible de changer l'objet HttpClient pour être en mesure d'essayer de TLS1.2 (via SSLContext, ou le SchemeRegistry ou quelque chose) et si cela échoue, alors essayez TLS1.1 ou de 1,0?
3) Si les deux sont possibles, ce qui serait la "meilleure" façon de faire?

Obtenez-vous le même message d'erreur lors de l'utilisation de SSLContext.getInstance("TLSv1.1") ou SSLContext.getInstance("TLS")?
Oui, je reçois la même erreur. Je me demande si c'est mon certificat côté client que de gâcher plutôt que le TLS version.
Essayez d'utiliser la valeur par défaut SSLContext juste au cas où (SSLContext sslContext = SSLContext.getDefault(), déjà initialisé). Sinon, essayez avec moins de personnalisations: sslContext.init(createKeyManager(), null, null) devrait utiliser la valeur par défaut pour le TM et SecureRandom. Il n'y a pas de valeur par défaut pour le keymanager, donc il y aura peut-être encore quelque chose de mal dans votre keymanager code (utile uniquement si le serveur demande un certificat client).
J'ai créé un petit blog sur la façon de l'activer pour android 4.1+ blog.dev-area.net/2015/08/13/...

OriginalL'auteur agentgonzo | 2013-08-14