JDBC (JTDS) SQL Server连接在SSL身份验证后关闭

6

我正在使用jTDS JDBC SQLServer库连接到SQL Server 2008数据库。在没有启用SSL的情况下,它总是可以正常工作,但一旦启用了SSL,我就无法连接。我已经跟踪了Java代码,并检查了数据库端的日志,认证是有效的,但在尝试执行查询时立即断开了连接。有人遇到过这个问题吗?

main, received EOFException: ignored
main, called closeInternal(false)
main, SEND TLSv1 ALERT:  warning, description = close_notify
Padded plaintext before ENCRYPTION:  len = 32
0000: 01 00 DF 4A F1 23 CF E7   6B 62 3D 7D 4D CD C9 AD  ...J.#..kb=.M...
0010: 26 7B 16 59 84 9A 09 09   09 09 09 09 09 09 09 09  &..Y............
main, WRITE: TLSv1 Alert, length = 32
[Raw write]: length = 37
0000: 15 03 01 00 20 12 0A 45   80 96 80 F8 04 62 2F 62  .... ..E.....b/b
0010: E0 35 B9 4D 67 B0 4D D7   AC 9C CF C7 57 CA E1 B2  .5.Mg.M.....W...
0020: 9F DC BA 5E F8                                     ...^.
main, called closeSocket(selfInitiated)
main, called close()
main, called closeInternal(true)
java.sql.SQLException: I/O Error: DB server closed connection.
    at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1053)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:465)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeQuery(JtdsStatement.java:1304)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:390)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
    at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
    at java.sql.DriverManager.getConnection(DriverManager.java:579)
    at java.sql.DriverManager.getConnection(DriverManager.java:221)
    at getConnection.main(getConnection.java:25)
Caused by: java.io.IOException: DB server closed connection.
    at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:848)
    at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:727)
    at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:466)
    at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:103)
    at net.sourceforge.jtds.jdbc.ResponseStream.peek(ResponseStream.java:88)
    at net.sourceforge.jtds.jdbc.TdsCore.wait(TdsCore.java:3932)
    at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1046)
2个回答

8

Oracle引入了安全修复程序,用于解决已知会干扰Microsoft JDBC/jTDS连接的SSL/TLS BEAST攻击。

设置-Djsse.enableCBCProtection=false系统变量将禁用修复程序并可能允许连接。

此SO线程中找到的信息:Java7 sqljdbc4 - SQL error 08S01 on getConnection()


我使用的是 jBoss 5.1,搭配 Sql Server 2005 和 jTDS 1.2.5。这个修复方案对我也起了作用!我的问题在于服务器卡在了 getConnection() 上。 - James Drinkard

8
我通过在连接字符串的URL中添加ssl=requestssl=require,成功地解决了相同的基本错误。这样可以尝试或强制要求加密连接。如果SQL Server设置要求加密连接,则ssl=require将强制该连接使用SSL并满足SQL Server。
示例:

jdbc:jtds:sqlserver://[服务器]/[数据库];ssl=require;


1
谢谢 Josh!这对我很有用,省了很多麻烦。干杯! - Greg Cox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接