Android上的SSL客户端
我目前正在为Android(2.2)编写一个客户端,并使用SSL编写一个服务器。我设法在服务器和普通客户端之间交换消息,但Android似乎对自签名证书不太满意。 我搜索了Stackoverflow和Google,很多人都有类似的问题。到目前为止,我找到的所有答案要么不起作用,要么毫无意义。大多数代码示例都是针对HTTPS的,但我不能使用它,因为我需要通过套接字进行通信(我最好的猜测是SSLSocket)。我尝试了很多不同的代码,但现在我又回到了零 到目前为止,我发现我必须创建一个证书(我想我做对了)和一个定制的TrustManager。显然,我还没有找到任何工作代码,这就是为什么我在这里问,因为通常有一些真正有用的人 我正在寻找关于应该做什么的详细描述,以及一些代码,这些代码可以制作成一个工作的Android客户端代码Android上的SSL客户端,android,sockets,ssl,client,Android,Sockets,Ssl,Client,我目前正在为Android(2.2)编写一个客户端,并使用SSL编写一个服务器。我设法在服务器和普通客户端之间交换消息,但Android似乎对自签名证书不太满意。 我搜索了Stackoverflow和Google,很多人都有类似的问题。到目前为止,我找到的所有答案要么不起作用,要么毫无意义。大多数代码示例都是针对HTTPS的,但我不能使用它,因为我需要通过套接字进行通信(我最好的猜测是SSLSocket)。我尝试了很多不同的代码,但现在我又回到了零 到目前为止,我发现我必须创建一个证书(我想我做
提前感谢我已经通过移植本地android浏览器完成了这项工作。 我刚刚更改了ssl上下文的创建方式。 我承诺我也会在SandroB网站上提供一些工作示例,但是…:)
CertificateChainValidator是android源代码的一部分。 至少在版本/标签2.2.1_r1中 要使其正常工作,您可以从android源代码构建浏览器,并改变其工作方式 SSLContext在HttpsConnection.java文件中初始化 您需要keyManagers(用cerfile/password初始化)和trustManagers(trustall) engineInit(密钥管理器、信任管理器、null、缓存、null) 您可以根据需要随意更改资源
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();
}
}
希望对您有所帮助。谢谢您的回复。我看过你链接到的代码,它看起来很有趣。问题是它使用了很多类,这些类似乎是定制的。我在Google上查找了其中一些,发现它们已经在其他库中实现。以CertificateChainValidator为例,它似乎应该在android.net.http包中,但它不在那里。是否有一个使用标准库的简化完整工作示例?您好。我似乎无法导入它,根据函数,它似乎不存在。据我所知,我将不得不创建海关经理来处理证书,但我还没有找到一些工作代码。顺便说一下,我正在使用Android 2.2(API 8)。