SSL-клиент на Android - PullRequest
       12

SSL-клиент на Android

7 голосов
/ 28 марта 2011

В настоящее время я пишу клиентскую часть для Android (2.2) и сервер, использующий SSL.Мне удалось обмениваться сообщениями между сервером и обычным клиентом, но Android, похоже, не слишком доволен самозаверяющими сертификатами.Я искал Stackoverflow и Googled МНОГО, и МНОГО людей имеют схожие проблемы.Все ответы, которые я нашел, либо не работали, либо не имели никакого смысла.Большинство примеров кода для HTTPS, но я не могу использовать это, так как мне нужно общаться через сокет (SSLSocket - моя лучшая догадка).Я перепробовал много разных кодов, но сейчас я снова как бы возвращаюсь к нулю.

До сих пор я понял, что мне нужно создать сертификат (кажется, я правильно понял) иПользовательский TrustManager.Очевидно, я не смог найти ни одного рабочего кода, поэтому я спрашиваю здесь, поскольку обычно есть действительно полезные люди.

Я ищу подробное описание того, что должно быть сделанои некоторый код, который можно превратить в работающий код клиента Android.

Заранее спасибо

Ответы [ 4 ]

1 голос
/ 22 августа 2013
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();
        }
    }

Надеюсь, это поможет вам.

1 голос
/ 29 марта 2011

CertificateChainValidator является частью Android источников.По крайней мере, в версии / теге 2.2.1_r1

Чтобы это работало, вы можете собрать Браузер из источников Android и изменить способ инициализации SSLContext в файле HttpsConnection.java.

Вам нужны keyManagers (initializedс cerfile / паролем) и trustManager (доверяйте всем).

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

1 голос
/ 07 апреля 2011

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

Не стесняйтесь менять источники по мере необходимости.

1 голос
/ 28 марта 2011

Я сделал это с портированием родного браузера Android.Я просто изменил, как создается контекст ssl.Я обещал, что также выложу какой-нибудь рабочий пример на сайт SandroB, но ...:)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...