在nputStream = conn.getInputStream();当中,https的连接报javax.net.ssl.SSLException: SSL peer shut down incorrectly,而http的连接不报这个错误,是为什么
时间: 2024-12-09 17:29:15 浏览: 11
当你在HTTPS连接(使用SSL/TLS协议)时,如果遇到`javax.net.ssl.SSLException: SSL peer shut down incorrectly`错误,这通常表示客户端和服务器之间的通信在尝试完成握手过程时出现了问题。在Java中,特别是使用JDK 1.8及以上版本,默认启用的是TLS 1.2或更高级别的安全套接层协议。如果你的服务器不支持这些较高的版本,或者存在兼容性问题,就可能导致握手失败,因为服务器发送了一个不符合预期的消息。
相比之下,HTTP连接通常是明文传输,没有加密层,所以不会涉及SSL/TLS握手,因此不会遇到这个问题。当试图从HTTPS连接读取输入流时,如果握手失败,就会抛出此异常。
要解决这个问题,你可以尝试以下几种方法:
1. **确认服务器支持**:检查服务器是否支持你的JDK所使用的TLS版本,可能需要升级服务器的SSL配置或让其兼容更低版本的协议。
2. **降低JDK的TLS要求**:使用`SSLSocketFactory`或`SSLContext`设置允许的最低SSL/TLS版本,但请注意这会增加网络安全性风险。
3. **使用合适的中间件**:有时,可以借助SSL/TLS代理或适配器来桥接低版本的客户端与高安全性的服务器。
```java
// 创建自定义SSLSocketFactory以限制最小TLS版本
SSLSocketFactory customSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
customSocketFactory.setEnabledProtocols(Collections.singletonList("TLSv1.1")); // 或者 "TLSv1",取决于服务器支持
// 使用定制的工厂创建连接
Socket socket = customSocketFactory.createSocket(host, port);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
```
阅读全文