关闭数据库连接资源时候出现了closing inbound before receiving peer's close_notify异常,解决方案

本文详细解析了在 Java 应用中遇到的 javax.net.ssl.SSLException 异常,特别是 'closing inbound before receiving peer's close_notify' 错误。通过调整 MySQL 数据库连接 URL 的配置,将 useSSL 参数设置为 false,成功解决了 SSL 握手失败的问题。

出现关闭异常信息


** BEGIN NESTED EXCEPTION ** 

javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify

STACKTRACE:

javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
	at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:133)
	at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:311)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:267)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:258)
	at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:801)
	at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:780)
	at com.mysql.cj.protocol.a.NativeProtocol.quit(NativeProtocol.java:1284)
	at com.mysql.cj.NativeSession.quit(NativeSession.java:182)
	at com.mysql.cj.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:1911)
	at com.mysql.cj.jdbc.ConnectionImpl.close(ConnectionImpl.java:730)
	at com.test1.Main2.testInsert(Main2.java:76)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)


** END NESTED EXCEPTION **

修改一下链接的url配置信息加上useSSL=false
url=jdbc:mysql://192.168.0.148:3306/test1?useSSL=false
在这里插入图片描述

<think>好的,我现在需要帮助用户解决他们遇到的javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify异常。首先,我要回顾用户提供的引用内容,看看有哪些解决方案已经被提到过。根据引用[3]、[4]和[5],主要解决方案是禁用SSL连接,通过在数据库连接URL中添加useSSL=false参数。此外,引用[5]还提到可以在MySQL服务器配置文件中禁用SSL,但用户可能更倾向于客户端配置,因为修改服务器配置可能需要更高权限。 接下来,我需要确认这个异常的根本原因。用户提到的错误通常发生在SSL/TLS连接未正确关闭,可能是由于客户端或服务器端提前关闭连接,而没有完成正确的关闭握手。对于使用MySQL JDBC驱动的情况,高版本驱动默认启用了SSL,但可能服务器并未正确配置SSL,导致连接问题。因此,禁用SSL可能是一个直接的解决办法。 另外,我需要考虑是否有其他可能的原因,比如网络问题或中间件干扰,但根据提供的引用,主要问题集中在SSL配置上。用户可能需要检查他们的连接字符串是否正确,特别是是否在URL中正确添加了useSSL=false参数,并且没有拼写错误。同区设置(如serverTimezone=GMT%2B8)是否正确也可能影响连接,但引用中主要强调SSL设置。 用户可能还想知道如何在不完全禁用SSL的情况下解决此问题,比如正确配置SSL证书。但根据引用内容,大部分解决方案都是通过禁用SSL来解决问题,因为配置SSL可能需要更多步骤,如生成和配置证书,这对于一些用户来说可能比较复杂。因此,在回答中需要提到两种可能性:快速解决方法(禁用SSL)和更安全的长期解决方案(正确配置SSL)。 此外,用户可能需要确认他们的MySQL服务器版本和JDBC驱动版本是否兼容。高版本的驱动可能默认启用SSL,而旧版服务器可能不支持,或者配置不当。因此,建议用户检查驱动版本,并在必要降级或调整配置。 最后,需要确保回答结构清晰,分步骤说明解决方案,并给出示例,帮助用户快速应用。同,生成的相关问题需要围绕可能的延伸疑问,如SSL配置、驱动版本影响、其他相关异常等。</think>### javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify 解决方案 #### 异常原因分析 此异常通常发生在SSL/TLS连接未按协议规范关闭,常见于以下场景: 1. **MySQL JDBC连接默认启用SSL**:高版本MySQL驱动(≥8.0.13)默认开启SSL验证[^3],但服务端未正确配置SSL证书; 2. **连接提前终止**:客户端或服务端在SSL关闭握手完成前强行断开连接; 3. **网络干扰**:中间代理或防火墙异常终止加密连接。 --- #### 分步解决方案 ##### 方法1:禁用SSL验证(快速解决) **适用场景**:测试环境或无需SSL加密的内部网络。 1. 修改数据库连接URL,添加`useSSL=false`参数: ```java jdbc:mysql://localhost:3306/db_name?useSSL=false&serverTimezone=GMT%2B8 ``` - **关键参数**:`useSSL=false`明确关闭SSL验证[^3][^4]; - **注意区**:`serverTimezone`需与数据库区一致(如`GMT+8`)。 2. **Maven/Gradle依赖检查**: ```xml <!-- MySQL驱动版本建议≥5.1.48 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> ``` ##### 方法2:服务端禁用SSL(需权限) **适用场景**:需全局关闭SSL验证。 1. 修改MySQL配置文件(如`my.ini`或`mysqld.cnf`): ```ini [mysqld] skip_ssl # 禁用SSL模块 ``` 2. 重启MySQL服务: ```bash systemctl restart mysql # Linux ``` ##### 方法3:正确配置SSL(安全方案) **适用场景**:生产环境需加密通信。 1. 生成有效SSL证书并配置MySQL服务端[^5]; 2. 客户端连接URL启用SSL并指定证书: ```java jdbc:mysql://host:3306/db?useSSL=true&requireSSL=true&verifyServerCertificate=true ``` --- #### 验证步骤 1. **连接测试**:使用`useSSL=false`后运行应用,观察是否抛出异常; 2. **日志检查**:查看MySQL服务端日志,确认SSL状态: ```sql SHOW VARIABLES LIKE '%ssl%'; -- 结果中have_ssl应为DISABLED(方法1/2生效) ``` --- #### 扩展注意事项 1. **驱动兼容性**:JDBC 8.x驱动需匹配MySQL 8.x服务端,否则降级至5.x驱动; 2. **性能影响**:启用SSL会增加连接建立间,但提升数据传输安全性; 3. **其他异常关联**:若出现`SSLHandshakeException`,需检查证书链完整性。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值