java.net.SocketException:Connection reset

背景


HttpClient遠程調用HTTPSAPI時,報錯java.net.SocketException:Connection reset


原因


Jdk版本差異導致的異常。由於Jdk1.7默認的是TLS的協議版本是v1.0,而Jdk1.8協議版本是v1.2,所以出現了這種異常。


根本原因及解決方法


通過HttpClient調用HTTPSAPI,調用方是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異常


出現此異常不一定是我說的這種情況引起的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章