当前位置: 首页 > 知识库问答 >
问题:

带Volley的Android HTTPS请求

陈飞语
2023-03-14

javax.net.ssl.SSLHandShakeException:>java.security.cert.certPathValidatorException:未找到证书的信任锚>路径。

这条信息是什么意思?

共有1个答案

邹驰
2023-03-14

出现该消息是因为您需要向volley https请求添加证书。

为此,将hurlstack添加到您的请求中。

    HurlStack hurlStack = new HurlStack() {
        @Override
        protected HttpURLConnection createConnection(java.net.URL url)
                throws IOException {
            HttpsURLConnection httpsURLConnection = (HttpsURLConnection) super
                    .createConnection(url);
            try {
                httpsURLConnection
                        .setSSLSocketFactory(getSSLSocketFactory(context));
                // httpsURLConnection.setHostnameVerifier(getHostnameVerifier());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return httpsURLConnection;
        }
    };

对于GetSSLSocketFactory使用此函数。

 private SSLSocketFactory getSSLSocketFactory(Context context)
            throws CertificateException, KeyStoreException, IOException,
            NoSuchAlgorithmException, KeyManagementException {

// the certificate file will be stored in \app\src\main\res\raw folder path
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream caInput = context.getResources().openRawResource(
                R.raw.YourCertificate);

        Certificate ca = cf.generateCertificate(caInput);
        caInput.close();

        KeyStore keyStore = KeyStore.getInstance("BKS");

        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf
                .getTrustManagers());

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, wrappedTrustManagers, null);

        return sslContext.getSocketFactory();
    }
private TrustManager[] getWrappedTrustManagers(TrustManager[] trustManagers) {
        final X509TrustManager originalTrustManager = (X509TrustManager) trustManagers[0];
        return new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return originalTrustManager.getAcceptedIssuers();
            }

            public void checkClientTrusted(X509Certificate[] certs,
                    String authType) {
                try {
                    if (certs != null && certs.length > 0) {
                        certs[0].checkValidity();
                    } else {
                        originalTrustManager
                                .checkClientTrusted(certs, authType);
                    }
                } catch (CertificateException e) {
                    Log.w("checkClientTrusted", e.toString());
                }
            }

            public void checkServerTrusted(X509Certificate[] certs,
                    String authType) {
                try {
                    if (certs != null && certs.length > 0) {
                        certs[0].checkValidity();
                    } else {
                        originalTrustManager
                                .checkServerTrusted(certs, authType);
                    }
                } catch (CertificateException e) {
                    Log.w("checkServerTrusted", e.toString());
                }
            }
        } };
    }
    RequestQueue requestQueue = Volley.newRequestQueue(context, hurlStack);
    requestQueue.add(Your Request);
 类似资料:
  • 我需要扩展的。它没有错误,但当我试图在适配器中调用它时。 基本上,我需要显示片段B上的所有事件。如果我在没有片段的情况下测试它,它可以工作,但有了它们,它就成了一个小问题。我需要这些片段,因为用于滑动。 片段B代码: CustomListAdapter代码:公共类CustomListAdapter扩展BaseAdapter{private Activity;private LayoutInflat

  • 因此,以下是几年/几个月前可能对我有所帮助的一些类似但过时的答案: 为什么我看不到超文本传输协议或https流量从Chrome浏览器Android上查尔斯代理? 如何让charles proxy使用Android 7 nougat? 我遵循了所有的说明,我可以很好地读取http请求,但不能读取https请求。还是不知道我做错了什么。因为我刚刚遵循了上述指南,所以我没有太多自己的文章可以发表。 我认

  • 很好的一天! 我的应用程序使用简单的http客户端-服务器通信,通过客户端的凌空库建立。首先,我启动一个授权请求: 之后,我请求列出与当前用户相关的设备列表。此时,我收到了来自响应标题的cookei。auth请求的完整标头响应输出: 缓存控制——没有存储,没有缓存,必须重新验证,后检查=0,预检查=0 在身份验证请求的onResponce回调中,我将Set Cookie值作为sessionId,并

  • 目前,我正在使用mrecestQueue.cancelAll(getActive())在一个片段中的on Stop方法,但显然,当我将手机从横向移动到纵向时,它仍然返回请求中的数据,但会导致崩溃,因为持有人数据泄露已经存在了。有什么如何正确处理的示例代码吗?

  • 我正在使用Android截击来发出请求。所以我使用这个代码。我不明白一件事。我在服务器中检查params是否始终为null。我认为GETPARAMS()不工作。我应该做些什么来解决这个问题。

  • 我试图使用RequestFuture向服务器发出同步请求,但它不起作用。使用异步完成相同的请求时效果良好。 这是我的代码: 我得到一个nullpointerexception: Java语言lang.NullPointerException:尝试调用虚拟方法的java。lang.String组织。json。J主题。com上的null对象引用上的toString()。数学应用程序。所有模块。在com