HttpClient soporte de múltiples protocolos TLS

Estamos escribiendo una aplicación que debe comunicarse con un par de servidores usando HTTPS.
Necesita comunicarse con AWS (mediante el uso de AWS bibliotecas) y también con algunos de nuestros servicios internos que utilice TLS 1.2.

Empecé por cambiar mi HttpClient para usar 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;
}

y la inyección de este SchemeRegistry en el DefaultHttpClient objeto (a través de la primavera), pero haciendo que obtengo errores de AWS y por lo que asumo que (puedo estar equivocado) que AWS no admite TLS 1.2 (no me sale este mensaje, si yo sólo uso el normal 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 yo trato de tener dos HttpClients definido en primavera, uno que utiliza TLS 1.2 y uno que es el valor predeterminado, me sale el siguiente error, que supongo significa que la Primavera no le gusta instancias y autowiring dos HttpClient objetos:

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)

No he utilizado HTTPS tanto en java por lo podrías tipo de personas me dan algunos consejos por favor?
1) ¿Cómo hago para conseguir la Primavera para permitir que dos HttpClient objetos y para uno estar conectados a la AWS cosas frijoles y el otro para ser conectado a los otros granos para acceder a la TLS1.2 servicios
2) O es posible cambiar el objeto HttpClient para poder probar TLS1.2 (a través de SSLContext, o la SchemeRegistry o algo) y si eso no funciona, a continuación, intente TLS1.1 o 1.0?
3) Si ambos son posibles, lo que sería la «mejor» forma de hacerlo?

¿Se obtiene el mismo error cuando se utiliza SSLContext.getInstance("TLSv1.1") o SSLContext.getInstance("TLS")?
Sí, me sale el mismo error hay. Me pregunto si es mi certificado de cliente que se jugara en lugar de la TLS versión.
Intente utilizar el valor predeterminado SSLContext sólo en caso de que (SSLContext sslContext = SSLContext.getDefault(), ya inicializado). De lo contrario, intente menos personalizaciones: sslContext.init(createKeyManager(), null, null) debe utilizar el valor predeterminado para el TM y SecureRandom. No hay ningún valor predeterminado para el keymanager, por lo que aún puede haber algo mal en su keymanager código (sólo es útil si el servidor solicita un cliente certificado).
He creado un pequeño blog acerca de cómo habilitar para android 4.1+ blog.dev-area.net/2015/08/13/…

OriginalEl autor agentgonzo | 2013-08-14

1 Kommentar

  1. 4

    TLS tiene un mecanismo para negociar la versión del protocolo es para ser utilizado. De RFC 5246 (Apéndice E):

    TLS las versiones 1.0, 1.1 y 1.2, y SSL 3.0 son muy similares, y
    uso compatible ClientHello mensajes; por lo tanto, el apoyo a todos ellos
    es relativamente fácil. Del mismo modo, los servidores pueden manejar fácilmente los clientes
    tratando de usar las futuras versiones de TLS mientras el ClientHello
    el formato sigue siendo compatible, y el cliente es compatible con el mayor
    el protocolo de la versión disponible en el servidor.

    Una TLS 1.2 cliente que desee negociar con los mayores tales servidores
    va a enviar un normal TLS 1.2 ClientHello, que contiene { 3, 3 } (TLS
    1.2) en ClientHello.client_version. Si el servidor no es compatible con esta versión, responderá con un ServerHello que contiene un
    mayor número de versión. Si el cliente se compromete a utilizar esta versión,
    la negociación se procederá según corresponda para el negociado
    protocolo.

    Además, el cambio en el número de versión en SSLContext.getInstance(...) sólo a los cambios que los protocolos están habilitados por defecto. Ajuste de la real versiones del protocolo se realiza con SSLSocket.setEnabledProtocols(...) (ver esta pregunta). No estoy seguro sobre el resto de las bibliotecas que se está utilizando, pero es posible que establece los protocolos habilitados en algún lugar.

    Hay un par de posibilidades:

    • Lo que estás haciendo en tu createKeyManager() difiere el comportamiento por defecto. Si el servicio está utilizando el cliente de autenticación de certificados, mala configuración habrían de conducir a un error 403.

    • (Menos probable, supongo, pero es difícil de decir sin ver a su createKeyManager() y createTrustManager()). Tal vez el servidor que está utilizando no es compatible con TLS 1.2 y la versión mecanismo de negociación. No es este comentario en sun.security.ssl.SSLContextImpl:

      SSL/TLS protocolos de especificar la compatibilidad hacia adelante y la versión
      roll-back ataque protecciones, sin embargo, un número de SSL/TLS servidor
      los vendedores no implementar estos aspectos adecuadamente, y algunas de las actuales
      SSL/TLS servidores pueden negarse a hablar con una TLS 1.1 o posterior cliente.

    Estamos utilizando el cliente de autenticación de certificados, pero no sé si intentando autenticar con AWS servidores con un certificado de cliente cuando no están esperando que uno va a provocar errores o no. AWS utiliza la firma de HMAC para la autenticación, pero más que eso realmente no lo sé. createKeyManager y createTrustManager sólo tienes que cargar una .jks archivo y devolver los objetos a partir de que (no se puede publicar el código en este comentario)
    puedes editar tu pregunta si desea enviar más de código. Hace que la aplicación (por defecto) intente usar otras opciones para el almacén de claves (javax.net.ssl.* propiedades)? ¿Qué sucede si usted recibe otros contextos (TLS y TLSv1.1)?

    OriginalEl autor Bruno

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea