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

我已经查看了各种post,关于如何从使用自签名证书的服务器上通过Android上的HTTPS获取内容。 然而,他们似乎都没有工作 – 他们都没有取消

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

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

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

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

我完全意识到这个解决scheme很容易出现中间人攻击等。

所以,解决scheme必须忽略证书中缺乏信任,并忽略主机名不匹配。

有没有人知道这个代码,使用Java for Android?

有很多尝试在stackoverflow.com上解释这个,以及大量的代码片段,但他们似乎并没有工作,没有人提供了一个解决这个问题的代码块,据我所知。 如果有人真的解决了这个问题,或者Android只是阻止不可信任的证书,那将会很有趣。

我做了一个使用自签名或信任所有证书的应用程序。 源代码在这里: http : //code.google.com/p/meneameandroid/source/browse/#svn/trunk/src/com/dcg/auth并免费使用:P

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

编辑:链接更新

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

警告:对于任何其他人来到这个答案,这是一个肮脏的,可怕的黑客,你不能用它的任何重要的事情。 没有身份validation的SSL / TLS比根本没有encryption更糟糕 – 读取和修改您的“encryption”数据对于攻击者来说是微不足道的 ,而且您甚至不知道正在发生

还跟我? 我很害怕

a)通过创build一个自定义的SSLContext来解决,其TrustManager接受任何东西:

 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)通过创build一个允许连接继续的HostnameVerifier,即使证书与主机名不符:

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

在开始使用HttpsURLConnections之前,两者都必须在代码的开始处发生,等等。 这适用于Android和常规JRE。 请享用。

如果您使用的是HttpsURLConnection,则可以在connect()之前尝试在其上调用setHostnameVerifier ,并向其传递一个HostnameVerifier ,而不pipe其真实性如何。

您可以安全地安静地进行操作: http : //blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

如果您有权访问设备,则可以将证书添加到密钥库。 在这里看到更多的信息 。

另一方面,你可以使用这种方法,但我认为这是一种丑陋。


资源:

  • developer.android.com – SSLSocketFactory
  • Android和自签名的SSL证书

在同一主题上:

  • https连接Android
  • HTTPS与自签名的SSL证书问题…解决scheme还是更好的方法?
  • 自签名SSL接受Android

如果你问我,以安全的方式来做。

find一个很好的教程http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/实际上并不难。;

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

我testing了它,它在我的应用程序中没有任何问题。

我做了一个应用程序,使用自签名证书4个月前这里是我希望它有助于的代码: https : //bitbucket.org/momo0002/tlsdemo.git