当前位置: 首页 > 面试题库 >

Volley SSL-主机名未验证

归俊杰
2023-03-14
问题内容

我正在开发一个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)

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


问题答案:

让我们假设你的服务器的应用程序是具有服务器证书中的服务器机内托管"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. 主机名验证器

如果URL的主机名与对等方的标识主机名不匹配,则在握手期间使用它。

  1. 主机名验证的常见问题

发生这种情况的一个原因是由于服务器配置错误。服务器配置的证书没有主题或主题备用名称字段与您尝试连接的服务器匹配的证书…

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

希望这可以帮助!



 类似资料:
  • 我正在esp32上实现一个websocket服务器,并且在android studio Simulator上运行的应用程序上使用okhttp lib。 我正在使用由openssl命令生成的自分配证书:openssl req-newkey rsa:2048-nodes-keyout prvtkey.pem-x509-days 3650-out cacert.pem-subj“/cn=esp32 HT

  • 问题内容: 跟进正则表达式以匹配主机名或IP地址? 并使用对有效主机名的限制作为参考,在Python中匹配/验证主机名/ fqdn(完全限定域名)的最易读,简洁的方法是什么?我在下面的尝试中已经回答过,欢迎改进。 问题答案: import re def is_valid_hostname(hostname): if len(hostname) > 255: return False if host

  • 我们使用Spring SAML扩展将Salesforce设置为IDP,我们的应用程序是SP。但我们得到错误“SSL对等方未能通过名称:null的主机名验证” 下面是我们的 SAML 配置类。 我们尝试了将“Spring Security SAML HTTPS链接到另一个页面”的建议,其中1)禁用主机名验证,或2)注释掉Bean“TLSProtocolConfigurer”,并将Salesforce

  • 在测试我的客户机-服务器分布式系统时,我最初惊讶地得知TLS的默认JSSE实现不进行主机名验证。我在这个问题中尝试了公认的答案,但我的用例有点不同。我使用RabbitMQ的连接工厂,它抽象了SSLSocket的构造。我只是为连接工厂提供了一个SSLContext。我确实找到了很多关于HTTPS的信息,甚至还有一些其他协议,但并不是总能使用的通用协议,即使是自定义协议。 但是,除了使用之外,关于创建

  • 问题内容: 谁能解释一下主机名和规范主机名之间的区别? 我当前正在使用InetAddress类使用IP地址获取主机名。我遇到了这两个API。所以我只是想知道,我应该选择哪一个? 问题答案: 两者之间有一些区别: 将尝试解析FQDN。因此,您将获得 _foo.mycompany.com, 而可能仅返回 _foo 。 将始终进行反向DNS查找,而如果在构造函数中提供了主机名,则将返回存储的主机名。 如

  • 问题内容: 我正在尝试使用Raspberry Pi建立VPN,第一步是要能够从本地网络外部进入设备。无论出于何种原因,这都是不可能的,我也没有丝毫的暗示。当我尝试使用进入服务器时,出现错误: 但是,我可以使用以下方式登录服务器: 该服务器是运行最新版本Raspbian的Raspberry Pi Model B,而我尝试与其连接的计算机是运行Mavericks的Macbook Pro。当我设置Ras