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 ответа:
Обновить
Код для
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; } });