Android / Java - Как создать HTTPS-соединение? - PullRequest
14 голосов
/ 30 марта 2011

У меня есть код, который позволяет мне подключаться к серверам https и передавать данные.Это работает просто отлично, но я хочу знать, правильно ли я это делаю, и на самом деле я делаю безопасное соединение.Пожалуйста, проверьте мою работу.Спасибо.

public class HTTPSClient extends DefaultHttpClient
{

    public HTTPSClient() 
    {
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager()
    {
        SchemeRegistry registry = new SchemeRegistry();

        HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER;
        final SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
        socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
        //socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", socketFactory, 80));
        registry.register(new Scheme("https", socketFactory, 443));
        HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, "UTF-8");

        return new SingleClientConnManager(params, registry);
    }
}

Я использую этот код примерно так:

HttpResponse response = mConnection.httpsClient.execute(new HttpHost("www.somehostname.com", 80), new HttpGet("https://someaddress")));

Затем я читаю ответ оттуда.Еще раз спасибо.

Ответы [ 2 ]

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

Посмотрите на официальный Настраиваемый контекст SSL от Apache HttpClient.

Как упоминал Стивен С., вам не нужно регистрировать порт 80 для контекста https.Зарегистрируйте его вместо http (если необходимо).Это означает, что при вызове URL-адреса https будет использоваться соответствующая socketFactory, как вы указали.

ПРИМЕЧАНИЕ. В большинстве случаев вы получите «Сертификат не является доверенным» или подобное исключение при подключении с Androidустройства для сайтов с пользовательскими сертификатами или сертификатами от не очень известных эмитентов.Если это так, вам нужно создать собственное хранилище сертификатов для вашего приложения, чтобы оно доверяло вашим сертификатам сервера.Если вы хотите знать, как добиться этого, вы можете посмотреть мою статью в блоге

Если вы хотите проверить, действительно ли ваше устройство взаимодействует через защищенное соединение, вы можете сделатьпозвоните в конечную точку https с эмулятора Android и перехватите трафик с помощью Wireshark на компьютере разработчика.

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

4 голосов
/ 30 марта 2011

Я с подозрением отношусь к этому:

    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", socketFactory, 80));
    registry.register(new Scheme("https", socketFactory, 443));

Особенно вторая строка.Зачем вам регистрировать порт 80 для схемы «https»?

Это либо безвредно / избыточно, либо вы собираетесь отправлять запросы «https» на порт 80.

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