我已经查看了有关如何通过HTTPSAndroid从使用自签名证书的服务器检索内容的各种帖子.然而,他们似乎都没有工作 - 他们都没有删除
javax.net.ssl.SSLException:不受信任的服务器证书消息.
不能选择将服务器修改为具有可信证书,也不能使服务器证书与服务器的IP地址匹配.
请注意,服务器没有DNS名称,它只有一个IP地址.GET请求看起来像这样:
https://username:password@anyIPAddress/blabla/index.php?param=1¶m2=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.请享用.
如果您正在使用HttpsURLConnection,那么请尝试setHostnameVerifier之前调用它connect(),并传递一个HostnameVerifier只是接受它而不管准确性.
| 归档时间: |
|
| 查看次数: |
50832 次 |
| 最近记录: |