2015-09-04 62 views
3

我正在開發Android應用程序,我需要訪問HTTPS地址。我使用抽射要求我的數據,但現在我得到這個錯誤com.android.volley.NoConnectionError: java.io.IOException: Hostname '<address>' was not verifiedVolley SSL - 主機名未驗證

要獲得SSL工廠我有這樣的:

private static SSLSocketFactory getSocketFactory() { 
    SSLSocketFactory socketFactory = null; 


    try { 
     final CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); 
     final BufferedInputStream bis = new BufferedInputStream(sContext.getResources().openRawResource(R.raw.cert)) ; 

     Certificate certificate; 
     try { 
      certificate = certificateFactory.generateCertificate(bis); 
     } finally { 
      bis.close(); 
     } 

     final String keyStoreType = KeyStore.getDefaultType(); 
     final KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
     keyStore.load(null, null); 
     keyStore.setCertificateEntry("ca", certificate); 

     final String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
     TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
     tmf.init(keyStore); 
     final SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(null, tmf.getTrustManagers(), null); 
     socketFactory = sslContext.getSocketFactory(); 
    } catch (Exception e) { 
     Log.w(TAG, Log.getStackTraceString(e)); 
    } 
    return socketFactory; 
} 

隊列初始化:

final HttpStack stack = new HurlStack(null, getSocketFactory()); 
final Cache cache = new NoCache(); 
final Network network = new BasicNetwork(stack); 
sRequestQueue = new RequestQueue(cache, network); 
sRequestQueue.start(); 

這裏的堆棧跟蹤:

com.android.volley.NoConnectionError: java.io.IOException: Hostname 'url' was not verified 
09-04 11:15:33.198 W/System.err﹕ at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:151) 
09-04 11:15:33.198 W/System.err﹕ at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112) 
09-04 11:15:33.198 W/System.err﹕ Caused by: java.io.IOException: Hostname 'hml.services.vivara.com.br' was not verified 
09-04 11:15:33.198 W/System.err﹕ at com.android.okhttp.Connection.upgradeToTls(Connection.java:201) 
09-04 11:15:33.198 W/System.err﹕ at com.android.okhttp.Connection.connect(Connection.java:151) 
09-04 11:15:33.198 W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276) 
09-04 11:15:33.198 W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211) 
09-04 11:15:33.198 W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373) 
09-04 11:15:33.198 W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106) 
09-04 11:15:33.198 W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:208) 
09-04 11:15:33.198 W/System.err﹕ at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218) 
09-04 11:15:33.198 W/System.err﹕ at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25) 
09-04 11:15:33.198 W/System.err﹕ at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:240) 
09-04 11:15:33.198 W/System.err﹕ at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:210) 
09-04 11:15:33.198 W/System.err﹕ at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:106) 
09-04 11:15:33.198 W/System.err﹕ at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96) 

我搜索了錯誤,但我沒有找到任何東西爲我的情況。誰能幫我?

回答

4

讓我們假設您的服務器應用程序託管在服務器機器中,該服務器機器具有服務器證書,其中"Issued to""localhost",例如。然後,在驗證方法內部,您可以驗證"localhost"

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

您可以通過以下鏈接閱讀更多:

  1. HostnameVerifier

    這是一個握手過程中使用,如果URL的主機名不匹配對等的標識主機。

  2. Common Problems with Hostname Verification

    原因之一可能發生這種情況是由於服務器配置錯誤。該 服務器配置不具備與你 嘗試訪問的服務器,一個主題 或主題備用名稱字段的證書......

然後,在你排球應用,您可以創建一個HurlStack,覆蓋createConnection其中setHostnameVerifierhttpsURLConnection

希望這會有所幫助!

+0

的方法發現這個錯誤的原因'HurlStack'中的'createConnection'返回'HttpURLConnection',而不是'HttpsURLConnection'。所以,沒有'setHostnameVerifier'。請提供更詳細的回答如何爲這種情況創建一個自定義的'HurlStack'對象。謝謝! – toom

+1

@toom你可以在我的另一個答案http:// stackoverflow找到一個例子。com/questions/32673568/do-android-volley-support-ssl/32674422#32674422 – BNK

+1

你的其他答案非常好。謝謝! – toom

-2

當您的網絡在http請求期間斷開連接時發生此錯誤。 所以請確保您的互聯網是一致的,然後檢查。

+0

我認爲你可以在https://developer.android.com/training/articles/security-ssl.html#CommonHostnameProbs – BNK

-2

這是一個可能的解決方案

HostnameVerifier allHostsValid = new HostnameVerifier() { 
    public boolean verify(String hostname, SSLSession session) { 
     return true; 
    } 
}; 
+0

那應該是什麼? –