name injector indication java http ssl sni

java - server name indication http injector



IndicaciĆ³n del nombre del servidor(SNI) en Java (5)

¿Alguien puede ayudarme a comenzar a realizar conexiones HTTP con la indicación del nombre del servidor en Java?

Intento solicitar contenido de un sitio que estoy administrando. He estado utilizando la biblioteca HttpClient de Apache, pero mi solicitud de contenido seguro falla porque el sitio web solo usa SNI para HTTPS y SNI no está habilitado en DefaultHttpClient. He buscado instrucciones sobre cómo abordar esto dentro de la biblioteca HttpClient de Apache, pero veo que termina con este documento: http://hc.apache.org/httpclient-3.x/sslguide.html , que está desactualizado (refiriéndose al código cuando HttpClient y HttpCore formaban parte del paquete commons de Apache).

Entonces ... ¿alguna ayuda?


Parece que este problema está solucionado en Java 7 .


Así es como lo hice en el httpclient v4.3 de org.apache.httpcomponents +

private HttpClientConnectionManager createConnectionManager(final SSLContext ctx) { LOG.info("Creating sslConnectionSocketFactory"); final SSLConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(ctx) { @Override protected void prepareSocket(SSLSocket socket) throws IOException { try { System.out.println("************ setting socket HOST property *************"); PropertyUtils.setProperty(socket, HOST, Constants.SNI_HOST); } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException ex) { LOG.error(ex.getMessage()); } super.prepareSocket(socket); } }; LOG.info("Creating connectionRegistry"); final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() .register("https", sslSF) .build(); LOG.info("Creating poolingConnectionManager"); final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); connectionManager.setDefaultMaxPerRoute(MAX_CONNECTIONS_PER_ROUTE); connectionManager.setMaxTotal(MAX_CONNECTIONS); return connectionManager; }

Y así es como creé el HttpClient

final KeyManager[] keyManagers = createKeyManagers(); final TrustManager[] trustManagers = createTrustManagers(); final SSLContext ctx = createSslContext(keyManagers, trustManagers); final HttpClientConnectionManager connectionManager = createConnectionManager(ctx); LOG.info("Creating httpClient"); HttpClient httpClient = HttpClients .custom() .setConnectionManager(connectionManager) .build();


Lo que funcionó para mí fue configurar ServerName correctamente en la configuración de Apache:

/etc/apache2/sites-avaible/default

<VirtualHost *:443> ServerName foo.domain.com ... </VirtualHost>

Como dije en https://.com/a/8058839/2088282 .


con una solución breve como se describe en: TLS con SNI en clientes Java. Es posible agregar Soporte de servidor SNI a JDK 7 y usarlo junto con X509ExtendedKeyManager.


es posible que desee realizar un seguimiento de https://issues.apache.org/jira/browse/HTTPCLIENT-1119

la implementación del cliente subyacente de Java 7 es capaz de soportarlo y expone la función a través de SSLSocketImpl # setHost (llamado por sun.net.www.protocol.https.HttpsClient

en el uso de Java 7

new URL("https://cmbntr.sni.velox.ch/").openStream()

hasta que se arregle HTTPCLIENT-1119