zoukankan      html  css  js  c++  java
  • 解决javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.的问题

    解决javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.的问题,出现这个问题的原因是:服务器不信任我们自己创建的证书,所以在代码中必须要忽略证书信任问题。

    解决代码如下:

    package net.joydao.startools.ssl;
    
    import android.util.Log;
    
    import java.security.cert.X509Certificate;
    
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSession;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    
    public class SSLAgent {
    
        private final static String TAG = "SSLAgent";
        private final static boolean DEBUG = true;
    
        private static SSLAgent mSSLAgent;
    
        public static SSLAgent getInstance(){
            if(mSSLAgent == null){
                mSSLAgent = new SSLAgent();
            }
            return mSSLAgent;
        }
    
        /**
         * 信任所有的https证书
         * */
        public void trustAllHttpsCertificates() {
            try{
                TrustManager[] trustAllCerts = new TrustManager[1];
                TrustManager tm = new MyTrustManager();
                trustAllCerts[0] = tm;
                SSLContext sc = SSLContext.getInstance("SSL");
                sc.init(null, trustAllCerts, null);
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
                HttpsURLConnection.setDefaultHostnameVerifier(mHostnameVerifier);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    
        private HostnameVerifier mHostnameVerifier = new HostnameVerifier() {
    
            public boolean verify(String hostname, SSLSession session) {
                log("hostname:" + hostname);
                return true;
            }
    
        };
    
        private static class MyTrustManager implements TrustManager, X509TrustManager {
    
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
    
            public boolean isServerTrusted(X509Certificate[] certs) {
                return true;
            }
    
            public boolean isClientTrusted(X509Certificate[] certs) {
                return true;
            }
    
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
                return;
            }
    
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
                return;
            }
    
        }
    
        private void log(String msg){
            if(DEBUG){
                Log.i(TAG, msg);
            }
        }
    
    }

    在调用获取url内容之前调用:

    SSLAgent.getInstance().trustAllHttpsCertificates();
  • 相关阅读:
    跟一声响骚扰说“拜拜”
    来电过滤 全靠防火墙
    android sd卡读取数据库
    Java程序员十戒
    Java常用的正则表达式验证
    Java 3D 教程:6. Java 3D 与用户界面
    成为Java高手的25个学习目标
    Java数据结构内容整理
    Java中类与类之间的关系
    求助,Java字符串分割问题
  • 原文地址:https://www.cnblogs.com/ganzhijie/p/15110890.html
Copyright © 2011-2022 走看看