Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android-java.security.cert.CertPathValidatorException:找不到证书路径的信任锚.在api上少于24 大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

我从19到24在api上的logcat中遇到此错误,我的应用中没有从服务器加载数据,我搜索了该错误并发现solution

 @SuppressLint("TrulyRandom")
public static void handleSSLHandshake() {
    try {
        TrustManager[] trustAllCerts = new TrustManager[]{new x509trustmanager() {
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }

            @Override
            public void checkClientTrusted(X509Certificate[] certs,String authTypE) {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] certs,String authTypE) {
            }
        }};

        SSLContext sc = SSLContext.geTinstance("SSL");
        sc.init(null,trustAllCerts,new SecureRandom());
        httpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        httpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            @Override
            public Boolean verify(String arg0,SSLSession arg1) {
                return true;
            }
        });
    } catch (Exception ignored) {
    }
}

并在我的应用程序类onCreate中调用它,就解决了我的问题,但是在该答案中,如果找到该解决方案,则存在hint,此代码不相关,不应使用! Google禁止使用它.

所以谁知道谷歌允许该错误的替代解决方案是什么?

最佳答案
首先,您将需要生成您的证书文件,这是步骤

>在Firefox浏览器上转到您的网站链接
>单击网站链接右侧的绿色锁
>单击更多信息,然后查看证书
>将出现一个新窗口,其中包含两个常规和详细信息
选择细节
>单击导出以导出证书并保存此文件
在Android项目资产中.

项目应用程序类中的第二个定义hurlStack变量,并在应用程序中使用Next方法OnCreate方法

 private void handleCertificationOnOlderDevices() {
    try {

        CertificateFactory cf = CertificateFactory.geTinstance("X.509");
        InputStream caInput = new 
                            BufferedInputStream(getAssets().open("porter_cert.crt"));
        Certificate ca;
        try {
            ca = cf.generateCertificate(caInput);
            Log.d("certificate",((X509CertificatE) ca).getSubjectDN().toString());
        } finally {
            caInput.close();
        }

        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.geTinstance(keyStoreTypE);
        keyStore.load(null,null);
        keyStore.setCertificateEntry("ca",ca);

        String tmfalgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.geTinstance(tmfalgorithm);
        tmf.init(keyStorE);

        TrustManager[] trustManagers = tmf.getTrustManagers();
        final x509trustmanager origTrustmanager =  
                                                (x509trustmanager) trustManagers[0];

        TrustManager[] wrappedTrustManagers = new TrustManager[]{
                new x509trustmanager() {
                   public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return origTrustmanager.getAcceptedIssuers();
                   }

                   public void checkClientTrusted(X509Certificate[] certs,String authTypE) 
                   {
                        try {
                            origTrustmanager.checkClientTrusted(certs,authTypE);
                        } catch (CertificateException E) {
                            e.printStackTrace();
                        }
                    }

                    public void checkServerTrusted(X509Certificate[] certs,String authTypE) 
                    {
                        try {
                            origTrustmanager.checkServerTrusted(certs,authTypE);
                        } catch (CertificateException E) {
                            e.printStackTrace();
                        }
                    }
                }
        };

        SSLContext context = SSLContext.geTinstance("TLS");
        context.init(null,tmf.getTrustManagers(),null);

        SSLSocketFactory sslSocketFactory = context.getSocketFactory();
        hurlStack = new HurlStack(null,sslSocketFactory);

    } catch (Exception E) {
        e.printStackTrace();
    }

}

并在volley requestQueue上使用hurlStack

    public requestQueue getrequestQueue() {
       if (requestQueue == null)
           requestQueue = Volley.newrequestQueue(getApplicationContext(),hurlStack);
       return requestQueue;
    }

第三,如果您使用Glide拍摄图像,则会遇到与glide相关的ssl证书出现第二个错误,您需要通过这种方式解决

1-在应用程序中更新,将您的gilde和okhttp3构建为这些版本

    implementation "com.squareup.okhttp3:okhttp:3.8.1"
    implementation 'com.github.bumptech.glide:glide:4.9.0'
    AnnotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
    implementation ('com.github.bumptech.glide:okhttp3-integration:4.9.0'){
    exclude group: 'glide-parent'
    }

2-将下一个添加到您的项目中

@GlideModule 
public class CustomGlideModule extends AppGlideModule {
   @Override
   public void registerComponents(Context context,Glide glide,Registryregistry) {
      if (Build.VERSION.SDK_INT <= Build.VERSION_CODEs.N) {
          OkhttpClient client = 
                        SafeOkhttpClient.getSafeOkhttpClient(context);
          OkhttpUrlLoader.Factory factory = new 
                                       OkhttpUrlLoader.Factory(client);
          glide.getRegistry().replace(GlideUrl.class,InputStream.class,factory);
      }
   }

 }

现在滑行将与您配合正常.

大佬总结

以上是大佬教程为你收集整理的android-java.security.cert.CertPathValidatorException:找不到证书路径的信任锚.在api上少于24 全部内容,希望文章能够帮你解决android-java.security.cert.CertPathValidatorException:找不到证书路径的信任锚.在api上少于24 所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。