问题解决
问题描述
首先,服务器上跑着一个接口工程,环境是jdk8,为https请求(证书认证,但这里绕过了证书);客户端通过https调用接口,环境是jdk7,请求时报如下错:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
问题分析
这个问题出现的原因是因为开发时,我客户端用的jdk8测试,没有出现问题,然后客户那是jdk7,所以出现了这个问题,这是由于客户端与服务器所使用的SSL/TLS版本不一致。服务器使用的TLS版本高,而客户端支持的TLS版本低。Java 8默认支持TLSv1.2版本。
解决过程
这里有两种解决办法
- 客户端升级为jdk8(让客户改不怎么现实,这种方法先pass)
- 构造证书new SSLConnectionSocketFactory对象时加上两个属性
这里说下第二种解决方法,下面 SSLConnectionSocketFactory 上的注释
get请求
/**
* get请求
* @param url
* @param timeout 超时时间(毫秒)
* @param user
* @param code
* @return
*/
public static String doGet(String url, int timeout, String user, String code) {
try {
CloseableHttpClient client = null;
/* 相信自己的CA和所有自签名的证书 */
SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(new TrustSelfSignedStrategy()).build();
/* 不做证书校验 */
sslcontext.init(null, new TrustManager[] {
truseAllManager }, null);
/* 添加两个属性 new String[]{"TLSv1.2"} 和 null */
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext