【问题标题】:Volley SSL - Hostname was not verifiedVolley SSL - 主机名未验证
【发布时间】:2015-11-30 22:22:31
【问题描述】:

我正在开发一个 Android 应用程序,我需要访问一个 HTTPS 地址。我正在使用 Volley 请求我的数据,但现在我收到此错误 com.android.volley.NoConnectionError: java.io.IOException: Hostname '<address>' 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)

我搜索了错误,但没有找到适合我的案例的任何内容。谁能帮帮我?

【问题讨论】:

    标签: java android ssl android-volley self-signed


    【解决方案1】:

    这是一个可能的解决方案

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

    【讨论】:

    • 那应该是什么?
    【解决方案2】:

    假设您的服务器应用托管在具有服务器证书的服务器计算机中,例如,"Issued to""localhost"。然后,在 verify 方法中,您可以验证 "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

      发生这种情况的一个原因是服务器配置错误。这 服务器配置了没有主题的证书 或与您所在的服务器匹配的主题备用名称字段 试图到达...

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

    希望这会有所帮助!

    【讨论】:

    • createConnection 中的 HurlStack 方法返回 HttpURLConnection不是 HttpsURLConnection。所以,没有setHostnameVerifier 。请提供更详细的答案,如何为此案例创建自定义 HurlStack 对象。谢谢!
    • @toom 你可以在我的另一个答案stackoverflow.com/questions/32673568/…找到一个例子
    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 2014-02-20
    • 1970-01-01
    • 2012-10-30
    • 2015-08-25
    • 2020-11-15
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    相关资源
    最近更新 更多