zoukankan      html  css  js  c++  java
  • 解决访问HTTPS,抛出的异常javax.net.ssl.SSLHandshakeException

    本地测试没问题,http换成https抛出异常javax.net.ssl.SSLHandshakeException,网上有说是服务器证书,有说要启动SSL3协议的,反正没有找到有用的。

    在GET和POST请求时创建安全的SSL连接:

    代码:

    import com.alibaba.fastjson.JSONObject;
    import org.apache.http.HttpResponse;
    import org.apache.http.HttpStatus;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    import org.apache.http.conn.socket.ConnectionSocketFactory;
    import org.apache.http.conn.socket.PlainConnectionSocketFactory;
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.util.EntityUtils;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    
    /**
     * <p>HTTP 请求工具类<p>
     * @version 1.0
     * @author li_hao
     * @date 2018年11月7日
     */
    public class HttpSendUtil {
        private static PoolingHttpClientConnectionManager connMgr;
        private static RequestConfig requestConfig;
        private static final int MAX_TIMEOUT = 600000;
    
        static {
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", PlainConnectionSocketFactory.INSTANCE)
                    .register("https", createSSLConnSocketFactory())
                    .build();
            // 设置连接池
            connMgr = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
            // 设置连接池大小
            connMgr.setMaxTotal(100);
            connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());
            RequestConfig.Builder configBuilder = RequestConfig.custom();
            // 设置连接超时
            configBuilder.setConnectTimeout(MAX_TIMEOUT);
            // 设置读取超时
            configBuilder.setSocketTimeout(MAX_TIMEOUT);
            // 设置从连接池获取连接实例的超时
            configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);
            // 在提交请求之前 测试连接是否可用
            configBuilder.setStaleConnectionCheckEnabled(true);
            requestConfig = configBuilder.build();
        }
    
        /**
         * 发送 GET 请求(HTTP)
         *
         * @param url
         * @return
         */
        public static JSONObject doGet(String url) {
            CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
            HttpGet httpGet = new HttpGet(url);
            HttpResponse response = null;
            String out = null;
            JSONObject jsonObject = null;//接收结果
            try {
                response = httpclient.execute(httpGet);
                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode != HttpStatus.SC_OK) { //请求出错
                    System.out.println(EntityUtils.toString(response.getEntity(), "utf-8") + url); //打印错误信息
                    return null;
                }
                out = EntityUtils.toString(response.getEntity(), "utf-8");
                jsonObject = JSONObject.parseObject(out);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (httpGet != null) {
                    httpGet.releaseConnection();
                }
            }
            return jsonObject;
        }
    
        /**
         * 发送 POST 请求
         *
         * @param url API接口URL
         * @param params 参数map
         * @return
         */
        public static JSONObject doPost(String url, String params) {
            CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
            HttpPost httpPost = new HttpPost(url);
            CloseableHttpResponse response = null;
            String out = null;
            JSONObject jsonObject = null;//接收结果
            try {
                httpPost.setConfig(requestConfig);
                StringEntity stringEntity = new StringEntity(params, "UTF-8");
                stringEntity.setContentEncoding("UTF-8");
                stringEntity.setContentType("application/json");
                httpPost.setEntity(stringEntity);
    
                response = httpclient.execute(httpPost);
                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode != HttpStatus.SC_OK) {
                    System.out.println(EntityUtils.toString(response.getEntity(), "utf-8") + "url: " +url + "params: " + params); //打印错误信息
                    return null;
                }
                out = EntityUtils.toString(response.getEntity(), "utf-8");
                jsonObject = JSONObject.parseObject(out);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (httpPost != null) {
                    httpPost.releaseConnection();
                }
            }
            return jsonObject;
        }
    
        /**
         * 创建SSL安全连接
         *
         * @return
         */
        private static SSLConnectionSocketFactory createSSLConnSocketFactory() {
            SSLConnectionSocketFactory sslsf = null;
            try {
                SSLContext ctx = SSLContext.getInstance("SSL");
                X509TrustManager tm = new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(X509Certificate[] chain,
                                                   String authType) throws CertificateException {
                    }
    
                    @Override
                    public void checkServerTrusted(X509Certificate[] chain,
                                                   String authType) throws CertificateException {
                    }
    
                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                };
                ctx.init(null, new TrustManager[]{tm}, null);
                sslsf = new SSLConnectionSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            } catch (GeneralSecurityException e) {
                e.printStackTrace();
            }
            return sslsf;
        }
    }

    这样一来,访问HTTPS就不抛 javax.net.ssl.SSLHandshakeException异常了。

  • 相关阅读:
    tailf,tail -f,tail -F区别
    Java多线程知识总结(一)
    MyBatis使用总结
    mina学习总结
    好书推荐
    Hessian总结
    Spring总结
    SpringMVC总结
    判断两个IP是否处于同一子网(网段)
    Delphi Json之树遍历
  • 原文地址:https://www.cnblogs.com/hooly/p/9849754.html
Copyright © 2011-2022 走看看