我想监控一个简单的网址。但是当它是一个https服务器时,我得到一个握手异常。可以像浏览器用来连接的方式验证https网址的状态吗? (没有本地证书)。我不知道浏览器如何从https网址获取内容,但我想以同样的方式。无需为每个服务器存储特定证书。受监控的https应该是任何人。
try {
URL u = new URL(row.getUrl());
String protocol = u.getProtocol();
if(protocol.equals("https")) {
HttpsURLConnection hc = (HttpsURLConnection)u.openConnection();
System.out.println("Response Code: " + hc.getResponseCode());
hc.disconnect();
}
if(protocol.equals("http")) {
u.openConnection();
u.getContent();
}
System.out.println("url is up.");
} catch (Exception e) {
(...)
}
答案 0 :(得分:3)
如果您真的不关心服务器证书的有效性,那么您希望设置一个SSLContext
TrustManager
,它不检查任何内容。然后,您需要使用它将默认SSLSocketFactory
设置为HttpsURLConnection
,以便在使用URL
时使用信任管理器。这是一个例子:
TrustManager[] trustEverything = new TrustManager[] {
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() { return null; }
public void checkClientTrusted(X509Certificate[] certs, String authType) { }
public void checkServerTrusted(X509Certificate[] certs, String authType) { }
}
};
SSLContext sslctx = SSLContext.getInstance("SSL");
sslctx.init(null, trustEverything, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslctx.getSocketFactory());
可以找到使用此技术的完整示例here。
正如@erickson指出的那样,这意味着你无法判断你是否真的在和你关心的服务器交谈。更好的解决方案是更新您的信任存储区以包含您正在与之交谈的服务器的自签名证书,而不是忽略所有检查。