13

Javaでサーバー名表示を使用してHTTP接続を開始するのを手伝ってくれる人はいますか?

私が管理しているサイトからコンテンツをリクエストしようとしています。Apache の HttpClient ライブラリを使用していますが、Web サイトが HTTPS に SNI のみを使用し、DefaultHttpClient で SNI が有効になっていないため、セキュア コンテンツのリクエストが失敗します。Apache の HttpClient ライブラリ内でこれにアプローチする方法についての説明を探しましたが、最終的にこのドキュメントで終わることがわかりました: http://hc.apache.org/httpclient-3.x/sslguide.html、これは古くなっています。 (HttpClient と HttpCore が Apache の commons パッケージの一部だった頃のコードを参照)。

それで...何か助けて?

4

5 に答える 5

11

https://issues.apache.org/jira/browse/HTTPCLIENT-1119を追跡することをお勧めします

Java 7の基盤となるクライアント実装はそれをサポートでき、SSLSocketImpl#setHost(sun.net.www.protocol.https.HttpsClientによって呼び出されます)を介して機能を公開します。

Java7での使用

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

HTTPCLIENT-1119が修正されるまで

于 2012-10-25T02:20:23.817 に答える
5

これは、org.apache.httpcomponentsのhttpclient v4.3+で行った方法です

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

そして、これが私が作成した方法です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();
于 2014-08-21T15:01:56.513 に答える
1

私にとってうまくいったのServerNameは、Apache構成で正しく構成することでした。

/etc/apache2/sites-avaible/default

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

https://stackoverflow.com/a/8058839/2088282で述べたように。

于 2013-02-19T18:23:59.327 に答える
1

Java クライアントでの SNI を使用した TLS SNI サーバーサポートを JDK 7 に追加し、X509ExtendedKeyManager と一緒に使用することが可能です。

于 2012-12-27T10:10:17.500 に答える
0

この問題はJava 7で修正されたようです。

于 2012-09-11T00:23:53.193 に答える