Java后台https调用远程接口取消ssl验证

package com.ruoyi.zncc.utils;
 
import lombok.extern.slf4j.Slf4j;
 
import javax.net.ssl.*;
import java.io.*;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
 
@Slf4j
public class HttpsClient {
    private static final class DefaultTrustMannager implements X509TrustManager {
 
        @Override
        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
 
        }
 
        @Override
        public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
 
        }
 
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    }
 
    public static HttpsURLConnection getHttpsURLConnection(String uri, String method) throws IOException, NoSuchAlgorithmException {
        SSLContext ctx;
//        try {
//            ctx = SSLContext.getInstance("TLS");
//            ctx.init(new KeyManager[0], new TrustManager[] { new DefaultTrustMannager() }, new SecureRandom());
//        } catch (NoSuchAlgorithmException | KeyManagementException e) {
//            throw new RuntimeException(e);
//        }
        try {
            ctx = SSLContext.getInstance("SSL");
            TrustManager[] trustManagers = new TrustManager[1];
            trustManagers[0] = new DefaultTrustMannager();
            ctx.init(null, trustManagers, null);
            HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
        } catch (KeyManagementException e) {
            throw new RuntimeException(e);
        }
 
        SSLSocketFactory ssf = ctx.getSocketFactory();
 
        URL url = new URL(uri);
        HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
        urlConnection.setSSLSocketFactory(ssf);
        urlConnection.setHostnameVerifier((s, sslSession) -> true);
        urlConnection.setRequestMethod(method);
        urlConnection.setDoInput(true);
        urlConnection.setDoOutput(true);
//        urlConnection.setConnectTimeout(10000);
        if (method.equals("POST")) {
            urlConnection.setRequestProperty("Content-Type", "application/json;charset=utf-8");
        }
        return urlConnection;
    }
 
    public static byte[] getBytesFromStream(InputStream is) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] kb = new byte[1024];
        int len;
        while ((len = is.read(kb)) != -1) {
            baos.write(kb, 0, len);
        }
        byte[] bytes = baos.toByteArray();
        baos.close();
        is.close();
        return bytes;
    }
 
    private static void setBytesToStream(OutputStream os, byte[] bytes) throws IOException {
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        byte[] kb = new byte[1024];
        int len;
        while ((len = bais.read(kb)) != -1) {
            os.write(kb, 0, len);
        }
        os.flush();
        os.close();
        bais.close();
    }
 
    private static String doGet(String uri) {
        try {
            log.info("https的get请求链接为" + uri);
            HttpsURLConnection httpsConn = getHttpsURLConnection(uri, "GET");
            return new String(getBytesFromStream(httpsConn.getInputStream()));
        } catch (IOException | NoSuchAlgorithmException e) {
            log.error("https的请求出现异常:", e.getCause());
        }
        return null;
    }
 
    public static String doJsonPost(String uri, String data) {
        try {
            log.info("https的POST请求地址为:" + uri);
            log.info("https的POST请求参数为:" + data);
            HttpsURLConnection httpsConn = getHttpsURLConnection(uri, "POST");
            setBytesToStream(httpsConn.getOutputStream(), data.getBytes("utf-8"));
            String result = new String(getBytesFromStream(httpsConn.getInputStream()));
            log.info("https的POST请求结果为:" + result);
            return result;
        } catch (IOException | NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java调用HTTPS接口并跳过验证,可以通过创建自定义的TrustManager和HostnameVerifier来实现。 以下是一个示例代码: ```java import java.security.SecureRandom; import javax.net.ssl.*; import java.net.URL; import java.io.*; public class HttpsClient { public static void main(String[] args) throws Exception { // 创建SSLContext对象 SSLContext sslContext = SSLContext.getInstance("SSL"); // 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法 X509TrustManager trustManager = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) {} public void checkServerTrusted(X509Certificate[] chain, String authType) {} public X509Certificate[] getAcceptedIssuers() { return null; } }; // 将X509TrustManager组合成TrustManager数组 TrustManager[] trustManagers = new TrustManager[] { trustManager }; // 初始化SSLContext sslContext.init(null, trustManagers, new SecureRandom()); // 获取SSLSocketFactory对象 SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); // 打开URL连接 URL url = new URL("https://example.com"); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); // 设置连接属性 conn.setSSLSocketFactory(sslSocketFactory); conn.setHostnameVerifier(new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }); // 发送请求 InputStream input = conn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); System.out.println(response.toString()); // 关闭连接 conn.disconnect(); } } ``` 在上面的代码中,我们创建了一个自定义的TrustManager,该TrustManager不会执行任何验证操作。在初始化SSLContext时,我们将该TrustManager作为参数传递给init方法,从而实现绕过验证。 同时,我们还创建了一个自定义的HostnameVerifier,该HostnameVerifier始终返回true,从而实现跳过主机名验证。在设置HttpsURLConnection的连接属性时,我们将该HostnameVerifier作为参数传递给setHostnameVerifier方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值