我想监视一个简单的网址.但是,当它是https服务器时,我会收到握手异常.是否可以验证浏览器用来连接的https url状态? (没有本地证书).我不知道浏览器如何从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) {
(...)
}
解决方法:
如果您真的不在乎服务器证书的有效性,那么您想要设置一个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指出的,这意味着您无法确定您是否真的在与所关注的服务器通信.更好的解决方案是更新您的信任存储,以包括正在与之通信的服务器的自签名证书,而不是忽略所有检查.