首页 > 解决方案 > 如何使用 HttpClient 5 使 Conscrypt SSL 提供程序在 Tomcat Web 应用程序中工作

问题描述

我正在使用Apache HttpClient 5Conscrypt通过 SSL 执行同步 HTTP 2.0 请求,如下所示:

final SSLContext sslContext;
    try {
        sslContext = SSLContexts.custom()
                .setProvider(Conscrypt.newProvider())
                .build();
    } catch (Exception e) {
         // ... omitted for brevity
    }

    final PoolingAsyncClientConnectionManager cm = PoolingAsyncClientConnectionManagerBuilder.create()
            .setTlsStrategy(new ConscriptClientTlsStrategy(sslContext))
            .build();

    final CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
            .setVersionPolicy(HttpVersionPolicy.NEGOTIATE)
            .setConnectionManager(cm)
            .build();

    try {
        httpclient.start();
        HttpHost host = new HttpHost("www.wikidata.org");
        final HttpClientContext clientContext = HttpClientContext.create();

        final SimpleHttpRequest request = SimpleHttpRequests.GET.create(host, "/w/api.php?action=wbsearchentities&search=Washington");
            request.addHeader("Accept-Charset", charset);
            FutureCallback<SimpleHttpResponse> callback = // ... omitted for brevity
            httpclient.execute(SimpleRequestProducer.create(request),
                    SimpleResponseConsumer.create(),
                    clientContext,
                    callback);
     }
     catch (Exception e) {
         // ... omitted for brevity
     }

在单元测试中运行代码是成功的。但是,如果作为在 Tomcat v8 中运行的 Web 应用程序的一部分运行,它会在调用时引发以下异常Conscrypt.newProvider()message: java.lang.UnsatisfiedLinkError: Failed creating temp file (null)它看起来像一个特权问题。有人可以指出在这种情况下我应该配置什么来解决问题吗?

标签: javassltomcathttp2apache-httpclient-5.x

解决方案


您需要在类路径中设置conscrypt-openjdk-uber-1.4.2.jar而不是conscrypt-openjdk-1.4.2.jar,希望这可以解决您的问题,因为 uber jar 将具有 conscrypt 所需的所有依赖项。

还使用Http2AsyncClientBuilder而不是 HttpAsyncClients 进行 http2 多路复用。


推荐阅读