【问题标题】:JDBC can't connect to SQL Server / Azure SQL DatabaseJDBC 无法连接到 SQL Server/Azure SQL 数据库
【发布时间】:2021-05-12 02:38:12
【问题描述】:

我用

  • JTDS 版本:jtds-1.3.1
  • MS SQL JDBC 版本:mssql-jdbc-8.4.0.jre8 甚至 mssql-jdbc-9.2.0.jre8
  • Java 8 更新 251

为简单起见,代码如下:

Android studio can't connect to database in Azure sql server

我无法连接到 SQL Server 或 Azure SQL。

我想用这个语法连接:

val connectionString = "jdbc:jtds:sqlserver://192.168.xx.xx:1433;databaseName=myData;user=x1;password=p1;encrypt=true;trustServerCertificate=true;"

使用此 JTDS 连接字符串,我可以连接到本地主机上的 SQL Server DB,但使用 MS-JDBC,我无法连接。

val connectionString = "jdbc:sqlserver://192.168.xx.xx:1433;databaseName=myData;user=x1;password=p1;encrypt=true;trustServerCertificate=true;"

我收到以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException:驱动程序无法 使用安全套接字建立与 SQL Server 的安全连接 层 (SSL) 加密。错误:“套接字已关闭”。客户端连接 ID: xxxxxxxxxxxxxxxxx

当我使用以下命令将 JTDS 版本连接到 SQL Azure 时,发生了一件有趣的事情:

jdbc:jtds:sqlserver://xxxxx.database.windows.net:1433;database=xxxxx;user=username;password=password;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;

我无法连接到 SQL Azure 并出现以下错误

java.sql.SQLException:原因:由于客户端 TLS 版本导致登录失败 低于服务器允许的最小 TLS 版本

我已经试过了:

  1. SSLProtocol=TLSv1.2(TLS、TLSv1.0、TLSv1.1)=> 无效
  2. ssl=要求

是 JTDS 的错误,JDBC 的错误,还是我的连接字符串无效?我可以使用我的 dotnet 应用程序 (C#) 连接到 SQL Azure。

【问题讨论】:

  • docs.microsoft.com/en-us/azure/azure-sql/managed-instance/… 可以尝试在 azure 上更改 TLS 版本吗?
  • 已经在 SQL Azure 上使用 TLS 1.2 版本。另一个实例使用 TLS 1.0,但 NONE WORKS
  • 我可以使用相同的连接字符串连接到 sql azure,但不要单击最低 TLS 版本。如果您已经更改了最低 TLS 版本(1.0、1.1 或 1.2)并且连接将失败。希望这对某人有所帮助。
  • @ChandraArifin 不清楚您的意思,您的意思是您可以使用 jTDS 连接到 SQL Azure 吗?需要做哪些改变?谢谢。
  • 是的,我可以使用 jTDS 连接到 SQL Azure。没有什么变化。只需确保第一次创建 SQL Azure 时,不要选择 TLS 版本,顺其自然。如果您已经选择了 TLS 之一,那么您将无法连接到 jTDS,因为它已经被加密了。

标签: java ssl jdbc mssql-jdbc jtds


【解决方案1】:

我刚刚使用下面的 PowerShell 脚本在 Azure 托管实例中解决了这个问题:

Set-AzSqlInstance -Name 'InstanceName' -ResourceGroupName 'ResourceGroupName' -MinimalTlsVersion "None" -force

【讨论】: