SSLPeerUnverifiedException Ohttp?


Я пытаюсь использовать библиотеку Ohttp для отправкиpost запроса в API с некоторыми параметрами url. После этой записи в блоге у меня есть этот код до сих пор:

    public String okHttpRequest() throws IOException{

        OkHttpClient client = new OkHttpClient();
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.hostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {

                return true;
            }
        });
        HttpUrl.Builder urlBuilder = HttpUrl.parse("myurl").newBuilder();
        urlBuilder.addQueryParameter("username","username");
        urlBuilder.addQueryParameter("password","7777");
        String url = urlBuilder.build().toString();

        Request request = new Request.Builder()
                .url(url)
                .build();

        //HERE EXCEPTION IS THROWN
        Response response = client.newCall(request).execute(); 
        return response.body().string();
}

Исключение составляет:

javax.net.ssl.SSLPeerUnverifiedException: Hostname {domain} not verified:

3 2

3 ответа:

Обновить

Код для com.squareup.okhttp3:okhttp:3.0.1

mTextView = (TextView) findViewById(R.id.textView);
mHandler = new Handler(Looper.getMainLooper());

final Request request = new Request.Builder()
        .url("https://...")
        .post(formBody)
        .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, final IOException e) {
        Log.e(LOG_TAG, e.toString());
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                String message = request.toString() + "\r\n" + e.toString();
                mTextView.setText(message);
            }
        });
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        try {
            JSONObject jsonObject = new JSONObject(response.body().string());
            final String message = jsonObject.toString(5);
            Log.i(LOG_TAG, message);
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    mTextView.setText(message);
                }
            });
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
});

Потому что ваш проект использует Охттп v3. 0. 0-RC1, поэтому, чтобы исправить это исключение, ваш код должен быть следующим образцом:

        OkHttpClient client = new OkHttpClient.Builder()
                .hostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                })
                .build();

        Request request = new Request.Builder()
                .url("https://...")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(final Request request, final IOException e) {
                // do something...
            }

            @Override
            public void onResponse(Response response) throws IOException {
                // do something...
            }
        });

Однако вместо return true; выше, я предлагаю вам прочитать документацию Google о распространенных проблемах с проверкой имени хоста для получения дополнительной информации.

Еще одна полезная ссылка Вики OkHttp в HTTPS.

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

P/S: обратите внимание, что я использую асинхронный способ Ohttp (at client.ньюколл (запрос).enqueue (новый обратный вызов ()...), можно также использовать способ синхронизации с кодом.

Очевидно, вы пытаетесь подключиться к веб-сайту SSL (https), поэтому вам нужно добавить SSLSocketFactory, ниже небольшой фрагмент кода.

OkHttpClient client = new OkHttpClient();
client.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });

Для получения более подробной информации смотрите эту страницу или эту, это должно помочь вам.

Если вы хотите "доверять всем сертификатам", смотрите Этот пример, но он Не рекомендуется и должен использоваться только для тестирования!

Проверьте имя узла SSLSession и имя узла подключения...

OkHttpClient client = new OkHttpClient();
client.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
                    System.out.println("Warning: URL host '" + urlHostName
                            + "' is different to SSLSession host '"
                            + session.getPeerHost() + "'.");
                }
                return true;
            }
        });