代码之家  ›  专栏  ›  技术社区  ›  Lars D

使用Android和自签名服务器证书的HTTPS GET(SSL)

  •  32
  • Lars D  · 技术社区  · 14 年前

    HTTPS 在Android上,来自使用自签名证书的服务器。然而,它们似乎都不起作用——它们都未能移除

    它不是修改服务器以拥有可信证书的选项,也不是使服务器证书与服务器的IP地址匹配的选项。

    注意,服务器没有DNS名称,只有IP地址。GET请求如下所示:

     https://username:password@anyIPAddress/blabla/index.php?param=1&param2=3
    

    有很多人试图解释这一点 stackoverflow.com

    7 回复  |  直到 12 年前
        1
  •  36
  •   Josh Correia sgargan    4 年前

    here 免费使用:P

    只需使用HttpManager并使用trustall-one创建SSL工厂。找到样本代码 here .

        2
  •  35
  •   SimonJ    14 年前

    正如您正确指出的,有两个问题:a)证书不可信,b)证书上的名称与主机名不匹配。

    警告: 不能 把它用在任何重要的事情上。没有身份验证的SSL/TLS比根本没有加密更糟糕——读取和修改“加密”的数据更糟糕 琐碎的 甚至不知道会发生什么 .

    还和我在一起?我害怕。。。

    a) 通过创建其TrustManager接受任何内容的自定义SSLContext来解决:

    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(null, new TrustManager[] {
      new X509TrustManager() {
        public void checkClientTrusted(X509Certificate[] chain, String authType) {}
        public void checkServerTrusted(X509Certificate[] chain, String authType) {}
        public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
      }
    }, null);
    HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
    

    和b)通过创建主机名验证程序,即使证书与主机名不匹配,也允许连接继续:

    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
      public boolean verify(String hostname, SSLSession session) {
        return true;
      }
    });
    

    这两种情况都必须在代码开始时发生,然后才开始使用HttpsURLConnections等等。这在Android和普通的JRE中都能工作。享受吧。

        3
  •  6
  •   Yuliy    14 年前

    如果您正在使用HttpsURLConnection,请尝试调用 setHostnameVerifier 以前就有过 connect() HostnameVerifier 不管真实性如何都能接受。

        6
  •  1
  •   saxos    14 年前

    如果你问我,就用安全的方法。

    找到了一个好的教程 http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/

    另外,Maciek推荐的教程也非常好。