https请求

时间:2025-02-17 12:33:23

1.

package ;

import ;
import ;
import ;
import ;

import ;
import ;
import ;

public class https {
	/*
	 * JSSE中,有一个信任管理器类负责决定是否信任远端的证书,这个类有如下的处理规则:

                 ⑴ 果系统属性指定了TrustStore文件,那么信任管理器就去jre安装路径下的lib/security/目录中寻找并使用这个文件来检查证书。

                   ⑵ 果该系统属性没有指定TrustStore文件,它就会去jre安装路径下寻找默认的TrustStore文件,这个文件的相对路径为:lib/security/jssecacerts。

                    ⑶ 如果 jssecacerts不存在,但是cacerts存在(它随J2SDK一起发行,含有数量有限的可信任的基本证书),那么这个默认的TrustStore文件就是cacerts。
	 * */
	public static void main(String[] args)throws Exception{
		
		
		String httpsURL = "/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=hello&rsv_pq=e78b85e100039612&rsv_t=9027wa6kGzr7FyXSksd0dKeuokX6Pzb4RAYyuvybdfHbpTODz%2BgL433gHYg&rsv_enter=1&rsv_sug3=5&rsv_sug1=4&rsv_sug7=100";
		//信任库地址
		String trustStor="F:\\Java\\jre\\lib\\security\\ccc";
		//设置信任库
		("", trustStor);
		//设置库的密码
		("", "111111");
		URL myurl = new URL(httpsURL);
		
		//在https对ssl的验证处理好后,后面的就和发送http请求类似
		HttpsURLConnection con = (HttpsURLConnection) ();
//		(hv);
		//验证hostname验证器
		(hv);
		
		InputStream ins = ();
		InputStreamReader isr = new InputStreamReader(ins);
		BufferedReader in = new BufferedReader(isr);
		String inputLine=null;
		while ((inputLine = ()) != null) {
			(inputLine);
		}
		(); 
}
	   
	/**
	 * 实现用于主机名验证的基接口。 
	 * 在握手期间,如果 URL 的主机名和服务器的标识主机名不匹配,则验证机制可以回调此接口的实现程序来确定是否应该允许此连接。
	 */
private static HostnameVerifier hv = new HostnameVerifier() {
	   
		public boolean verify(String urlHostName, SSLSession session) {
			// TODO Auto-generated method stub
//			return (());
			("Warning: URL Host: " + urlHostName + " vs. " + ());
			return true;
		}
};
}

package ;

import ;
import ;
import ;
import ;
import ;

import ;
import ;
import ;
import ;
import ;
import ;
import ;

public class SSL {
	public static void main(String[] args) throws Exception
	{
		//请求地址
		String httpsURL = "/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=hello&rsv_pq=e78b85e100039612&rsv_t=9027wa6kGzr7FyXSksd0dKeuokX6Pzb4RAYyuvybdfHbpTODz%2BgL433gHYg&rsv_enter=1&rsv_sug3=5&rsv_sug1=4&rsv_sug7=100";
		//信任库地址
		String trustStor="F:\\Java\\jre\\lib\\security\\ccc";
		//密码 
		String password="111111";
		certTest2(trustStor,password,httpsURL);
	}
	
	public static void certTest2(String certDir, String passwd, String urlStr)
			throws Exception {
		//返回一个封装 SSLContextSpi 实现的新 SSLContext 对象,该实现取自指定的提供者。指定的提供者必须在安全提供者列表中注册。
		SSLContext sslContext = ("SSL", "SunJSSE");
		TrustManager[] tms = getTms(certDir, passwd);
		//初始化SSLContext对象
		(null, tms, new ());
		//通过SSLContext对象获取SSLContext工厂(SSLSocketFactory)
		SSLSocketFactory ssf = ();

		URL url = new URL(urlStr);
		(hv);
		HttpsURLConnection conn = ((HttpsURLConnection) ());
		(ssf);

		InputStreamReader im = new InputStreamReader((),
				"GBK");
		BufferedReader reader = new BufferedReader(im);
		StringBuffer sb = new StringBuffer();
		String line = null;
		while ((line = ()) != null) {
			(line + "\r\n");
		}
		(sb);
	}

	public static TrustManager[] getTms(String dir, String keyPassword)
			throws Exception {
		//  获取默认的 TrustManagerFactory 算法名称
		String talg = ();
		//返回充当信任管理器工厂的 TrustManagerFactory 对象。
		TrustManagerFactory tmFact = (talg);
		//
		FileInputStream tfis = new FileInputStream(dir);
		KeyStore ts = ("jks");
		(tfis, ());
		();
		(ts);
		return ();
	}
	
	/**
	 * 实现用于主机名验证的基接口。 
	 * 在握手期间,如果 URL 的主机名和服务器的标识主机名不匹配,则验证机制可以回调此接口的实现程序来确定是否应该允许此连接。
	 */
	private static HostnameVerifier hv = new HostnameVerifier() {

		public boolean verify(String hostname, SSLSession session) {
			// TODO Auto-generated method stub
			return (());			
		}
	};
}

3

package ;

import ;
import ;
import ;
import .X509Certificate;

import ;
import ;
import ;
import ;
import ;
import ;
import .X509TrustManager;
import ;

public class SSLwithoutCert {
	
	public static void main(String[] args) throws Exception
	{
		//请求地址
		String httpsURL = "/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=hello&rsv_pq=e78b85e100039612&rsv_t=9027wa6kGzr7FyXSksd0dKeuokX6Pzb4RAYyuvybdfHbpTODz%2BgL433gHYg&rsv_enter=1&rsv_sug3=5&rsv_sug1=4&rsv_sug7=100";
		//信任库地址
		String trustStor="F:\\Java\\jre\\lib\\security\\cccC";
		//密码 
		//设置信任库
		("", trustStor);
		//设置库的密码
		("", "111111");
		String password="111111";
		withoutCertTest(httpsURL);
	}
	
	public static void withoutCertTest(String urlStr) throws Exception {
		SSLContext sslContext = ("SSL", "SunJSSE");
		TrustManager[] tms = { ignoreCertificationTrustManger };
		(null, tms, new ());
		SSLSocketFactory ssf = ();

		URL url = new URL(urlStr);
		(hv);
		HttpsURLConnection conn = ((HttpsURLConnection) ());
		(ssf);

		InputStreamReader im = new InputStreamReader((),
				"GBK");
		BufferedReader reader = new BufferedReader(im);
		StringBuffer sb = new StringBuffer();
		String line = null;
		while ((line = ()) != null) {
			(line + "\r\n");
		}
		(sb);
	}

	/*
	 * X509证书信任管理器类的实现及应用

在JSSE中,证书信任管理器类就是实现了接口X509TrustManager的类。我们可以自己实现该接口,让它信任我们指定的证书。

接口X509TrustManager有下述三个公有的方法需要我们实现:

⑴ oid checkClientTrusted(X509Certificate[] chain, String authType) 
   throws CertificateException

该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,因此我们只需要执行默认的信任管理器的这个方法。JSSE中,默认的信任管理器类为TrustManager。

⑵ oid checkServerTrusted(X509Certificate[] chain, String authType) 
   throws CertificateException 

该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书。

⑶ X509Certificate[] getAcceptedIssuers() 

返回受信任的X509证书数组。
	 * */
	private static TrustManager ignoreCertificationTrustManger = new X509TrustManager() {

		private X509Certificate[] certificates;

		public void checkClientTrusted(X509Certificate certificates[],
				String authType) {
			("certificates"+certificates);
			();
			if ( == null) {
				 = certificates;
			}
		}

		public void checkServerTrusted(X509Certificate[] ax509certificate,
				String s) {
			(ax509certificate);
			();
			if ( == null) {
				 = ax509certificate;
			}
		}

		public X509Certificate[] getAcceptedIssuers() {
			return null;
		}
	};
	/**
	 * 实现用于主机名验证的基接口。 
	 * 在握手期间,如果 URL 的主机名和服务器的标识主机名不匹配,则验证机制可以回调此接口的实现程序来确定是否应该允许此连接。
	 */
	private static HostnameVerifier hv = new HostnameVerifier() {

		public boolean verify(String hostname, SSLSession session) {
			// TODO Auto-generated method stub
			return (());			
		}
	};
}