背景
HttpClient
远程调用HTTPS
的API
时,报错java.net.SocketException:Connection reset
原因
Jdk
版本差异导致的异常。由于Jdk1.7
默认的是TLS
的协议版本是v1.0
,而Jdk1.8
协议版本是v1.2
,所以出现了这种异常。
根本原因及解决方法
通过HttpClient
调用HTTPS
的API
,调用方是Jdk1.7
时,通过了Nginx
代理,代理的工程是Jdk1.8
,如果Nginx
禁用了tlsv1
,那么调用方会出现java.net.SocketException:Connection reset
异常。
Nginx
配置:ssl_protocols
启用了tslv1
的协议,如果不加tslv1
,表示禁用该协议
server {
listen 443 ssl;
server_name xxx.xxx.com;
root /nginx;
access_log /nginx/api_access.log main;
limit_conn perip 100;
limit_req zone=rateip burst=100 nodelay;
# deny 禁用的ip;
# ssl on;
ssl_certificate /nginx/conf/xxx.crt;
ssl_certificate_key /nginx/conf/xxx.key;
# 配置的协议
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_session_cache shared:SSL:1m;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
}
初始化SSLContext
的协议:SSL、TLS、TLSv1.2
// 报java.net.SocketException:Connection reset
SSLContext sslContext = SSLContext.getInstance("SSL");
// 报java.net.SocketException:Connection reset
SSLContext sslContext = SSLContext.getInstance("TLS");
// 使用TLSv1.2版本协议,避免nginx禁用TLSv1协议导致异常
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
java.net.SocketException:Connection reset异常
出现此异常不一定是我说的这种情况引起的