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

Lar*_*s D 32 java ssl android

我已经查看了有关如何通过HTTPSAndroid从使用自签名证书的服务器检索内容的各种帖子.然而,他们似乎都没有工作 - 他们都没有删除

javax.net.ssl.SSLException:不受信任的服务器证书消息.

不能选择将服务器修改为具有可信证书,也不能使服务器证书与服务器的IP地址匹配.

请注意,服务器没有DNS名称,它只有一个IP地址.GET请求看起来像这样:

 https://username:password@anyIPAddress/blabla/index.php?param=1&param2=3
Run Code Online (Sandbox Code Playgroud)

我完全清楚这种解决方案很容易发生中间人攻击等.

因此,解决方案必须忽略对证书缺乏信任,并忽略主机名不匹配.

有没有人知道使用Java for Android的代码?

有很多尝试在stackoverflow.com上解释这个,以及大量的代码片段,但它们似乎不起作用,并且没有人提供一个解决这个问题的代码块,据我所见.知道某人是否真的解决了这个问题,或者Android是否只是阻止了不受信任的证书,这将会很有趣.

Mos*_*oss 36

我制作了一个使用自签名或信任所有证书的应用程序.来源是:http://code.google.com/p/meneameandroid/source/browse/#svn/trunk/src/com/dcg/auth并免费使用:P

只需使用HttpManager并使用信任所有人创建SSL工厂:http://code.google.com/p/meneameandroid/source/browse/trunk/src/com/dcg/util/HttpManager.java

编辑:链接已更新


Sim*_*onJ 35

正如您正确指出的那样,有两个问题: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());
Run Code Online (Sandbox Code Playgroud)

b)创建一个HostnameVerifier,即使证书与主机名不匹配,也允许连接继续:

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

两者都必须在代码的开头发生,然后才开始搞乱HttpsURLConnections等等.这适用于Android和常规JRE.请享用.

  • 这个问题已经提到了安全问题.然而,当你通过密钥库进行战斗并对证书进行排序时 - 几小时后 - 仍然存在问题,因为"GlobalTrust CA,Inc." 与"GlobalTrust CA Inc."不同 (没有逗号)你开始考虑数据是否合理 - 我非常感谢代码片段"禁用安全性".至少对于原型...... (4认同)
  • 我试过这个,我可以确认它有效. (2认同)

Yul*_*liy 6

如果您正在使用HttpsURLConnection,那么请尝试setHostnameVerifier之前调用它connect(),并传递一个HostnameVerifier只是接受它而不管准确性.