我想对使用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的代理。
谢谢你的帮助!
1条答案
按热度按时间sqserrrh1#
丹尼尔在评论中写道
您似乎没有足够的权限访问您尝试使用的服务
原来是代理配置阻止了特定主机和端口的通信。上面的代码没有问题。更改代理设置后,它将按预期工作。
谢谢你的帮助!