首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSLPeerUnverifiedException OkHttp?

SSLPeerUnverifiedException OkHttp?
EN

Stack Overflow用户
提问于 2016-01-08 07:47:43
回答 3查看 6.2K关注 0票数 8

我试图使用OkHttp库向API发送带有url参数的post请求。按照这篇博客文章,到目前为止,我有以下代码:

代码语言:javascript
复制
    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:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-08 09:26:38

更新

com.squareup.okhttp3:okhttp:3.0.1代码

代码语言:javascript
复制
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();
        }
    }
});

由于您的项目使用了OkHttp v3.0.0-RC1,因此要修复该异常,您的代码应该如下所示:

代码语言:javascript
复制
        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;不同,我建议您阅读谷歌关于主机名验证中的常见问题的文档以获得更多信息。

另一个有用的链接是OkHttp的HTTPS wiki

希望能帮上忙!

P/S:请注意,我使用了异步方式的OkHttp (在client.newCall(请求).enqueue(新的回调().),您也可以使用同步方式作为代码。

票数 7
EN

Stack Overflow用户

发布于 2016-01-08 08:06:12

显然,您试图连接到SSL网站(https),因此您需要添加一个SSLSocketFactory,下面是一些代码片段。

代码语言:javascript
复制
OkHttpClient client = new OkHttpClient();
client.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });

有关更多细节,请参见此页面,它将对您有所帮助。

如果您想“信任所有证书”,请参见示例,但它的不是命令,应该只用于测试

票数 0
EN

Stack Overflow用户

发布于 2016-01-08 08:39:07

检查SSLSession主机名和连接主机名.

代码语言:javascript
复制
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;
            }
        });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34671926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档