2014-07-07 92 views
0

我從網站的API使用HTTP獲取JSON。這是開發測試網址。主機名<URL>未通過org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname驗證

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.err(23000): java.io.IOException: Hostname '...........' was not verified 07-07 11:06:17.515: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:199) 07-07 11:06:17.515: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnection(HttpsURLConnectionImpl.java:391) 07-07 11:06:17.515: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205) 07-07 11:06:17.515: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:614) 07-07 11:06:17.515: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:268) 07-07 11:06:17.515: W/System.err(23000): at com.globalsolutions.mygov.api.rest.SimpleRestClient.sendRequest(SimpleRestClient.java:69) 07-07 11:06:17.515: W/System.err(23000): at com.globalsolutions.mygov.api.rest.SimpleRestClient.post(SimpleRestClient.java:41) 07-07 11:06:17.515: W/System.err(23000): at com.globalsolutions.mygov.api.Api.auth(Api.java:117) 07-07 11:06:17.515: W/System.err(23000): at com.globalsolutions.mygov.ui.SplashActivity$6.run(SplashActivity.java:248) 07-07 11:06:17.531: W/System.err(23000): at java.lang.Thread.run(Thread.java:1019) 07-07 11:06:17.531: W/System.err(23000): java.io.IOException: Hostname 'my.gov.uz' was not verified 07-07 11:06:17.539: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:199) 07-07 11:06:17.539: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnection(HttpsURLConnectionImpl.java:391) 07-07 11:06:17.539: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205) 07-07 11:06:17.539: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:614) 07-07 11:06:17.539: W/System.err(23000): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:268) 07-07 11:06:17.539: W/System.err(23000): at com.globalsolutions.mygov.api.rest.SimpleRestClient.sendRequest(SimpleRestClient.java:69) 07-07 11:06:17.554: W/System.err(23000): at com.globalsolutions.mygov.api.rest.SimpleRestClient.post(SimpleRestClient.java:41) 07-07 11:06:17.554: W/System.err(23000): at com.globalsolutions.mygov.api.Api.auth(Api.java:117) 07-07 11:06:17.554: W/System.err(23000): at com.globalsolutions.mygov.ui.SplashActivity$6.run(SplashActivity.java:248) 07-07 11:06:17.554: W/System.err(23000): at java.lang.Thread.run(Thread.java:1019)

我覺得這條線會導致錯誤:

conn.getOutputStream().write(payload); 

我使用這個exeption,發現不同的建議。老實說,我不明白如何將這些代碼應用到我的應用程序中。

有人可以解釋如何將HTTP連接更改爲HTTPS連接? 謝謝你寶貴的時間!

以防萬一,我使用三星Galaxy王牌了Android 2.3.6

更新:使用的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; 
    } 

更新代碼,但仍然得到同樣的exeption:

07-07 12:39:30.882: W/System.err(25360): java.io.IOException: Hostname 'my.gov.uz' was not verified 07-07 12:39:30.890: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:199) 07-07 12:39:30.890: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnection(HttpsURLConnectionImpl.java:391) 07-07 12:39:30.890: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205) 07-07 12:39:30.890: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:614) 07-07 12:39:30.890: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:268) 07-07 12:39:30.890: W/System.err(25360): at com.globalsolutions.mygov.api.rest.SimpleRestClient.sendRequest(SimpleRestClient.java:85) 07-07 12:39:30.890: W/System.err(25360): at com.globalsolutions.mygov.api.rest.SimpleRestClient.post(SimpleRestClient.java:46) 07-07 12:39:30.890: W/System.err(25360): at com.globalsolutions.mygov.api.Api.auth(Api.java:117) 07-07 12:39:30.890: W/System.err(25360): at com.globalsolutions.mygov.ui.SplashActivity$6.run(SplashActivity.java:248) 07-07 12:39:30.890: W/System.err(25360): at java.lang.Thread.run(Thread.java:1019) 07-07 12:39:30.898: W/System.err(25360): java.io.IOException: Hostname 'my.gov.uz' was not verified 07-07 12:39:30.898: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:199) 07-07 12:39:30.898: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnection(HttpsURLConnectionImpl.java:391) 07-07 12:39:30.898: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205) 07-07 12:39:30.898: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:614) 07-07 12:39:30.898: W/System.err(25360): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:268) 07-07 12:39:30.898: W/System.err(25360): at com.globalsolutions.mygov.api.rest.SimpleRestClient.sendRequest(SimpleRestClient.java:85) 07-07 12:39:30.898: W/System.err(25360): at com.globalsolutions.mygov.api.rest.SimpleRestClient.post(SimpleRestClient.java:46) 07-07 12:39:30.921: W/System.err(25360): at com.globalsolutions.mygov.api.Api.auth(Api.java:117) 07-07 12:39:30.921: W/System.err(25360): at com.globalsolutions.mygov.ui.SplashActivity$6.run(SplashActivity.java:248) 07-07 12:39:30.921: W/System.err(25360): at java.lang.Thread.run(Thread.java:1019)

回答

0

看來你的服務器配置了一個沒有主題或主題替代名稱字段的證書h您嘗試訪問的服務器。嘗試this爲了避免這個問題

+0

我沒有訪問服務器。我只能從客戶端訪問。在這種情況下我能做什麼? –

+0

您是否已閱讀鏈接後的文檔?它描述瞭如何解決客戶端的問題。它建議使用[HttpsUrlConnection](https://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html)或使用自定義[HostnameVerifier](https://developer.android.com/reference/ javax/net/ssl/HostnameVerifier.html),以防萬一[這裏是我正在談論的鏈接](https://developer.android.com/training/articles/security-ssl.html#CommonHostnameProbs) – Chaosit

+0

我有二手hostNameVerfier選項:的HostnameVerifier的HostnameVerifier =新的HostnameVerifier(){ \t \t @Override \t \t公共布爾驗證(字符串主機名,會話的SSLSession){ \t \t的HostnameVerifier HV = \t \t HttpsURLConnection.getDefaultHostnameVerifie R(); \t \t return hv.verify(「my.gov。UZ」,會議); \t \t} \t \t}; \t \t HttpsURLConnection的康恩= NULL; \t \t響應響應= NULL; \t \t長時間= 0; \t \t嘗試{ \t \t \t \t \t \t conn =(HttpsURLConnection)request.getUrl() .openConnection(); \t \t \t conn.setHostnameVerifier(hostnameVerifier);但它仍然給出同樣的例外。 –