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?
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
Vous devez vous connecter pour publier un commentaire.
TLS est un mécanisme intégré de négocier la version du protocole à utiliser. De RFC 5246 (Annexe E):
En outre, la modification du numéro de version dans
SSLContext.getInstance(...)
seulement les changements qui les protocoles sont activés par défaut. Réglage de la réelle versions du protocole est fait avecSSLSocket.setEnabledProtocols(...)
(voir cette question). Je ne suis pas sûr du reste de l'bibliothèques que vous utilisez, mais il est possible qu'il définit les protocoles activés quelque part.Il y a quelques possibilités:
Ce que vous faites dans votre
createKeyManager()
diffère du comportement par défaut. Si le service est à l'aide de client d'authentification par certificat, mauvaise configuration, il y aurait certainement conduire à une erreur 403.(Moins probable, je suppose, mais difficile à dire sans voir votre
createKeyManager()
etcreateTrustManager()
). Peut-être que le serveur que vous utilisez n'est pas compatible avec le protocole TLS 1.2 et la version mécanisme de négociation. Il y a ce commentaire danssun.security.ssl.SSLContextImpl
:vous pouvez modifier votre question si vous voulez plus de code. Ne vous application (par défaut), essayez d'utiliser d'autres paramètres pour le fichier de clés (javax.net.le protocole ssl.* les propriétés)? Qu'advient-il si vous obtenez d'autres contextes (TLS et TLSv1.1)?
OriginalL'auteur Bruno