java.net.SocketException:Connection reset

mac2025-08-04  3

背景


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异常


出现此异常不一定是我说的这种情况引起的

最新回复(0)