我们尝试使用HTTPS和Basic Auth编写一个 rest 客户端。代码如下。我收到以下异常:
java.net.Connect异常:连接超时:连接
谁能帮我找到我做错了什么?
public class sampleMain {
public static void main(String[] args) {
ClientConfig clientConfig = new DefaultClientConfig();
/* clientConfig.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true);*/
clientConfig.getProperties().put(ClientConfig.PROPERTY_READ_TIMEOUT, 300000);
clientConfig.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 30000);
disableSslVerification(clientConfig);
Client client = Client.create(clientConfig);
client.setFollowRedirects(true);
HTTPBasicAuthFilter authenticationFilter = new HTTPBasicAuthFilter("admin", "APP@#1234");
client.addFilter(authenticationFilter);
WebResource webResource = client.resource("https://someIP:443/rest/api/topology/servicesnodes");
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
System.out.println(response);
}
//below method is used to set ssl context to clientconfig as https property
private static void disableSslVerification(ClientConfig clientConfig) {
try {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} };
// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
clientConfig.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
}, sc));
} catch (NoSuchAlgorithmException ae1) {
} catch (KeyManagementException e) {
}
}
}
此异常
java.net.ConnectException: Connection timed out: connect
仅意味着不可能在给定超时内通过套接字级别的给定端口连接到给定的 IP/主机,在您的情况下,这足够大,可以排除超时值本身
在 99% 的情况下,当给定的 IP/主机根本无法通过请求者网络的给定端口访问时,就会发生这种情况,实际上并不取决于编写的代码。
假设someIP 不是代码中的拼写错误,从现在开始,您将someIP
替换为实际的实际 IP 地址:
https://someIP:443/rest/api/topology/servicesnodes
您可以尝试在浏览器中打开整个链接,看看它是否在您的代码之外工作。
此外,您还可以验证someIP
是否可以从启动代码的位置443
端口访问。为此,请在运行代码的服务器上从命令行执行以下命令:
telnet someIP 443
- 您应该得到类似
Connected to someIP. Escape character is '^]'.
的东西,这将指示连接成功。按 Ctrl+C 退出会话 - 如果 telnet 挂起并显示消息
Trying someIP...
或以其他方式指示错误 - 则确认给定 IP 无法通过给定端口访问
无法访问 IP 的典型情况可以是
- 错误的 IP,例如,您尝试使用私有 IP 而不是公共 IP
- 端口错误。在服务器侦听例如 8443 时尝试访问默认 443
- 位于给定 IP 上的服务器已关闭
- 您尝试访问 IP 的子网不是必需的。 例如,未列入 IP 所有者的白名单(或者,例如,您必须在所有者网络的 VPN 中才能访问它,或者需要配置代理等(
- 中间的安全代理正在限制访问(防火墙等(
- 。
所有这些情况都需要联系 IP/主机所有者以进一步澄清。
编辑
查看此答案以及"调试"过程说明