我目前正在编写Android(2.2)的客户端部分和使用SSL的服务器。我设法在服务器和普通客户端之间交换消息,但Android似乎对自签名证书不太满意。 我搜索过Stackoverflow和Google搜索很多,很多人都有类似的问题。到目前为止我找到的所有答案要么不起作用,要么没有任何意义。那里的大多数代码示例都是针对HTTPS的,但我不能使用,因为我需要通过套接字进行通信(SSLSocket是我最好的猜测)。我尝试了很多不同的代码,但是现在我又回到零了。
到目前为止,我已经发现我必须创建一个证书(我认为我做对了)和一个自定义的TrustManager。显然我找不到任何正常工作的代码,这就是我在这里问的原因,因为通常会有一些非常有帮助的人。
我正在寻找有关应该完成的内容的详细说明,以及一些可以制作成可用的Android客户端代码的代码。
提前致谢
答案 0 :(得分:1)
我已经完成了移植原生Android浏览器。 我刚刚改变了如何创建ssl上下文。 我承诺我也会在SandroB网站上放一些工作示例,但是...... :)
https://market.android.com/details?id=org.sandrob
http://code.google.com/p/sandrob/source/browse/misc/examples/HttpsConnection.java
答案 1 :(得分:1)
CertificateChainValidator是android源代码的一部分。 至少在版本/标签2.2.1_r1
中要使其工作,您可以从Android源构建浏览器并更改方式 SSLContext在HttpsConnection.java文件中初始化。
您需要keyManagers(使用cerfile / password初始化)和trustManagers(信任所有)。
sslContext.engineInit(keyManagers,trustManagers,null,cache,null);
答案 2 :(得分:1)
答案 3 :(得分:1)
public class MySSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[] { tm }, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
}
你Httpclient是
public HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore
.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(
params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
}
希望它对你有所帮助。