Android上的SSL客户端

时间:2011-03-28 12:37:32

标签: android sockets ssl client

我目前正在编写Android(2.2)的客户端部分和使用SSL的服务器。我设法在服务器和普通客户端之间交换消息,但Android似乎对自签名证书不太满意。 我搜索过Stackoverflow和Google搜索很多,很多人都有类似的问题。到目前为止我找到的所有答案要么不起作用,要么没有任何意义。那里的大多数代码示例都是针对HTTPS的,但我不能使用,因为我需要通过套接字进行通信(SSLSocket是我最好的猜测)。我尝试了很多不同的代码,但是现在我又回到零了。

到目前为止,我已经发现我必须创建一个证书(我认为我做对了)和一个自定义的TrustManager。显然我找不到任何正常工作的代码,这就是我在这里问的原因,因为通常会有一些非常有帮助的人。

我正在寻找有关应该完成的内容的详细说明,以及一些可以制作成可用的Android客户端代码的代码。

提前致谢

4 个答案:

答案 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();
        }
    }

希望它对你有所帮助。