使用HttpsURLConnection加载证书并发包

package com.bree.proxy.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Socket;
import java.net.URL;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509ExtendedTrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.commons.codec.binary.Base64;
import org.apache.http.conn.ssl.SSLContexts;

import com.bree.proxy.model.ProxyInfo;

public class HttpAndHttpsProxy {

	public static void main(String[] args) {
     try {
		 Method add = sun.security.ec.CurveDB.class.getDeclaredMethod("add", String.class,String.class,
		 int.class, String.class,String.class, String.class,String.class, 
		 String.class,String.class,int.class,Pattern.class);
		 add.setAccessible(true);
		 Pattern localPattern = Pattern.compile(",|\\[|\\]");
		 String p="FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF";
		 String a="FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC";
		 String b="28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93";
		 String n="FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123";
		 String gx="32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7";
		 String gy="BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0";
		 add.invoke(null,"SM2", "1.2.156.10197.1.301", 1, p, a, b, n, gx, gy, 1, localPattern);
	} catch (Exception e) {
		e.printStackTrace();
	}
		String url = "https://fpdk.guangxi.chinatax.gov.cn/login.do?";
		String params = "";
		
		String getResult = HttpAndHttpsProxy.httpsProxy(url, params);
		System.out.println(getResult);
	}

	public static String httpsProxy(String url, String param) {
		HttpsURLConnection httpsConn = null;
		PrintWriter out = null;
		BufferedReader in = null;
		String result = "";
		BufferedReader reader = null;
				
		try {
			URL urlClient = new URL(url);
			System.out.println("请求的URL========:" + urlClient);
			
			KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
			 
            //加载证书文件
 
            FileInputStream instream = new FileInputStream(new File("e://my.store"));
 
            try {
 
                trustStore.load(instream, "123456".toCharArray());
 
            } finally {
 
                instream.close();
 
            }
			SSLContext sc = SSLContexts.custom().loadTrustMaterial(trustStore).build();
			// 指定信任https
			//sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());	
			httpsConn = (HttpsURLConnection) urlClient.openConnection();
									
			// 设置通用的请求属性
			httpsConn.setRequestMethod("POST");  
			httpsConn.setRequestProperty("accept", "*/*");
			httpsConn.setRequestProperty("connection", "Keep-Alive");
			httpsConn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
			httpsConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			
			
			// 发送POST请求必须设置如下两行
			httpsConn.setDoOutput(true);
			httpsConn.setDoInput(true);
						
			httpsConn.setSSLSocketFactory(sc.getSocketFactory());
			httpsConn.setHostnameVerifier(new TrustAnyHostnameVerifier());
			
			String sss = httpsConn.getRequestProperty("Proxy-Authorization");
			Map map = httpsConn.getRequestProperties();
			System.out.println(sss);
			System.out.println(map);
			
			httpsConn.connect();
			
			
			// 获取URLConnection对象对应的输出流
			out = new PrintWriter(httpsConn.getOutputStream());
			// 发送请求参数
			out.print(param);
			//out.write("Proxy-Authorization: Basic cHJveHl0ZXN0OnR5eTIwMTk=");
			// flush输出流的缓冲
			out.flush();
			
			// 定义BufferedReader输入流来读取URL的响应
			in = new BufferedReader(new InputStreamReader(httpsConn.getInputStream()));
			String line;
			while ((line = in.readLine()) != null) {
				result += line;
			}
			// 断开连接
			httpsConn.disconnect();
			System.out.println("====result====" + result);
			System.out.println("返回结果:" + httpsConn.getResponseMessage());

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (reader != null) {
					reader.close();
				}
			} catch (IOException e) {
			}
			try {
				if (in != null) {
					in.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (out != null) {
				out.close();
			}
		}

		return result;
	}

	// 设置请求头属性
			public static Map<String, String> setProperty() {
				HashMap<String, String> pMap = new HashMap<>();
				// pMap.put("Accept-Encoding", "gzip"); //请求定义gzip,响应也是压缩包
				pMap.put("accept", "*/*");
				pMap.put("connection", "Keep-Alive");
				pMap.put("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
				pMap.put("Content-Type", "application/x-www-form-urlencoded");
				return pMap;
			}
	
	public static SSLContext MyX509TrustManagerUtils() {

		TrustManager[] tm = { new HttpAndHttpsProxy().new MyX509TrustManager() };
		SSLContext ctx = null;
		try {
			ctx = SSLContext.getInstance("TLS");
			ctx.init(null, tm, null);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ctx;
	}
	
	/*
	 * HTTPS忽略证书验证,防止高版本jdk因证书算法不符合约束条件,使用继承X509ExtendedTrustManager的方式
	 */
	class MyX509TrustManager extends X509ExtendedTrustManager {

		@Override
		public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
			// TODO Auto-generated method stub

		}

		@Override
		public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
			// TODO Auto-generated method stub

		}

		@Override
		public X509Certificate[] getAcceptedIssuers() {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public void checkClientTrusted(X509Certificate[] arg0, String arg1, Socket arg2) throws CertificateException {
			// TODO Auto-generated method stub

		}

		@Override
		public void checkClientTrusted(X509Certificate[] arg0, String arg1, SSLEngine arg2)
				throws CertificateException {
			// TODO Auto-generated method stub

		}

		@Override
		public void checkServerTrusted(X509Certificate[] arg0, String arg1, Socket arg2) throws CertificateException {
			// TODO Auto-generated method stub

		}

		@Override
		public void checkServerTrusted(X509Certificate[] arg0, String arg1, SSLEngine arg2)
				throws CertificateException {
			// TODO Auto-generated method stub

		}

	}
	
	static class MyAuthenticator extends Authenticator {
	    private String user = "";
	    private String password = "";
	  
	    public MyAuthenticator(String user, String password) {
	      this.user = user;
	      this.password = password;
	    }
	  
	    protected PasswordAuthentication getPasswordAuthentication() {
	      return new PasswordAuthentication(user, password.toCharArray());
	    }
	  }

	private static class TrustAnyTrustManager implements X509TrustManager {

		public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
		}

		public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
		}

		public X509Certificate[] getAcceptedIssuers() {
			return new X509Certificate[] {};
		}
	}

	private static class TrustAnyHostnameVerifier implements HostnameVerifier {
		public boolean verify(String hostname, SSLSession session) {
			return true;
		}
	}

}

如有问题,请私信。

tL+8vMr1vbvB96Osx+vO8NPD09q3x7eo08PNvqGjDQoNCsTmz/LP4LnYv86zzKGiSlOyubu3vrO/zrPMoaJKQVZBz+C52L/Os8zI59Do0qrSsr/J0tTBqs+1UVGhow0KDQrX99XfIFFRIDQwNDU0MDIyOQ==

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中,HttpsURLConnection默认会验证服务器的证书,防止中间人攻击。如果你的HTTPS服务器使用的是自签名证书或者其他不受信任的证书,那么HttpsURLConnection会抛出javax.net.ssl.SSLHandshakeException异常。 如果你想跳过证书校验,可以使用以下代码: ```java import java.net.URL; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; public class HttpsURLConnectionExample { public static void main(String[] args) throws Exception { String url = "https://www.example.com/api"; URL obj = new URL(url); // 创建一个信任管理器,跳过证书校验 TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) {} public void checkServerTrusted(X509Certificate[] chain, String authType) {} public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } }; // 创建一个SSL上下文对象,跳过证书校验 SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); // 创建一个HttpsURLConnection对象,使用上面创建的SSL上下文对象 HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); // 设置请求方法 con.setRequestMethod("GET"); // 打印响应状态码 int responseCode = con.getResponseCode(); System.out.println("Response Code : " + responseCode); // 读取响应内容 BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // 打印响应内容 System.out.println(response.toString()); } } ``` 在上面的示例代码中,我们创建了一个信任管理器,它跳过了证书校验。然后我们创建了一个SSL上下文对象,并使用上面创建的信任管理器初始化它。最后,我们将这个SSL上下文对象设置为默认的SSL套接字工厂,并使用它来创建一个HttpsURLConnection对象。这样我们就可以跳过证书校验,并正常使用HTTPS接口了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liberty888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值