Java访问https,不检查任何证书

936 阅读1分钟

处理代码示例

 /**
     * 信任所有服务器地址,不检查任何证书
     */
    private static void trustAllHosts() {

        //创建SSLContext对象,并使用我们指定的信任管理器初始化
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            //返回受信任的X509证书数组。
            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[] {};
            }
            //该方法检查客户端的证书,由于我们不需要对客户端进行认证,所以可以不用处理
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) {

            }
            //该方法检查服务器的证书,通过实现该方法,可以指定我们信任的任何证书。
            //不做任何处理,就会信任任何证书。
            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) {

            }
        } };

        // 安装全信任管理器
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //no verify
    final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

网络请求示例

        HttpsURLConnection conn = null;
        InputStream in = null;
        try{
            //在请求钱先调用此方法
            trustAllHosts();
            //request ssl
            URL url = new URL(request);
            conn = (HttpsURLConnection)url.openConnection();
            //不验证hostname
            conn.setHostnameVerifier(DO_NOT_VERIFY);
            conn.connect();
            in = conn.getInputStream();
            //后续处理