使用Android的HTTPS GET(SSL)和自签名服务器证书
我已经查看了各种post,关于如何从使用自签名证书的服务器上通过Android上的HTTPS
获取内容。 然而,他们似乎都没有工作 – 他们都没有取消
javax.net.ssl.SSLException:不可信的服务器证书消息。
不能将服务器修改为具有可信证书,也不能使服务器证书与服务器的IP地址匹配。
请注意,服务器将不会有一个DNS名称,它只会有一个IP地址。 GET请求看起来像这样:
https://username:password@anyIPAddress/blabla/index.php?param=1¶m2=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