参考:https://blog.csdn.net/orichisonic/article/details/79951460 (https实现)
https://www.cnblogs.com/boycelee/p/6425325.html (https详解)
(SSH详解)
HTTPS:与SSL(安全套接层)组合使用的HTTP被称为HTTPS(超文本传输安全协议)
加密处理防止窃听:通信加密。HTTP协议与SSL组合使用,加密HTTP的通信内容。用SSL建立安全通信线路之后,就可以在这条线路通信了。
HTTP+加密+认证+完整性保护 = HTTPS
在使用http协议时,HTTP直接与TCP通信,当使用SSL时,则需要先与SSL通信,然后再有SSL和TCP通信
SSL是对计算机之间整个会话进行加密的协议。在SSL中,采用了公开密钥和私有密钥两种加密方法。
下面开始讲解https的小例子:
https其实是安全套接层SSL和http组合的,需要SSL证书,SSL证书可以通过CA机构申请得到,也可以本地自己生成(不安全),本次就自己在本地生成SSL证书,以访问https://www.alipay.com/为例子
1、浏览器(以chrome为例)访问https://www.alipay.com/,点击域名左侧的小锁,可以查看支付宝的证书信息,将支付包的证书信息导出,证书格式有很多中,der、cer等。随便选择即可。
2、命令行或者shell执行 keytool -import -alias "my alipay cert" -file www.alipay.com.cert -keystore my.store,
如果keytool命令不识别,去检查一下jdk的环境变量是否设置正确。”my alipay cert”是个别名,随便取。“www.alipay.com.cert”这个文件就是从浏览器中导出的支付宝的证书。“my.store”是生成的自己 的证书库文件。回车执行,效果如下:
接下来就是代码了,代码如下:
trustStore.load(instream, "123456".toCharArray()); 这个“123456”是秘钥库口令,你生成my.store自己设的口令。
用到的jar包有:commons-logging.jar
fastjson-1.2.58.jar JSONObject等用到
httpclient-4.5.9.jar org.apache.http.impl.client.*用到
httpcore-4.4.11.jar org.apache.http.client.* 用到
public class HttpsClient {
public final static void main(String[] args) throws Exception {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
//加载证书文件
FileInputStream instream = new FileInputStream(new File("F:\\ideaWork\\HttpUtil\\src\\my.store"));
try {
// trustStore.load(instream, "mypassword".toCharArray());
trustStore.load(instream, "123456".toCharArray());
} finally {
instream.close();
}
SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
try
{
//访问支付宝
HttpGet httpget = new HttpGet("https://www.alipay.com/");
System.out.println("executing request" + httpget.getRequestLine());
CloseableHttpResponse response = httpclient.execute(httpget);
try {
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println(EntityUtils.toString(entity));
}
} finally {
response.close();
}
} finally {
httpclient.close();
}
}
}