1

我正在尝试通过禁用 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 Client 获得正确的响应(如本问题的标题中所述)任何人都可以提出这里可能出现的问题吗?

我正在使用 java 8

仅供参考,生产将设置证书。我正在做这个不安全的配置,以便我可以从我的本地设置中调用这个 Rest API。

4

1 回答 1

2

502 错误表明您能够成功连接到受 TLS 保护的端点(可能通过忽略其不可信的证书)。出了问题的是该端点无法代理与另一台主机的连接,并且是“无法连接”的代理。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502

因此,您必须遇到特定于您的 java 进程的配置问题,该问题不会影响 curl 或 postman。我见过的一个例子是您尝试在 Windows 中访问本地主机上的 web 服务端点,但由于操作系统和办公室 LAN 设置,连接首先被发送到网络的互联网代理 - 它不知道该怎么做地址为“127.0.0.1”。我会检查您的操作系统网络设置是否正确设置,并且未设置可用于在 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

于 2019-12-09T23:40:37.117 回答