как использовать библиотеку Google Volley с помощью Https: // (SSL) [дублировать]

Вы можете попробовать и перенести работу в коллекцию Task s и использовать Task.WaitAll , чтобы присоединиться к потокам.

44
задан Abdullah Shoaib 11 June 2013 в 14:48
поделиться

7 ответов

14
ответ дан Ognyan 19 August 2018 в 06:37
поделиться
  • 1
    Проверьте правильность импорта. Вероятно, вы смешивали встроенные классы HttpClient с классами из демонстрации. – Ognyan 18 March 2014 в 10:35
  • 2
    Извините, я не ожидал быстрого ответа, вы были правы, что это была проблема. Спасибо, что создали такую ​​огромную библиотеку. – SteveGSD 18 March 2014 в 21:45
  • 3
    ссылка, вероятно, сломана ... можете ли вы проверить? @Ogre_BGR – rafid059 3 April 2015 в 13:08
  • 4
    @RafiduzzamanSonnet Только что проверил - он работает, можете ли вы подтвердить? – Ognyan 5 April 2015 в 07:28
  • 5
    @Ogre_BGR странно .. он здесь не работает .. btw, я исправил проблему ... blog.denevell.org/android-trust-all-ssl-certificates.html – rafid059 5 April 2015 в 13:43

Это может произойти по нескольким причинам, в том числе:

  • CA, выдавший сертификат сервера, был неизвестен
  • Сертификат сервера не был подписан CA, но
  • В конфигурации сервера отсутствует промежуточный CA

Официальный документ от android

Решение: вы может предоставить файл сертификата в запросе

0
ответ дан Din Islam Milon 19 August 2018 в 06:37
поделиться

Вероятно, эти коды ниже будут вам полезны:

1.Создайте класс HttpsTrustManager, который реализует X509TrustManager:

public class HttpsTrustManager implements X509TrustManager {

    private static TrustManager[] trustManagers;
    private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{};

    @Override
    public void checkClientTrusted(
            java.security.cert.X509Certificate[] x509Certificates, String s)
            throws java.security.cert.CertificateException {

    }

    @Override
    public void checkServerTrusted(
            java.security.cert.X509Certificate[] x509Certificates, String s)
            throws java.security.cert.CertificateException {

    }

    public boolean isClientTrusted(X509Certificate[] chain) {
        return true;
    }

    public boolean isServerTrusted(X509Certificate[] chain) {
        return true;
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return _AcceptedIssuers;
    }

    public static void allowAllSSL() {
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {

            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }

        });

        SSLContext context = null;
        if (trustManagers == null) {
            trustManagers = new TrustManager[]{new HttpsTrustManager()};
        }

        try {
            context = SSLContext.getInstance("TLS");
            context.init(null, trustManagers, new SecureRandom());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }

        HttpsURLConnection.setDefaultSSLSocketFactory(context
                .getSocketFactory());
    }

}

2.Add HttpsTrustManager.allowAllSSL() перед выполнением запроса https:

HttpsTrustManager.allowAllSSL();
String  tag_string_req = "string_req";
StringRequest strReq = new StringRequest(Request.Method.POST,
        your_https_url, new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        Log.d(TAG, "response :"+response);
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        VolleyLog.d(TAG, "Error: " + error.getMessage());
    }
}){
    @Override
    protected Map<String, String> getParams() {
        Map<String, String> params = new HashMap<String, String>();
        params.put("username", "max");
        params.put("password", "123456");
        return params;
    }
};
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
48
ответ дан erakitin 19 August 2018 в 06:37
поделиться
  • 1
    Это все хорошо, за исключением того, что вы фактически не проверяете сертификаты сервера. Просто не забудьте развернуть это на производстве, если вы не хотите подвергать своих пользователей всем видам SSL-атак. – asgs 30 April 2015 в 12:34
  • 2
    Это не для производства. – Law Gimenez 3 September 2015 в 10:38
  • 3
    это похоже на простое решение для самостоятельного сертификата cert на localhost – Charlie Wu 17 November 2015 в 02:09
  • 4
    Как это работает с Волейлом, как плакат спросил? – portfoliobuilder 8 June 2016 в 19:56
  • 5
    Ваше приложение будет отклонено в Google Play, если вы его используете. – apinho 24 November 2017 в 13:31

Я не смог открыть ссылку, предоставленную @ Ogre_BGR, но при просмотре сети я нашел фактическую реализацию, выполненную в следующем smanikandan14 Github . Посмотрите на его объяснение SSl-соединения , чтобы узнать больше об этом.

1
ответ дан laaptu 19 August 2018 в 06:37
поделиться

Пока единственный ответ говорит о добавлении ненадежного сертификата в качестве решения, но поскольку ваш браузер не жалуется, обычно это означает, что Volley не может найти промежуточный сертификат, который завершает полную доверенную цепочку.

Это случилось со мной с сертификатами LetsEncrypt.

Решение Добавьте промежуточный сертификат в конфигурацию вашего веб-сервера. Для Apache вы можете следовать этой ссылке: https://access.redhat.com/solutions/43575

Для LetsEncrypt это именно этот файл: /etc/letsencrypt/live/your.website.com/chain.pem Итак, помимо вашего CertificateFile и KeyFile у вас уже есть работа, у вас теперь есть эта третья строка:

SSLCertificateChainFile /etc/letsencrypt/live/your.website.com/chain.pem

Просто добавив эту строку, перезапуск apache и Volley больше не жалуются, и вы не вводили никаких уязвимостей в системе безопасности!

1
ответ дан Lappro 19 August 2018 в 06:37
поделиться

Если вы используете залп и хотите выполнить HTTPS-запрос или службу SSL-сертификации, вы можете выбрать этот самый простой способ: ->

Шаг -> 1. сохранить файл .cer в res / raw / папка.

Шаг -> 2. Используйте этот метод и замените имя файла .cer файлом .cer и замените имя своего хоста.

private SSLSocketFactory getSocketFactory() {

    CertificateFactory cf = null;
    try {

        cf = CertificateFactory.getInstance("X.509");
        InputStream caInput = getResources().openRawResource(R.raw.cert_name);
        Certificate ca;
        try {

            ca = cf.generateCertificate(caInput);
            Log.e("CERT", "ca=" + ((X509Certificate) ca).getSubjectDN());
        } finally {
            caInput.close();
        }


        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);


        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);


        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {

                Log.e("CipherUsed", session.getCipherSuite());
                return hostname.compareTo("10.199.89.68")==0; //The Hostname of your server.

            }
        };


        HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
        SSLContext context = null;
        context = SSLContext.getInstance("TLS");

        context.init(null, tmf.getTrustManagers(), null);
        HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());

        SSLSocketFactory sf = context.getSocketFactory();


        return sf;

    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }

    return  null;
}

Шаг -> 3. Замените эту строку «RequestQueue queue = Volley.newRequestQueue (this);» с «RequestQueue queue = Volley.newRequestQueue (это новый HurlStack (null, getSocketFactory ())); по просьбе залпа.

2
ответ дан Rishabh Sharma 19 August 2018 в 06:37
поделиться

вы можете добавить этот класс и выполнить его из метода onCreate

new NukeSSLCerts().nuke();

, он заставит залп доверять всем SSL-сертификатам.

9
ответ дан Samrat Das 19 August 2018 в 06:37
поделиться
  • 1
    это слишком опасно ... – Rocel 30 September 2016 в 16:53
  • 2
    другим способом является certbot, предоставлять бесплатный подписанный сертификат, но только на 90 дней, мы должны продлить его каждые 90 дней – Samrat Das 18 January 2017 в 19:52
  • 3
    Идеально подходит для развития – Naveed Ahmad 15 February 2017 в 13:20
  • 4
    С 1 марта 2017 года Google может заблокировать ваше приложение: support.google.com/faqs/answer/7188426 «Начиная с 1 марта 2017 года Google Play заблокирует публикацию любых новых приложений или обновлений, которые используют небезопасная реализация HostnameVerifier. Ваша опубликованная версия APK останется без изменений, однако любые обновления приложения будут заблокированы, если вы не устраните эту уязвимость. & Quot; – MaxF 30 March 2017 в 09:08
  • 5
    @MaxF во втором комментарии, который я дал, другой подход. Для всех, используйте только класс nukeSSl, только если вы находитесь в режиме разработки – Samrat Das 30 March 2017 в 09:21
Другие вопросы по тегам:

Похожие вопросы: