在 java 中抑制 SSL 证书验证会导致 502 无法连接。与 curl(使用 -k 选项)和 Postman(禁用 SSL)完美配合)
Suppressing SSL certificate validations in java gives 502 cannot connect. Works perfectly fine with curl (with -k option) and Postman (SSL disabled))
我正在尝试通过禁用 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));
参考:
但是,我收到以下回复;
InboundJaxrsResponse{context=ClientResponse{method=POST, uri=myURLHere, status=502, reason=cannotconnect}}
我也使用 HttpsURLConnection 尝试了类似的逻辑。
参考:
出现如下类似的错误;
java.lang.RuntimeException: Failed : HTTP error code : 502cannotconnect
出于测试目的,我需要执行此操作,但现在无法继续。
我能够使用 curl 和 Postman Client 获得正确的响应(如本问题的标题所述)
谁能指出这里可能出了什么问题?
我正在使用 java 8
仅供参考,产品将设置证书。我正在做这个不安全的配置,这样我就可以从我的本地设置中调用这个 Rest API。
502 错误表示您 能够成功连接到受 TLS 保护的端点(可能是通过忽略其不可信的证书)。出了问题的是此端点无法代理到另一台主机的连接,并且 "cannot connect".
是代理
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502
因此,您一定遇到了特定于您的 java 进程的配置问题,该问题不影响 curl 或邮递员。我见过的一个例子是您试图访问 windows 中本地主机上的 Web 服务端点,但由于 OS 和办公室 LAN 设置,连接首先发送到网络的互联网代理 -它不知道如何处理地址“127.0.0.1”。我会检查您的 OS 网络设置是否设置得当,并且未设置可用于在 java 进程中覆盖它们的环境变量:
https.proxyHost
https.proxyPort
http.nonProxyHosts
像 Fiddler 这样的本地程序也可能试图充当代理并助长此问题。
另一种可能性是您的交易对手在他们的末端使用反向代理,由于某种原因,它正在努力路由 java 进程发出的请求。确保您在 java 客户端中使用的主机名与在 curl/postman 中使用的主机名完全相同(不是手动解析的 IP 地址或本地 DNS 别名)。
旁白:许多 Java 开发人员在制作原型时在无操作信任管理器中进行黑客攻击是很多人曾经做过的事情 - 但添加您希望信任的证书是一种更好的做法到您的本地 JVM 信任库,或者改为特定于进程的信任库。这样您就不必在测试和生产中使用不同的代码。
https://docs.oracle.com/cd/E79792_01/resa/pdf/141/html/merch_sg/apps-chapter%207.htm#CHDJBIJD
我正在尝试通过禁用 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));
参考:
但是,我收到以下回复;
InboundJaxrsResponse{context=ClientResponse{method=POST, uri=myURLHere, status=502, reason=cannotconnect}}
我也使用 HttpsURLConnection 尝试了类似的逻辑。
参考:
出现如下类似的错误;
java.lang.RuntimeException: Failed : HTTP error code : 502cannotconnect
出于测试目的,我需要执行此操作,但现在无法继续。
我能够使用 curl 和 Postman Client 获得正确的响应(如本问题的标题所述) 谁能指出这里可能出了什么问题?
我正在使用 java 8
仅供参考,产品将设置证书。我正在做这个不安全的配置,这样我就可以从我的本地设置中调用这个 Rest API。
502 错误表示您 能够成功连接到受 TLS 保护的端点(可能是通过忽略其不可信的证书)。出了问题的是此端点无法代理到另一台主机的连接,并且 "cannot connect".
是代理https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502
因此,您一定遇到了特定于您的 java 进程的配置问题,该问题不影响 curl 或邮递员。我见过的一个例子是您试图访问 windows 中本地主机上的 Web 服务端点,但由于 OS 和办公室 LAN 设置,连接首先发送到网络的互联网代理 -它不知道如何处理地址“127.0.0.1”。我会检查您的 OS 网络设置是否设置得当,并且未设置可用于在 java 进程中覆盖它们的环境变量:
https.proxyHost
https.proxyPort
http.nonProxyHosts
像 Fiddler 这样的本地程序也可能试图充当代理并助长此问题。
另一种可能性是您的交易对手在他们的末端使用反向代理,由于某种原因,它正在努力路由 java 进程发出的请求。确保您在 java 客户端中使用的主机名与在 curl/postman 中使用的主机名完全相同(不是手动解析的 IP 地址或本地 DNS 别名)。
旁白:许多 Java 开发人员在制作原型时在无操作信任管理器中进行黑客攻击是很多人曾经做过的事情 - 但添加您希望信任的证书是一种更好的做法到您的本地 JVM 信任库,或者改为特定于进程的信任库。这样您就不必在测试和生产中使用不同的代码。
https://docs.oracle.com/cd/E79792_01/resa/pdf/141/html/merch_sg/apps-chapter%207.htm#CHDJBIJD