Server Name Indication (SNI) on Java

前端 未结 5 916
挽巷
挽巷 2020-12-14 11:37

Can anyone help me get started on carrying out HTTP connections with server name indication in Java?

I\'m trying to request content from a site I\'m adminstering. I\

5条回答
  •  青春惊慌失措
    2020-12-14 12:02

    This is how I did it in org.apache.httpcomponents's 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 registry = RegistryBuilder.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;
    }
    

    And this is how I created the 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();
    

提交回复
热议问题