Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上的SSL客户端_Android_Sockets_Ssl_Client - Fatal编程技术网

Android上的SSL客户端

Android上的SSL客户端,android,sockets,ssl,client,Android,Sockets,Ssl,Client,我目前正在为Android(2.2)编写一个客户端,并使用SSL编写一个服务器。我设法在服务器和普通客户端之间交换消息,但Android似乎对自签名证书不太满意。 我搜索了Stackoverflow和Google,很多人都有类似的问题。到目前为止,我找到的所有答案要么不起作用,要么毫无意义。大多数代码示例都是针对HTTPS的,但我不能使用它,因为我需要通过套接字进行通信(我最好的猜测是SSLSocket)。我尝试了很多不同的代码,但现在我又回到了零 到目前为止,我发现我必须创建一个证书(我想我做

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

到目前为止,我发现我必须创建一个证书(我想我做对了)和一个定制的TrustManager。显然,我还没有找到任何工作代码,这就是为什么我在这里问,因为通常有一些真正有用的人

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


提前感谢

我已经通过移植本地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)。