http请求出现以下异常: Caused by: javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify at sun.security.ssl.Alert.createSSLException(Alert.java:133) at sun.security.ssl.Alert.createSSLException(Alert.java:117) at sun.security.ssl.TransportContext.fatal(TransportContext.java:340) at sun.security.ssl.TransportContext.fatal(TransportContext.java:296) at sun.security.ssl.TransportContext.fatal(TransportContext.java:287) at sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:737) at sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:716) at org.apache.http.impl.BHttpConnectionBase.close(BHttpConnectionBase.java:325) at org.apache.http.impl.conn.LoggingManagedHttpClientConnection.close(LoggingManagedHttpClientConnection.java:81) at org.apache.http.impl.conn.CPoolEntry.closeConnection(CPoolEntry.java:70) at org.apache.http.impl.conn.CPoolProxy.close(CPoolProxy.java:86) at org.apache.http.impl.execchain.ConnectionHolder.releaseConnection(ConnectionHolder.java:103) at org.apache.http.impl.execchain.ConnectionHolder.close(ConnectionHolder.java:156) at org.apache.http.impl.execchain.HttpResponseProxy.close(HttpResponseProxy.java:62) at com.azalea.common.utils.HttpUtils.doPost(HttpUtils.java:188) at com.azalea.common.utils.HttpUtils.postStream(HttpUtils.java:153)
这该死的请求。。。。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
遇到这个异常,通常意味着在进行HTTPS通信时,SSL连接在没有正确完成握手关闭流程(即没有收到对方的close_notify
消息)就被提前关闭了。这可能是由于网络不稳定、服务器端主动断开连接或客户端、服务端任何一方的SSL实现问题导致的。以下是一些建议来解决这个问题:
更新依赖库:确保你使用的HTTP客户端库(如Apache HttpClient)和JDK是最新的版本。有时候,这些问题是由于旧版本库中的bug引起的,新版本可能已经修复了这些问题。
调整超时设置:增加连接和读取超时时间,以应对网络不稳定的情况。在Apache HttpClient中,你可以通过RequestConfig
来设置这些值。
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(5000) // 连接超时时间,单位毫秒
.setSocketTimeout(30000) // 读取超时时间,单位毫秒
.build();
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(config)
.build();
忽略SSL错误测试:仅在调试阶段使用,不建议生产环境忽略SSL验证,因为这会降低安全性。可以通过自定义SSLContext
和HostnameVerifier
来忽略SSL证书验证错误。
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {}
public void checkServerTrusted(X509Certificate[] certs, String authType) {}
}
};
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
HttpClientBuilder builder = HttpClients.custom()
.setSSLContext(sslContext)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE);
检查服务器配置:如果问题持续存在,可能需要与服务器管理员沟通,查看服务器日志,确认是否有服务器端主动断开连接的行为或者SSL配置问题。
使用网络抓包工具:利用Wireshark或Fiddler等工具抓取请求的网络包,分析SSL握手过程,看是否能发现具体哪里出了问题。
考虑重试逻辑:在客户端代码中加入合理的重试机制,对于一些临时性的网络或服务器问题,重试可能会解决问题。
请根据具体情况尝试上述建议,并优先考虑那些不会牺牲安全性的解决方案。