Ошибка загрузки карты Google, когда я ограничиваю доступ в Интернет запросами SSL / HTTPS - PullRequest
0 голосов
/ 28 апреля 2018

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

HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());

Проблема заключается в том, что, если я добавлю эту строку, Google Maps прекратит загрузку, если я удалю эту строку, карта загрузится, но мое приложение не сможет подключиться к API на https : //XXX.com/login

Я не получаю сообщение об ошибке, когда карта Google перестает загружаться. В противном случае я получаю SSLHandshake Error, если удаляю вышеуказанную строку. Я использую залп для моих сетевых запросов. Не уверен, куда идти отсюда. Ищу помощь сообщества!

код

private SSLSocketFactory getSocketFactory() {

        CertificateFactory cf = null;
        try {

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

                ca = cf.generateCertificate(caInput);
                Log.e("sslAuth", "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("sslAuth", "CipherUsed "+session.getCipherSuite());
                    Log.e("sslAuth", "hostname "+hostname);
                    if(hostname.compareTo("xxxxxx.com")==0)
                        return true;
                    else if(hostname.compareTo("google.com")==0)
                        return true;
                    else
                        return false;
                }
            };


            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;
    }

КОД:

public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            //mRequestQueue = Volley.newRequestQueue (getApplicationContext ());
            mRequestQueue = Volley.newRequestQueue(this, new HurlStack(null, getSocketFactory()));
        }

        return mRequestQueue;
    }

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Используете ли вы тот же экземпляр HttpClient для получения GoogleMaps?

Вы должны использовать другой HttpClient для своего внутреннего запроса и запросов Google

Я никогда не использовал Volley, но я уверен, что вы можете сделать это, в OkHttp это должно быть так

//Something like this you should change or add your Interceptors
public OkHttpClient getHttpClient(){
        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        try {

        //add your sslSocketFactory and TrustManager    
httpClient.sslSocketFactory(getSocketFactory(),getTrustManager());

            httpClient.addInterceptor(headerInterceptor());
            httpClient.connectTimeout(60, TimeUnit.SECONDS);
            httpClient.writeTimeout(60, TimeUnit.SECONDS);
            httpClient.readTimeout(60,TimeUnit.SECONDS);
        } catch (KeyManagementException | NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return httpClient.build();
    }

//You should add your trustManager here
public TrustManager getTrustManager(){
    return new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

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

            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }
0 голосов
/ 14 мая 2018

Я реализовал настройку, включающую OkHttp и Volley. Эта реализация создает клиента OkHttp, который настроен для SSL. Этот клиент передается в Volley для создания очереди запросов для обработки всего взаимодействия между приложением и сервером данных.

Напротив, реализация, размещенная в вопросе, настраивает Global Application Client для SSL. Это не позволяет Google Map взаимодействовать со своими серверами через принудительную настройку SSL. Надеюсь, это поможет кому-то в дальнейшем. Вот код Ура!

Создать запрос залпаQueue:

public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(this, new OkHttpStack());
        }
        return mRequestQueue;
}

OkHttpStack

public class OkHttpStack extends HurlStack {
        private final OkUrlFactory mFactory;

        public OkHttpStack() {
            OkHttpClient client = getCustomOkHttpClient();
            mFactory = new OkUrlFactory(client);
        }

        @Override
        protected HttpURLConnection createConnection(URL url) throws IOException {
            return mFactory.open(url);
        }
    }

getCustomOkHttpClient ()

private OkHttpClient getCustomOkHttpClient() {

        OkHttpClient client = new OkHttpClient();
        CertificateFactory cf = null;
        try {
            cf = CertificateFactory.getInstance("X.509");
            InputStream caInput = getResources().openRawResource(R.raw.xxx);
            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());
                    Log.e("CipherUsed", hostname);
                    //return true;
                    return hostname.compareTo("xxx.com")==0 || hostname.compareTo("zzz.com") == 0;

                }
            };


            client.setHostnameVerifier(hostnameVerifier);
            SSLContext context = null;
            context = SSLContext.getInstance("TLS");

            context.init(null, tmf.getTrustManagers(), null);
            client.setSslSocketFactory(context.getSocketFactory());

            SSLSocketFactory sf = context.getSocketFactory();


            return client;

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

        return  null;
    }
0 голосов
/ 07 мая 2018

Просто попробуйте следующие варианты:

1. Поставить блок захвата для

catch(IllegalStateException ex){
ex.printStackTrace();
}

2. Просто попробуйте установить действительный сертификат для google.com. Пожалуйста, следуйте этому руководству импортируйте файлы сертификата ssl

3. Просто отладьте эту строку своего кода

String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm ();

И проверьте, совпадает ли значение tmfAlgorithm с сертификатом ssl, полученным с google.com.

Пожалуйста, обращайтесь за дополнительной помощью. Спасибо

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