使用URL类(Java)监视HTTPS连接

我想监视一个简单的网址.但是,当它是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指出的,这意味着您无法确定您是否真的在与所关注的服务器通信.更好的解决方案是更新您的信任存储,以包括正在与之通信的服务器的自签名证书,而不是忽略所有检查.

上一篇:java:有哪些库来管理/监控进程?


下一篇:linux – 使用sh监视输出时无法解决此错误