Подтвердить что ты не робот

Android/Java - Как создать соединение HTTPS?

У меня есть код, который позволяет мне подключаться к серверам 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")));

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

    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.