找不到 HttpClients.custom().setSSLSocketFactory() 方法

Ays*_*eva 12 java httpclient ssl-certificate spring-boot apache-httpclient-5.x

我用过

implementation group: 'org.apache.httpcomponents.client5', name: 'httpclient5', version: '5.2'
Run Code Online (Sandbox Code Playgroud)

此依赖项不存在 setSSLSocketFactory() 方法

Kha*_*kri 13

看来 SSLSocketFactory 现在应该设置在设置

请参阅此处的官方文档和示例:Migration to Apache HttpClient 5.x classic APIs

示例代码:

PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
      .setSSLSocketFactory(SSLConnectionSocketFactoryBuilder.create()
              .setSslContext(SSLContexts.createSystemDefault())
              .setTlsVersions(TLS.V_1_3)
              .build())
      .setDefaultSocketConfig(SocketConfig.custom()
              .setSoTimeout(Timeout.ofMinutes(1))
              .build())
      .setPoolConcurrencyPolicy(PoolConcurrencyPolicy.STRICT)
      .setConnPoolPolicy(PoolReusePolicy.LIFO)
      .setDefaultConnectionConfig(ConnectionConfig.custom()
              .setSocketTimeout(Timeout.ofMinutes(1))
              .setConnectTimeout(Timeout.ofMinutes(1))
              .setTimeToLive(TimeValue.ofMinutes(10))
              .build())
      .build();
HttpClient httpClient = HttpClientBuilder
                        .create()
                        .setConnectionManager(connectionManager)
                        .build();
Run Code Online (Sandbox Code Playgroud)

我做到了并且工作正常


Aru*_*wda 13

从@Ayshan 的评论中得到答案:

    SSLContext sslContext = sslContextBuilder.build();

    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509", "SunJSSE");
    keyManagerFactory.init(clientStore, "".toCharArray());
    sslContext.init(keyManagerFactory.getKeyManagers(), null, new java.security.SecureRandom());

    SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);

    HttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create().setSSLSocketFactory(socketFactory).build();
    CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build();
Run Code Online (Sandbox Code Playgroud)

确保所有 http 组件都是从 http 客户端 5 导入的。