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();
  • 相关阅读:
    mysql 远程登陆不上
    hdu 5339 Untitled【搜索】
    SqlServer 书目
    passwordauthentication yes
    oracle 11g RAC ocfs2
    Oracle 11g RAC database on ASM, ACFS or OCFS2
    CentOS ips bonding
    Oracle 11g RAC features
    openStack 王者归来之 trivial matters
    openstack windows 2008 img
  • 原文地址:https://www.cnblogs.com/ganzhijie/p/15110890.html
Copyright © 2011-2022 走看看