第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何使用不同的 SSL 客戶端身份驗(yàn)證證書創(chuàng)建 Apache HttpClients 池

如何使用不同的 SSL 客戶端身份驗(yàn)證證書創(chuàng)建 Apache HttpClients 池

月關(guān)寶盒 2023-06-08 17:10:04
我一直在瀏覽 Apache 文檔和其他示例,試圖創(chuàng)建一個(gè)使用 Apache HttpClient 來調(diào)用各種 RESTful Web 服務(wù)的客戶端。(這些 Web 服務(wù)中的每一個(gè)都可能需要不同的客戶端證書來進(jìn)行身份驗(yàn)證)。最初我創(chuàng)建了一個(gè)初始化 HttpClient 的靜態(tài)代碼塊(使用 SSLContext 信息和池連接管理器):private static CloseableHttpClient _client;static {  HttpClientBuilder clientBuilder = HttpClients.custom();  SSLContextBuilder sslContextBuilder = SSLContexts.custom();  sslContextBuilder.loadTrustMaterial(new TrustSelfSignedStrategy());  sslContextBuilder.loadKeyMaterial(new File("clientcert.p12"), password, password, (aliases, socket) -> aliases.keySet().iterator().next());  SSLContext sslContext = sslContextBuilder.build();  HostnameVerifier allowAllHosts = new NoopHostnameVerifier();  SSLConnectionSocketFactory connectionFactory = new SSLConnectionSocketFactory(sslContext, allowAllHosts);  clientBuilder.setSSLSocketFactory(connectionFactory);  RegistryBuilder<ConnectionSocketFactory> regBuilder = RegistryBuilder.<ConnectionSocketFactory>create();  regBuilder.register("https", connectionFactory);  regBuilder.register("http", new PlainConnectionSocketFactory());  Registry<ConnectionSocketFactory> socketFactoryRegistry = regBuilder.build();  PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);  clientBuilder.setConnectionManager(connectionManager);  _client = clientBuilder.build();}此時(shí)我可以使用客戶端執(zhí)行請求,只要服務(wù)器配置為允許訪問 clientcert.p12,客戶端身份驗(yàn)證就可以正常工作。我需要的是能夠根據(jù)所需客戶端證書的值動態(tài)更改每個(gè)請求的客戶端證書。是否可以在動態(tài)更改客戶端證書的同時(shí)重用靜態(tài) HttpClient?另外,如果這是可能的,我是否仍然會看到使用池連接管理器的性能優(yōu)勢?
查看完整描述

2 回答

?
蠱毒傳說

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

可以使用一個(gè)未記錄的http.socket-factory-registry執(zhí)行上下文屬性來覆蓋連接管理器在構(gòu)造時(shí)設(shè)置的連接套接字工廠。


CloseableHttpClient httpClient = HttpClientBuilder.create()

        .setSSLContext(SSLContexts.createSystemDefault())

        .build();


SSLContext customSSlContext = SSLContexts.custom()

        .loadKeyMaterial(new File("my-keystore.jks"), "sectret".toCharArray(),  "sectret".toCharArray())

        .build();


Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()

        .register("http", PlainConnectionSocketFactory.getSocketFactory())

        .register("https", new SSLConnectionSocketFactory(customSSlContext))

        .build();


HttpClientContext clientContext = HttpClientContext.create();

clientContext.setAttribute("http.socket-factory-registry", socketFactoryRegistry);

try (CloseableHttpResponse response = httpClient.execute(new HttpGet("https://host/stuff"), clientContext)) {

    System.out.println(response.getStatusLine());

    EntityUtils.consume(response.getEntity());

}

使用相同的客戶端實(shí)例/相同的連接池來執(zhí)行具有不同用戶身份/安全上下文的多個(gè)線程的請求時(shí)要格外小心。


查看完整回答
反對 回復(fù) 2023-06-08
?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊

我在這里發(fā)布我使用PoolingHttpClientConnectionManager類的解決方案,這個(gè)對我有用:


SSLConnectionSocketFactory sslConnectionFactory = new SSLConnectionSocketFactory(sslContext, new DefaultHostnameVerifier());


    Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory> create()

            .register("https", sslConnectionFactory)

            .register("http", new PlainConnectionSocketFactory())

            .build();


    PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);


    CloseableHttpClient httpClient = HttpClients.custom()

            .setSSLContext(sslContext)

            .setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build())

            .setConnectionManager(cm)

            .build();


    cm.setMaxTotal(200);

    cm.setDefaultMaxPerRoute(20);

    final ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);

    engine.setFollowRedirects(false);


    ResteasyClient client = clientBuilder.httpEngine(engine).build();

    ResteasyWebTarget target = client.target(UriBuilder.fromPath(

            "https://my.server.com/mtls/protected/resource"));

    String response = target.request().get(String.class);


查看完整回答
反對 回復(fù) 2023-06-08
  • 2 回答
  • 0 關(guān)注
  • 237 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號