【问题标题】:Find out if an HTTPS url is online查明 HTTPS 网址是否在线
【发布时间】:2012-06-21 17:03:03
【问题描述】:

如果安全网站的证书由 CA 签名,我需要一个返回 true 的函数。在 Android 中,如果您尝试连接到自签名证书,它会抛出 SSLException,在这种情况下,我只是捕获它并返回 false。您可以查看代码:

public static boolean isValidCertificate(URL url) throws IOException {
    HttpsURLConnection con;
    try {
        con = (HttpsURLConnection) url.openConnection();
        con.connect();
        con.disconnect();
        return true;
    } catch (SSLException e) {
        return false;
    } 
}

我的问题是,如果站点不可用,我希望函数抛出异常。但我刚刚发现 Android 在这种情况下会抛出相同的 SSLException,并显示相同的消息:“没有受信任的服务器证书”。

无论证书是否有效,有没有办法知道服务器是否在线?

谢谢!

【问题讨论】:

  • npe,很抱歉,但我不是在问如何避免 CA 检查。确实,我已经知道该怎么做。
  • 然后也许发布你得到的异常的完整堆栈跟踪。以及用于信任所有证书的代码。
  • 我的代码是可以的,但是我做错了,谢谢你,因为我一直在想你的上一篇文章,我找到了解决方案。我会发布它。
  • ' 如果站点不可用... Android 在这种情况下会抛出相同的 SSLException,并带有相同的消息:“没有受信任的服务器证书”。我觉得这难以置信。它会抛出ConnectExceptionNoRouteToHostExceptionUnknownHostException 等。你一定在做一些很奇怪的事情。

标签: java android ssl


【解决方案1】:

使用“https://flimflam.asdfasdfasdfg.com”等虚假网址对其进行测试,看看您的情况会发生什么。

如果没有基于openConnection 方法建立连接,则应触发IOException。很可能这更像是一个超时,您将花时间等待超时。

【讨论】:

  • 我尝试使用假 URL 并调试该函数,它会引发相同的异常。这让我很烦......
【解决方案2】:

尝试在con.disconnect(); 之前使用con.getResponseCode(); 以获得您想要的异常。

【讨论】:

  • 我试过了,没用。不过谢谢! (它抛出了同样的异常)。
【解决方案3】:

我找到了解决方案。我只需要在调用此函数之前检查 URL 是否在线。我可以在没有 CA 签名检查的情况下使用我的 httpsclient 并获取响应,然后调用此方法。

【讨论】:

  • 所以换句话说,您忽略了ConnectException 并继续进行证书验证。
  • 我没有忽略ConnectException,因为我没有得到它!
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2012-01-25
  • 1970-01-01
  • 2016-02-27
  • 2012-05-26
相关资源
最近更新 更多