通过代理使用tls/sslcontext的java httpclient

6ioyuze2  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(620)

我想对使用tls进行身份验证的服务器进行http调用。此外,服务器需要我的ip被列入白名单,所以与aws lambda我需要使用代理。我想要实现的是通过代理的带有tls的httppost请求。
为了实现我使用的tls协议 KeyStore 使用加载的证书和私钥。在没有代理的情况下进行呼叫(本地来自白名单上的ip)是可行的,所以我假设 keyStore 配置正确。
以下是我如何构建 httpClient (这是 java.net.http.HttpClient ):

var keyManagerFactory = KeyManagerFactory.getInstance("PKIX");
keyManagerFactory.init(keyStore, null);

var trustManagerFactory = TrustManagerFactory.getInstance("PKIX");
trustManagerFactory.init(keyStore, null);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

URI proxyUri = config.getProxyUri(); // this is injected object with preloaded config parameters

HttpClient httpClient = HttpClient.newBuilder()
    .sslContext(sslContext)
    .proxy(
      ProxySelector.of(
        InetSocketAddress.createUnresolved(proxyUri.getHost(), proxyUri.getPort())))
    .build();

现在提出请求:

String body = createRequestBody(); // creates string with JSON

HttpRequest request = HttpRequest.newBuilder()
    .uri(config.getServiceUri()) // same config as in example above
    .header("Content-Type", "application/json")
    .POST(BodyPublishers.ofString(body))
    .build();

HttpResponse<String> response = httpClient.send(request, BodyHandlers.ofString());

打电话 .send(...) 原因

java.io.IOException: Tunnel failed, got: 403

# java.net.http/jdk.internal.net.http.HttpClientImpl.send(Unknown Source)

# java.net.http/jdk.internal.net.http.HttpClientFacade.send(Unknown Source)

# (method we are in above example)

代理不需要任何身份验证,在其他aws lambda中,我看到这个代理只使用 .proxy(...) 方法就像上面的例子一样。所以唯一不同的是 .sslContext(...) .
我还需要一些吗 sslContext 配置?我已经通过代理搜索了一些tls的例子,但是没有找到任何东西。httpclient.builder docs也没有提到sslcontext的代理。
谢谢你的帮助!

sqserrrh

sqserrrh1#

丹尼尔在评论中写道
您似乎没有足够的权限访问您尝试使用的服务
原来是代理配置阻止了特定主机和端口的通信。上面的代码没有问题。更改代理设置后,它将按预期工作。
谢谢你的帮助!

相关问题