我正试图通过禁用SSL证书检查来达到启用SSL的Rest API,如下所示;
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
SSLContext.setDefault(sc);
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
String auth = "<<username>>:<<password>>";
byte[] authBytes = auth.getBytes(StandardCharsets.UTF_8);
String encodedAuth = Base64.getEncoder().encodeToString(authBytes);
String url = "myURLHere";
Client client = ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier(allHostsValid).build();
String input = "myJsonHere";
Response response = client
.target(url)
.request()
.header("Authorization", "Basic " + encodedAuth)
.post(Entity.json(input));
参考:https://stackoverflow.com/a/27398820/11226302
然而,我得到了以下回应;
InboundJaxrsResponse{context=ClientResponse{method=POST,uri=myURLHere,status=502,reason=cannotconnect}}
我也使用HttpsURLConnection尝试了类似的逻辑
请参阅:https://stackoverflow.com/a/876785/11226302
得到如下类似的错误;
java.lang.RuntimeException:失败:HTTP错误代码:502cannotconnect
出于测试目的,我需要这样做,但现在无法继续。
我能够使用curl和Postman客户端(如本问题标题中所述(获得正确的回复有人能指出这里可能出了什么问题吗?
我正在使用java 8
仅供参考,生产将设置证书。我正在进行这种不安全的配置,以便能够从本地设置调用此Rest API。
一个502错误表明能够成功连接到受TLS保护的端点(可能是通过忽略其不可信的证书(。出了问题的是,这个端点无法将连接代理到另一台主机,而代理"无法连接"。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502
因此,您一定遇到了一个特定于java进程的配置问题,该问题不会影响curl或poster。我看到的一个例子是,你试图在windows中访问本地主机上的Web服务端点,但由于操作系统和办公室局域网设置,连接首先发送到网络的互联网代理,它不知道如何处理地址"127.0.0.1"。我会检查你的操作系统网络设置是否正确,并且在java进程中可以用来覆盖它们的环境变量没有设置:
https.proxyHost
https.proxyPort
http.nonProxyHosts
像Fiddler这样的本地项目也可能试图充当代理人,并为这一问题做出贡献。
另一种可能性是,您的交易对手在其端使用反向代理,由于某种原因,该代理很难路由java进程发出的请求。确保您对java客户端使用的主机名与curl/poster使用的主机名称完全相同(不是手动解析的IP地址或本地DNS别名(。
顺便说一句:在原型设计时,许多Java开发人员都会在某个时候对无操作信任管理器进行黑客攻击,但将您希望信任的证书添加到本地JVM信任库或特定于进程的信任库是一种更好的做法。这样,您就不必在测试和生产中使用不同的代码。
https://docs.oracle.com/cd/E79792_01/resa/pdf/141/html/merch_sg/apps-chapter%207.htm#CHDJBIJD