文章目录
SSLSocketFactory 描述
TrustManagers :信任管理组 一般使用 X509证书信任管理器
Protocol: 协议:参考
SSLSocketFactoryBuilder
内部参数SecureRandom:安全随机数,可以根据自定义生成的规则匹配
KeyManager:通过载入证书的方式来实现附带证书请求
TrustManager:信任证书管理器,用于管理证书内容(可以用于避开校验证书问题)
应对SSLHandshakeException
主要是针对Https网站时会校验证书,一般无强制必要,可以进行忽略处理。主要是对X509证书管理器的操作
针对X509证书操作:
针对返回证书的时候,返回为空即可认为忽略处理
X509TrustManager X0509TM = new X509TrustManager() {
@Override // 检查客户端证书
public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {}
@Override // 检查服务端端证书
public void checkServerTrusted(X509Certificate[] chain,String authType) throws CertificateException {}
@Override //返回受信任的X509证书数组
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
Hutool-http:
主要是针对HttpRequest的
SSLSocketFactory
设置
1、SSLSocketFactory构造
//X0509TM 为上述参数
SSLSocketFactory build = SSLSocketFactoryBuilder.create()
.setTrustManagers(X0509TM) //设置信任证书
.setProtocol(SSLSocketFactoryBuilder.SSLv3)//设置协议,其实经测试写不写都可以
.build();
2、设置入hutool工具类内
//url 为自定义请求
String responseText = HttpRequest.post(url)
.setSSLSocketFactory(build)
.execute().body();
HttpClient:
整体而言,我们需要如下几步:
1、创建一个 连接池Pool
2、分析为什么https会出现异常
3、分析PoolingHttpClientConnectionManager
1、SSLContent配置(生成SSLFactory)
扩展Socket并提供使用SSL或TLS协议的安全套接字
说白了是
SSLSocketFactory
也是产物之一,可以参考其 getDefault()方法
public static SSLContext getSSLContext() {
SSLContext sslContext = null;
try {
//这里仅仅为了示例,使用了TLSv1.2
sslContext = SSLContext.getInstance("TLSv1.2");
// 忽略https校验 主要上述参数 X0509TM
// 这里可以填入的参数 KeyManager[]、TrustManager[]、SecureRandom
sslContext.init(null, X0509TM, null);
} catch (Exception e) {
//通常为初始化失败,原因参考
e.printStackTrace();
}
return sslContext;
}
2、主要针对HttpClient的构造(解决方案)
HttpClient协议获取
// 其中 getSSLContext()为上述方法
public static CloseableHttpClient getCloseableHttpsClients() {
// 采用绕过验证的方式处理https请求
SSLContext sslcontext = getSSLContext();
// 设置协议http和https对应的处理socket链接工厂的对象
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", new SSLConnectionSocketFactory(sslcontext)).build();
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
HttpClients.custom().setConnectionManager(connManager);
// 创建自定义的httpsclient对象
CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
return client;
}
3、针对HttpClient连接池的描述
/**
*step1
**/
进入 PoolingHttpClientConnectionManager.class
/**
*step2
*可以显而易见发现初始化方法:getDefaultRegistry
*主要由如下方法构成:
**/
RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSocketFactory())
.build();
//step3:
/**
*http并未引发标题问题,我们主要考虑https则,进入SSLConnectionSocketFactory.getSocketFactory()
* 又回到了SSLSocketFactory的这个套接字类
**/
//虽然有5个实现类,但我就涉及使用的两个,如下:
//1、创建和初始化普通(未加密)套接字的默认工厂类,仅仅简单连接socket,应对http即可
PlainConnectionSocketFactory
//2、附带套接字加密与主机名称校验,我们需要修改的就是这个部分
SSLConnectionSocketFactory
//step4:
/**
*进入SSLConnectionSocketFactory,我们可以通过默认构造类来获取到两个信息
* 1、创建默认的SSLContext --> SSLContexts.createDefault()
* 点进去我们可以发现 sslContext.init这个方法
* 延伸:engineInit 可以基本确定为 SSLContextImpl实现类
* 我们需要找什么呢,就是要往下挖:unable to find valid certification path to requested target
**/
/**
*step5:
* 排查分析
**/
//排除部分1:
//方法中这部分可以main测试,基本可以排除
TrustManagerFactory var4 = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
var4.init((KeyStore)null);
var2 = var4.getTrustManagers();
//剩余部分2:
//由方法中得出,其实也不是在这个部分
this.trustManager = this.chooseTrustManager(var2);
/**
*step6:
* 运行时出错,其实也是的,主要是在工厂类开始建立连接的时候。
* 上面主要是证明不是在配置时出错,同时也说明了配置的地方
**/
SSLSocketFactory 创建连接时 startHandshake() 内部调用访问https连接时,会根据证书进行调用验证。通常会从java环境中根据keytool读取证书,若我们么有配置,则会出现以上异常。通常不是很强要求下,我们直接采取 上述 2中的方法忽略即可,否则继续往获取相关答案:
https://www.cnblogs.com/fron/p/https-20170111.html
关于自建证书与证书方面,我找到我看到的一个比较好的文章:https://blog.csdn.net/do_bset_yourself/article/details/78159697 属于都市桃源17年的文章。