排球SSL – 主机名未经validation

我正在开发Android应用程序,我需要访问HTTPS地址。 我正在使用Volley来请求我的数据,但现在我收到此错误com.android.volley.NoConnectionError: java.io.IOException: Hostname '

' was not verified

为了获得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) 

我搜索了错误,但我没有找到任何适合我的情况。 谁能帮我?

假设您的服务器应用程序托管在服务器计算机内,该服务器计算机具有服务器证书,例如, "Issued to""localhost" 。 然后,在validation方法内,您可以validation"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. 主机名validation的常见问题

    出现这种情况的一个原因是服务器配置错误。 服务器配置了一个证书,该证书没有与您尝试访问的服务器匹配的主题或主题备用名称字段…

然后,在您的Volley应用程序中,您可以创建一个HurlStack ,覆盖createConnection ,其中setHostnameVerifierhttpsURLConnection

希望这可以帮助!

当您的Internet在http请求期间断开连接时,会发生此错误。 因此,请确保您的互联网一致,然后检查。

这是一种可能的解决方案

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