Kotlin JDBC试图用SSL证书连接mssqlserver,得到错误



我正在尝试使用com.microsoft.sqlserver:mssql-jdbc:12.2.0。jre11驱动程序,建议从kotlin android应用程序直接连接mssql。在我使用JDTS之前,它为我工作,但使用JDBC 12.2.0,我得到了下一个错误

com.microsoft.sqlserver.jdbc.SQLServerException:The driver was unable to establish
a secure connection to SQL Server using SSL encryption. Error: "Socket is closed".

我在构建上的实现。gradle是

implementation "com.microsoft.sqlserver:mssql-jdbc:12.2.0.jre11"

连接字符串

val connectionUrl = "jdbc:sqlserver://192.168.1.56:1433;databaseName=akhasap_db;user=sa;password=123456;encrypt=false;trustServerCertificate=false;loginTimeout=30;"

连接代码

try {
println("Connecting to SQL Server ... $connectionUrl")
DriverManager.getConnection(connectionUrl).use { connection -> println("Done.") }
Snackbar.make(view, "Connected", Snackbar.LENGTH_LONG).setAction("Action", null).show()
} catch (e: Exception) {
Snackbar.make(view, "Can't Connect to DB", Snackbar.LENGTH_LONG).setAction("Action", null).show()
println("DkPrintError:"+e.toString())
e.printStackTrace()
}

在那部手机我使用RemoDb测试连接,它的工作原理。我的意思是,这不是远程sqlserverdb配置的问题。只是我的应用不能连接到mysql服务器。我想连接没有SSL。我该如何解决这个问题?

TLS问题快速检查表

  • SQL Server应该打完整补丁以确保TLS 1.2支持。
  • SQL Server的操作系统应该打完整的补丁。
  • Java运行时应该是最近的…(即不是java6)。
  • 从以下选项中选择一个:
    • 使用"TrustServerCertificate ="true"
    • 在SQL Server上安装受信任证书
  • "加密= true"在连接字符串中是一个安全的赌注,并且可以帮助防止将来出现问题。由于服务器总是可以强制加密,所以"encrypt=false"永远不应该被认为是一个"修复"。

的背景信息SQL Server在客户端连接的两种情况下使用TLS:

  1. 整个连接被加密。这可以是请求的由客户端(encrypt=true;)或强制通过服务器。加密的客户端默认值取决于驱动程序版本。JDBC 10.2或更高版本默认加密。(其他驱动程序,如ODBC, . net等,大约在同一时间改变了默认行为)。

  2. 在登录过程中也使用TLS来保护用户名/密码。这种用法是强制的,不受任何连接字符串设置或服务器配置选项的影响。(即,SQL server将始终使用TLS保护密码)

SQL ServerDOES NOT有一个内部TLS实现。它使用来自操作系统的TLS库(用于windows的SCHANNEL, openssl?linux)。这意味着TLS在SQL Server中的支持可能会受到操作系统版本/补丁以及SQL Server版本/补丁的影响。

Java运行时DOES有一个内部TLS实现。

TLS需要证书进行身份验证。这些是用于https的相同类型的证书。如果您没有在SQL Server上安装证书,它将自动生成一个。此自生成的证书将不受客户端信任。

客户端是否挑剔服务器证书并验证它也依赖于驱动程序版本。Jdbc 10.2引入了一个突破性的更改,并尝试在更多的场景中验证证书。TrustServerCertificate=true告诉驱动程序绕过证书验证。

上面的清单将解决95%的SQL Server TLS问题。如果您仍然遇到问题,则需要确认涉及到两种使用场景中的哪一种。

  • 场景1通常与证书相关,或者可能受到连接字符串更改的影响。
  • 场景2(用户/密码)意味着TLS版本不匹配或操作系统

最新更新