Ошибка подключения Android 4.4 Volley к nginx - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблемы с подключением устройств Android с API <21 к моему серверу nginx.Все результаты получены с эмулированного устройства API 19. </p>

Я пытался использовать VolleyToolboxExtension и NoSSLv3Factory, как предложено в другом месте, но все еще получал серьезные ошибки, как показано ниже, за исключением того, что вместо sslv3 это был tlsv1.

Мой текущий подход заключается в том, чтобы позволить старым версиям Android подключаться через SSLv3. Но это по-прежнему вызывает ошибки, подобные приведенным ниже.

Примечание. Я знаю, что SSLv3 не работает, но я использую другой сертификати я не отправляю ничего, что касается безопасности.Основная идея состоит в том, чтобы сделать опрос, чтобы я мог решить, хочу ли я отказаться от поддержки более старых версий Android SDK.

error during request: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xb8a45890: Failure in SSL library, usually a protocol error
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741 0x8d959990:0x00000000)

Я использую следующий код для подключения:

final String url;
if ( Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP ){
    url = "https://abc.badssl.example.com";
} else {
    url = "https://abc.example.com";
}
final JSONObject jsonBody;
try {
    jsonBody = new JSONObject("{\"api\":" + Build.VERSION.SDK_INT + "}");
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url,
            jsonBody,
            response -> {
                try {
                    Log.d(TAG, "Response is: " + response.getInt("api"));
                } catch (JSONException e) {
                    Log.wtf(TAG, e);
                }
                wasRunning = true;
                loading.postValue(false);
            }, e -> {
        Log.e(TAG, "error during request: " + e.getMessage());
        error.postValue(true);
    });
    jsonObjectRequest.setShouldCache(false);
    jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS, 5, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    queue.getCache().clear();

    queue.add(jsonObjectRequest);
} catch (JSONException e) {
    Log.wtf(TAG, e);
}

И это моя конфигурация nginx для abc.badssl.example.com, использующая другой сертификат:

listen  443 ssl;
server_name abc.badssl.example.com;

ssl on;
ssl_protocols SSLv3;
ssl_dhparam /etc/nginx/ssl/dhparams.pem;

#worker shared ssl cache
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_ciphers 'ECDHE-ECDSA-AES256-SHA:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:!DHE-RSA-AES256-GCM-SHA384:!DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:!DHE-RSA-AES256-SHA256:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES256-SHA:!DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!DHE-RSA-DES-CBC-SHA:!DHE-RSA-CAMELLIA256-SHA:!DHE-RSA-CAMELLIA128-SHA:!DHE-DSS-CBC-SHA:!DHE-RSA-DES-CBC3-SHA';

fastcgi_param HTTPS on;

Я думаю, что я неправильно понял параметры nginx, но не могу найти99% - это либо отключение SSLv3, либо ничего о текущей версии залпа (неработающие ссылки в SO).

1 Ответ

0 голосов
/ 20 февраля 2019

Хорошо, так что решение оказывается немного другим.

Прежде всего: SSLv3 отключен в Debian & Ubuntu в текущих версиях OpenSSL по очевидным причинам.Интересно, что это не выдает никаких ошибок или что-то подобное, протоколы конфигурации nginx просто игнорируются ?!Я все еще могу подключиться через TLS1.X к серверу, даже с только SSLv3 в конфигурации.Nmap сообщает то же самое.

На Android <21 (как сказано в других ответах) TLS существует, но SSLv3 предпочтителен или даже принудителен. </p>

Самое простое решение для получения работающего HTTPsUrlConnection на старых устройствахиспользовать NetCipher.

build.gradle:

implementation "info.guardianproject.netcipher:netcipher:2.0.0-alpha1"

А затем использовать Netcipher для создания HTTP-соединения.
Вы также можете использовать это вместе с volley, используяКастомный HttpStack.Обратите внимание, что StrongBuilders от Netcipher не предназначены для простых соединений https! Они предназначены только для подключения через сеть Tor.Так что не обманывайте себя, думая, что вы можете просто использовать их, чтобы избежать HttpStack.

Обработчик запросов без залпа, используя необработанный HttpsUrlConnection, урезан:

final String url = "https://asd.example.com";
runner = new Thread(() -> {

    final JSONObject jsonBody;
    try {
        HttpsURLConnection con = NetCipher.getHttpsURLConnection(new URL(url));
        con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
        con.setRequestProperty("Accept", "application/json");
        con.setDoOutput(true);
        con.setDoInput(true);

        jsonBody = new JSONObject("{\"api\":" + Build.VERSION.SDK_INT + "}");

        OutputStream wr = con.getOutputStream();
        wr.write(jsonBody.toString().getBytes("UTF-8"));
        wr.flush();
        wr.close();

        InputStream in = new BufferedInputStream(con.getInputStream());
        ByteArrayOutputStream result = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length;
        while ((length = in.read(buffer)) != -1) {
            result.write(buffer, 0, length);
        }

        JSONObject jsonObject = new JSONObject(result.toString("UTF-8"));
        in.close();


        con.disconnect();
        Log.d(TAG,"received json: "+jsonObject.toString());
        loading.postValue(false);
    } catch (
            Exception e) {
        Log.wtf(TAG, e);
    }
});
runner.start();
...