Đây là cách tôi đã làm nó trong org.apache.httpcomponents của 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;
}
Và đây là cách tôi tạo ra 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();
Nó đã được sửa ngay, có sẵn trong HttpComponents HttpClient 4.3.2. –
Sử dụng HttpClient 4.3.2 trong Tomcat trên OpenJDK (lên đến phiên bản '1.7.0_111'), SNI sẽ vẫn không thành công. Sau khi chuyển sang Oracle HotSpot ('1.7.0_80'), SNI đã làm việc. Đối với bất kỳ ai phải đối mặt với điều này trên AWS Beanstalk, hãy kiểm tra ebextension này để chuyển JVM sang Oracle: https://gist.github.com/bremeld/6706980 – Sitati