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;
}
};
}
2
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 (());
}
};
}