java HttpClient使用SSL报错connection reset

http连接和https连接不同.所以要分开处理,http就不说了。
1、先查看服务器https的版本号

2、自定义能为https服务的HttpClient

//构造能进行https通讯,httpClient对象
public static CloseableHttpClient createSSLClient(){
	
		SSLContext sslContext=null;
		try{
//这个TLSV1.2必须是和服务器匹配的版本号(一定要匹配)			                 
		    sslContext=SSLContext.getInstance("TLSV1.2");
            HttpsTrustManager hm=new HttpsTrustManager();//自定义的信任管理器
		    sslContext.init(null,new X509TrustManager[]{hm}, new SecureRandom());
			SSLConnectionSocketFactory factory=new SSLConnectionSocketFactory(sslContext,
					SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);		
			return HttpClients.custom().setSSLSocketFactory(factory).build();
		}catch(Exception e){
			return null;
		}	

}
/*HttpPost如何使用SSL ?
 * https://blog.csdn.net/defonds/article/details/86594441
 * 除了信任所有客户端之外什么也不做。它只是简单的实现了 X509TrustManager 并自动生成了所有的方法。
 * */
class HttpsTrustManager implements X509TrustManager{

	@Override
	public void checkClientTrusted(X509Certificate[] arg0, String arg1)
			throws CertificateException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void checkServerTrusted(X509Certificate[] arg0, String arg1)
			throws CertificateException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public X509Certificate[] getAcceptedIssuers() {
		// TODO Auto-generated method stub
		return new X509Certificate[]{};
	}
	
}	

   

//根据网址实例化HttpClient,http和https是分开的
	CloseableHttpClient httpClient =url.startsWith("https")?createSSLClient(): HttpClients.createDefault();

这里要感谢另外2个帖子提供的帮助

 

 

https://blog.csdn.net/m0_37825799/article/details/95367343

 

https://blog.csdn.net/defonds/article/details/86594441

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个误通常是由于SSL/TLS握手过程出现问题导致的。以下是一些可能导致此问题的原因和解决方法: 1. 证书问题:服务器使用了自签名证书或过期的证书。此时需要在代码中设置忽略证书验证或者将证书添加到本地信任列表中。 2. 协议版本问题:客户端和服务器之间的TLS协议版本不匹配。此时需要检查代码中指定的TLS版本是否与服务器支持的版本一致。 3. 代理问题:如果使用代理服务器,可能会导致SSL/TLS握手失败。此时需要检查代理服务器的设置是否正确,并确保代理服务器支持HTTPS连接。 4. 网络问题:SSL/TLS握手需要建立安全连接,如果网络连接不稳定或者中断,可能会导致握手失败。此时需要检查网络连接是否正常,并尝试重新连接。 你可以在代码中添加以下语句来忽略证书验证,检查一下是否有帮助: ```java SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); ``` 如果以上方法不能解决问题,你可以尝试使用Wireshark等工具对网络流量进行抓包分析,查看握手过程中是否有异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值