it-swarm.com.de

Server Name Indication (SNI) auf Java

Kann mir jemand helfen, HTTP-Verbindungen mit Servernamen in Java auszuführen?

Ich versuche, Inhalte von einer Website anzufordern, die ich administriere. Ich habe die HttpClient-Bibliothek von Apache verwendet, aber meine Anfrage nach sicherem Inhalt schlägt fehl, da die Website nur SNI für HTTPS verwendet und SNI im DefaultHttpClient nicht aktiviert ist. Ich habe nach Anweisungen gesucht, wie man dies in der HttpClient-Bibliothek von Apache angehen kann, aber ich sehe am Ende dieses Dokuments: http://hc.Apache.org/httpclient-3.x/sslguide.html , welches ist nicht mehr aktuell (bezieht sich auf Code, wenn HttpClient und HttpCore Teil des Paketes von Apache waren).

Also ... Hilfe?

12
JellicleCat

sie möchten https://issues.Apache.org/jira/browse/HTTPCLIENT-1119 verfolgen.

die zugrunde liegende Client-Implementierung von Java 7 kann dies unterstützen und stellt das Feature über SSLSocketImpl # setHost (aufgerufen von Sun.net.www.protocol.https.HttpsClient) bereit

auf Java 7 verwenden

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

bis HTTPCLIENT-1119 behoben ist

11
cmbntr

So habe ich es in http.client v4.3 + von org.Apache.httpcomponents gemacht 

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;
}

Und so habe ich die HttpClienterstellt

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();
5
shreyas

mit einem kurzen Fix wie unter: TLS mit SNI in Java-Clients Es ist möglich, SNI Server Support zu JDK 7 hinzuzufügen und es zusammen mit X509ExtendedKeyManager zu verwenden.

1
SkateScout

Was für mich funktionierte, war die korrekte Konfiguration der ServerName in der Apache-Konfiguration:

/etc/Apache2/sites-avaible/default

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

Wie in https://stackoverflow.com/a/8058839/2088282 gesagt.

1
Giovanni Silva

Es scheint, dass dieses Problem in Java 7 behoben wurde.

0
a.drew.b