背景
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異常
出現此異常不一定是我說的這種情況引起的