java用HttpURLConnection发起HTTPS请求并跳过SSL证书,解决:unable to find valid certification path to requested targ

java用HttpURLConnection发起HTTPS请求并跳过SSL证书

问题出现:unable to find valid certification path to requested target

在这里插入图片描述
解决办法:

复制 复制 复制 下面方法

  • 重点关注方法,任何类都可以Copy过去,两个东西是忽略本类的所有SSL
    在这里插入图片描述
注意点

在这里插入图片描述

代码块如下:

public class HttpsUtils {
    private static final Logger log = LoggerFactory.getLogger(HttpsUtils.class);

    //调用该类直接跳过ssl证书 TODO
    static {
        try {
            trustAllHttpsCertificates();
            HttpsURLConnection.setDefaultHostnameVerifier
                    (
                            (urlHostName, session) -> true
                    );
        } catch (Exception e) {
        }
    }

    /**
     * 向指定 URL 发送POST方法的请求
     *
     * @param url   发送请求的 URL
     * @param param 请求参数
     * @return 所代表远程资源的响应结果
     */
    public static Map<String, Object> sendPostWithStatus(String url, String param) {
        Map<String, Object> map = new HashMap<>();
        PrintWriter out = null;
        String status = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
        try {
            String urlNameString = url;
            log.info("sendPost - {}", urlNameString);
            URL realUrl = new URL(urlNameString);

            // 打开连接
            HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
            // 默认是 GET方式
            conn.setRequestMethod("POST");
            // 设置是否向connection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // Post 请求不能使用缓存
            conn.setUseCaches(false);
            conn.setInstanceFollowRedirects(true);
            // 配置本次连接的Content-type,参数类型为json
            conn.setRequestProperty("Content-Type", "application/json");
            // 通用请求头信息
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Accept-Charset", "utf-8");
            conn.setRequestProperty("contentType", "utf-8");

            out = new PrintWriter(conn.getOutputStream());
            //请求参数
            out.print(param);
            out.flush();
            //获取响应的状态码 请求成功为200
            status = new Integer(((HttpURLConnection) conn).getResponseCode()).toString();
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
            String line;
            //获取响应内容
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            log.info("recv - {}", result);
        } catch (ConnectException e) {
            log.error("调用HttpUtils.sendPostWithStatus ConnectException, url=" + url + ",param=" + param, e);
        } catch (SocketTimeoutException e) {
            log.error("调用HttpUtils.sendPostWithStatus SocketTimeoutException, url=" + url + ",param=" + param, e);
        } catch (IOException e) {
            log.error("调用HttpUtils.sendPostWithStatus IOException, url=" + url + ",param=" + param, e);
        } catch (Exception e) {
            log.error("调用HttpsUtil.sendPostWithStatus Exception, url=" + url + ",param=" + param, e);
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
            }
        }
        map.put("status", status);
        map.put("result", result);
        return map;
    }

    /**
     * 跳过ssl证书
     *
     * @throws NoSuchAlgorithmException
     * @throws KeyManagementException
     */
    private static void trustAllHttpsCertificates() 
            throws NoSuchAlgorithmException, KeyManagementException {
        TrustManager[] trustAllCerts = new TrustManager[1];
        trustAllCerts[0] = (TrustManager) new TrustAllManager();
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }

    private static class TrustAllManager implements X509TrustManager {
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkServerTrusted(X509Certificate[] certs, String authType) {
        }
        public void checkClientTrusted(X509Certificate[] certs, String authType) {
        }
    }
}

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于 "unable to find valid certification path to requested target" 错误,通常是由于请求的目标服务器使用了自签名或无效的证书,导致 Java 无法验证证书的合法性。 解决此问题的一种方法是将目标服务器的证书添加到 Java 信任库中。您可以按照以下步骤进行操作: 1. 打开命令提示符或终端窗口。 2. 使用以下命令导航到 Java 安装目录下的 "bin" 文件夹: ``` cd <Java_Installation_Directory>\bin ``` 3. 使用以下命令运行 "keytool" 工具来导出目标服务器的证书: ``` keytool -export -alias <alias> -keystore <keystore_file> -file <output_file> ``` 其中,`<alias>` 是证书别名,`<keystore_file>` 是信任库文件路径,`<output_file>` 是导出的证书文件路径。您可以根据实际情况进行替换。 4. 根据您的操作系统和 Java 版本,将目标服务器的证书导入到 Java 信任库中。以下是几个常见的命令示例: - 对于 Windows: ``` keytool -import -v -trustcacerts -alias <alias> -file <certificate_file> -keystore "%JAVA_HOME%\lib\security\cacerts" ``` 其中,`<alias>` 是证书别名,`<certificate_file>` 是之前导出的证书文件路径。请确保在命令中使用正确的 Java 安装路径。 - 对于 macOS 和 Linux: ``` keytool -import -v -trustcacerts -alias <alias> -file <certificate_file> -keystore $JAVA_HOME/lib/security/cacerts ``` 同样地,`<alias>` 是证书别名,`<certificate_file>` 是之前导出的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值