Volley SSL-имя хоста не было проверено


Я разрабатываю приложение для Android, и мне нужен доступ к HTTPS-адресу. Я использую Volley для запроса моих данных, но теперь я получаю эту ошибку com.android.volley.NoConnectionError: java.io.IOException: Hostname '<address>' was not verified

Чтобы получить фабрику SSL, я делаю это:

private static SSLSocketFactory getSocketFactory() {
    SSLSocketFactory socketFactory = null;


    try {
        final CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        final BufferedInputStream bis = new BufferedInputStream(sContext.getResources().openRawResource(R.raw.cert)) ;

        Certificate certificate;
        try {
            certificate = certificateFactory.generateCertificate(bis);
        } finally {
            bis.close();
        }

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

        final String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);
        final SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, tmf.getTrustManagers(), null);
        socketFactory = sslContext.getSocketFactory();
    } catch (Exception e) {
        Log.w(TAG, Log.getStackTraceString(e));
    }
    return socketFactory;
}

Инициализация очереди:

final HttpStack stack = new HurlStack(null, getSocketFactory());
final Cache cache = new NoCache();
final Network network = new BasicNetwork(stack);
sRequestQueue = new RequestQueue(cache, network);
sRequestQueue.start();

Вот стэктрейс:

    com.android.volley.NoConnectionError: java.io.IOException: Hostname 'url' was not verified
09-04 11:15:33.198   W/System.err﹕ at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:151)
09-04 11:15:33.198   W/System.err﹕ at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)
09-04 11:15:33.198   W/System.err﹕ Caused by: java.io.IOException: Hostname 'hml.services.vivara.com.br' was not verified
09-04 11:15:33.198   W/System.err﹕ at com.android.okhttp.Connection.upgradeToTls(Connection.java:201)
09-04 11:15:33.198   W/System.err﹕ at com.android.okhttp.Connection.connect(Connection.java:151)
09-04 11:15:33.198   W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
09-04 11:15:33.198   W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
09-04 11:15:33.198   W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
09-04 11:15:33.198   W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
09-04 11:15:33.198   W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:208)
09-04 11:15:33.198   W/System.err﹕ at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
09-04 11:15:33.198   W/System.err﹕ at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25)
09-04 11:15:33.198   W/System.err﹕ at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:240)
09-04 11:15:33.198   W/System.err﹕ at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:210)
09-04 11:15:33.198   W/System.err﹕ at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:106)
09-04 11:15:33.198   W/System.err﹕ at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96)

Я искал ошибку, но ничего не нашел для своего случая. Кто-нибудь может мне помочь?

3 3

3 ответа:

Предположим, что ваше серверное приложение размещено внутри серверной машины, имеющей сертификат сервера, в котором "Issued to" является "localhost", например. Затем внутри метода verify вы можете проверить "localhost".

HostnameVerifier hostnameVerifier = new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        HostnameVerifier hv =
            HttpsURLConnection.getDefaultHostnameVerifier();
        return hv.verify("localhost", session);
    }
};

Вы можете прочитать больше по следующим ссылкам:

  1. HostnameVerifier

    Он должен использоваться во время рукопожатия, если имя хоста URL-адреса не совпадает с именем хоста идентификации узла.

  2. Общие проблемы с Проверка Имени Хоста

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

Затем в вашем приложении Volley можно создать HurlStack, переопределив createConnection, в котором setHostnameVerifier для httpsURLConnection.

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

Эта ошибка возникает, когда ваш интернет отключается во время http-запроса. Поэтому убедитесь, что ваш интернет непротиворечив, а затем проверьте.

Это возможное решение

HostnameVerifier allHostsValid = new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
};