【问题标题】:SSL Client on AndroidAndroid 上的 SSL 客户端
【发布时间】:2011-07-24 11:08:15
【问题描述】:

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

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

我正在寻找关于应该做什么的详细描述,以及一些可以制作成工作 Android 客户端代码的代码。

提前致谢

【问题讨论】:

    标签: android sockets ssl client


    【解决方案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();
            }
        }
    

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        CertificateChainValidator 是 android 资源的一部分。 至少在版本/标签 2.2.1_r1

        要使其正常工作,您可以从 android 源构建浏览器并更改方式 SSLContext 在 HttpsConnection.java 文件中初始化。

        您需要 keyManagers(使用 cerfile/password 初始化)和 trustManagers(信任所有)。

        sslContext.engineInit(keyManagers, trustManagers, null, cache, null);

        【讨论】:

        • 嗨。我似乎无法导入它,并且根据developer.android.com/reference/android/net/http/… 该功能似乎不存在。据我所知,我必须创建海关经理来处理证书,但我还没有找到一些工作代码。顺便说一句,我使用的是 Android 2.2 (API 8)。
        【解决方案4】:

        我已经通过移植原生 android 浏览器来完成它。 我只是更改了创建 ssl 上下文的方式。 我承诺我也会在 SandroB 网站上放一些工作示例,但是...... :)

        https://market.android.com/details?id=org.sandrob

        http://code.google.com/p/sandrob/source/browse/misc/examples/HttpsConnection.java

        【讨论】:

        • 感谢您的回复。我查看了您链接到的代码,它看起来很有趣。问题是它使用了很多类,这似乎是定制的。我在 Google 上查找了其中一些,发现它们已在其他库中实现。让我们来看一下 CertificateChainValidator 似乎应该在包 android.net.http 中 - 但它不存在。是否有使用标准库的简化完整工作示例?
        猜你喜欢
        • 2013-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 2017-10-04
        相关资源
        最近更新 更多