Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未在org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname上验证主机名_Java_Android_Apache_Https - Fatal编程技术网

Java 未在org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname上验证主机名

Java 未在org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname上验证主机名,java,android,apache,https,Java,Android,Apache,Https,我使用HTTP从网站的API获取JSON。这是开发测试URL public static final String BASE_URL = "http://...." 我正在使用POST请求 private Response sendRequest(Request request, boolean debug) throws Exception { HttpURLConnection conn = null; Response resp

我使用HTTP从网站的API获取JSON。这是开发测试URL

public static final String BASE_URL = "http://...."
我正在使用POST请求

private Response sendRequest(Request request, boolean debug)
            throws Exception {

        HttpURLConnection conn = null;

        Response response = null;
        long time = 0;

        try {
            conn = (HttpURLConnection) request.getUrl().openConnection();

            if (request.headers != null) {
                for (String header : request.headers.keySet()) {
                    conn.addRequestProperty(header, request.headers.get(header));
                }
            }

            time = System.currentTimeMillis();

            conn.setDoOutput(false);
            if (request instanceof POST) {
                byte[] payload = ((POST) request).body;

                conn.setDoOutput(true);
                conn.setFixedLengthStreamingMode(payload.length);
                conn.getOutputStream().write(payload);//line69
            }

            int status = conn.getResponseCode();

            if (status != HttpURLConnection.HTTP_OK)
                response = new Response(status, conn.getResponseMessage()
                        .getBytes());
            else {
                if (conn.getContentType().contains("application/json")) {
                    response = new Response(status, readInputStream(
                            conn.getInputStream()).getBytes());
                } else {
                    response = new Response(status,
                            readInputStreamWithoutUTF8(conn.getInputStream()));
                }

            }
            response.contentType = conn.getContentType();
            response.contentLength = conn.getContentLength();
            response.time = System.currentTimeMillis() - time;
            if (debug)
                dumpRequest(request, response);

        } catch (IOException e) {
            e.printStackTrace(System.err);
            throw e;

        } finally {
            if (conn != null)
                conn.disconnect();
        }

        return response;
    }
测试URL一切正常。但是文档中说要使用发布URL,它是

public static final String BASE_URL = "https://..."
当我将测试URL更改为发布URL时,应用程序出现以下异常

07-07 11:06:17.515:W/System.err23000:java.io.IOException:Hostname “…………”未经验证07-07 11:06:17.515: W/System.err23000:at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifysecuresockethostnamethttpconnection.java:199 07-07 11:06:17.515:W/System.err23000:at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnectionHttpsURLConnectionImpl.java:391 07-07 11:06:17.515:W/System.err23000:at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connectHttpURLConnectionImpl.java:205 07-07 11:06:17.515:W/System.err23000:at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStreamHttpURLConnectionImpl.java:614 07-07 11:06:17.515:W/System.err23000:at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStreamHttpsURLConnectionImpl.java:268 07-07 11:06:17.515:W/System.err23000:at com.globalsolutions.mygov.api.rest.SimpleRestClient.sendRequestSimpleRestClient.java:69 07-07 11:06:17.515:W/System.err23000:at com.globalsolutions.mygov.api.rest.SimpleRestClient.postSimpleRestClient.java:41 07-07 11:06:17.515:W/System.err23000:at com.globalsolutions.mygov.api.api.authApi.java:117 07-07 11:06:17.515:W/System.err23000:at com.globalsolutions.mygov.ui.SplashActivity$6.runSplashActivity.java:248 07-07 11:06:17.531:W/System.err23000:at java.lang.Thread.runThread.java:1019 07-07 11:06:17.531: W/System.err23000:java.io.IOException:Hostname'my.gov.uz'未指定 已验证07-07 11:06:17.539:W/System.err23000:at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifysecuresockethostnamethttpconnection.java:199 07-07 11:06:17.539:W/System.err23000:at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnectionHttpsURLConnectionImpl.java:391 07-07 11:06:17.539:W/System.err23000:at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connectHttpURLConnectionImpl.java:205 07-07 11:06:17.539:W/System.err23000:at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStreamHttpURLConnectionImpl.java:614 07-07 11:06:17.539:W/System.err23000:at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStreamHttpsURLConnectionImpl.java:268 07-07 11:06:17.539:W/System.err23000:at com.globalsolutions.mygov.api.rest.SimpleRestClient.sendRequestSimpleRestClient.java:69 07-07 11:06:17.554:W/System.err23000:at com.globalsolutions.mygov.api.rest.SimpleRestClient.postSimpleRestClient.java:41 07-07 11:06:17.554:W/System.err23000:at com.globalsolutions.mygov.api.api.authApi.java:117 07-07 11:06:17.554:W/System.err23000:at com.globalsolutions.mygov.ui.SplashActivity$6.runSplashActivity.java:248 07-07 11:06:17.554:W/System.err23000:at java.lang.Thread.runThread.java:1019

我认为这一行导致了错误:

conn.getOutputStream().write(payload);
我在谷歌上搜索了这个例外,发现了不同的建议。老实说,我不知道如何在我的应用程序中实现这些代码

有人能解释一下如何将HTTP连接更改为HTTPS连接吗? 谢谢你宝贵的时间

以防万一,我正在使用三星Galaxy Ace和安卓2.3.6

更新:使用HostnameVerifier更新代码

但仍然得到同样的解释:

07-07 12:39:30.882:W/System.err25360:java.io.IOException:Hostname “my.gov.uz”未经验证07-07 12:39:30.890:W/System.err25360: 在 org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifysecuresockethostnamethttpconnection.java:199 07-07 12:39:30.890:W/System.err25360:at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnectionHttpsURLConnectionImpl.java:391 07-07 12:39:30.890:W/System.err25360:at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connectHttpURLConnectionImpl.java:205 07-07 12:39:30.890:W/System.err25360:at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStreamHttpURLConnectionImpl.java:614 07-07 12:39:30.890:W/System.err25360:at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStreamHttpsURLConnectionImpl.java:268 07-07 12:39:30.890:W/System.err25360:at com.globalsolutions.mygov.api。 rest.SimpleRestClient.sendRequestSimpleRestClient.java:85 07-07 12:39:30.890:W/System.err25360:at com.globalsolutions.mygov.api.rest.SimpleRestClient.postSimpleRestClient.java:46 07-07 12:39:30.890:W/System.err25360:at com.globalsolutions.mygov.api.api.authApi.java:117 07-07 12:39:30.890:W/System.err25360:at com.globalsolutions.mygov.ui.SplashActivity$6.runSplashActivity.java:248 07-07 12:39:30.890:W/System.err25360:at java:1019 07-07 12:39:30.898: W/System.err25360:java.io.IOException:Hostname'my.gov.uz'未被删除 已验证07-07 12:39:30.898:W/System.err25360:at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifysecuresockethostnamethttpconnection.java:199 07-07 12:39:30.898:W/System.err25360:at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnectionHttpsURLConnectionImpl.java:391 07-07 12:39:30.898:W/System.err25360:at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connectHttpURLConnectionImpl.java:205 07-07 12:39:30.898:W/System.err25360:at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStreamHttpURLConnectionImpl.java:614 07-07 12:39:30.898:W/System.err25360:at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStreamHttpsURLConnectionImpl.java:268 07-07 12:39:30.898:W/System.err25360:at com.globalsolutions.mygov.api.rest.SimpleRestClient.sendRequestSimpleRestClient.java:85 07-07 12:39:30.898:W/System.err25360:at com.globalsolutions.mygov.api.rest.SimpleRestClient.postSimpleRestClient.java:46 07-07 12:39:30.921:W/System.err25360:at com.globalsolutions.mygov.api.api.authApi.java:117 07-07 12:39:30.921:W/System.err25360:at com.globalsolutions.mygov.ui.SplashActivity$6.runSplashActivity.java:248 07-07 12:39:30.921:W/System.err25360:at java.lang.Thread.runThread.java:1019


您的服务器似乎配置了一个证书,该证书没有与您尝试访问的服务器匹配的主题或主题备选名称字段。尝试避免此问题

我无法访问服务器。我只能从客户端访问。在这种情况下我能做什么?你读过链接后面的文档了吗?它描述了如何在客户端解决问题。它建议使用of或custom,以防我使用了HostnameVerifier选项:HostnameVerifier HostnameVerifier=newhostnameVerifier{@Override public boolean verifyString hostname,SSLSession session{HostnameVerifier hv=HttpsURLConnection.getDefaultHostnameVerifier;返回hv.verifymy.gov.uz,会话;}};HttpsURLConnection conn=null;响应=null;长时间=0;重试{conn=HttpsURLConnection request.getUrl.openConnection;conn.setHostnameVerifierhostnameVerifier;但它仍然给出相同的异常。实际上很奇怪,这应该可以正常工作,你确定异常是相同的吗?请用HostnameVerifier发布更新的代码好吗?
private Response sendRequest(Request request, boolean debug)
            throws Exception {

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

        HttpsURLConnection conn = null;

        Response response = null;
        long time = 0;

        try {

            conn = (HttpsURLConnection) request.getUrl().openConnection();
            conn.setHostnameVerifier(hostnameVerifier);

            if (request.headers != null) {
                for (String header : request.headers.keySet()) {
                    conn.addRequestProperty(header, request.headers.get(header));
                }
            }

            time = System.currentTimeMillis();

            conn.setDoOutput(false);
            if (request instanceof POST) {
                byte[] payload = ((POST) request).body;

                conn.setDoOutput(true);
                conn.setFixedLengthStreamingMode(payload.length);
                conn.getOutputStream().write(payload);
            }

            int status = conn.getResponseCode();

            if (status != HttpURLConnection.HTTP_OK)
                response = new Response(status, conn.getResponseMessage()
                        .getBytes());
            else {
                if (conn.getContentType().contains("application/json")) {
                    response = new Response(status, readInputStream(
                            conn.getInputStream()).getBytes());
                } else {
                    response = new Response(status,
                            readInputStreamWithoutUTF8(conn.getInputStream()));
                }

            }
            response.contentType = conn.getContentType();
            response.contentLength = conn.getContentLength();
            response.time = System.currentTimeMillis() - time;
            if (debug)
                dumpRequest(request, response);

        } catch (IOException e) {
            e.printStackTrace(System.err);
            throw e;

        } finally {
            if (conn != null)
                conn.disconnect();
        }

        return response;
    }