无法从 CentOS 8 服务器使用 MS JDBC 驱动程序连接到 SQL Server 服务器:SSL 错误但不使用安全连接

Pet*_*ren 7 java linux sql-server ssl jdbc

我发现一篇文章与我遇到的问题很接近。就是这个:

Java 8 上的 SQL Server JDBC 错误:驱动程序无法使用安全套接字层 (SSL) 加密建立与 SQL Server 的安全连接

我可以提供整个堆栈跟踪,但修剪后的版本有这一系列错误:

com.microsoft.sqlserver.jdbc.SQLServerException:驱动程序无法使用安全套接字层 (SSL) 加密与 SQL Server 建立安全连接。错误:“java.security.cert.CertificateException:证书不符合算法约束”。客户端连接 ID:e7a5ebc2-d489-4743-85ba-7873926508fe

引起原因:javax.net.ssl.SSLHandshakeException:
java.security.cert.CertificateException:证书不符合算法约束

引起原因:java.security.cert.CertificateException:证书不符合算法约束

原因:java.security.cert.CertPathValidatorException:密钥大小限制的算法约束检查失败。与证书一起使用的 RSA 1024 位密钥:CN=SSL_Self_Signed_Fallback。用法是 tls 服务器

JDBC 连接连接到 SQL Server 2012,该连接未启用连接加密或我所知的任何安全性。我与我们的数据库人员交谈过,他说据他所知,连接上不存在安全性。所以,我不确定为什么 MS 驱动程序继续抱怨 SSL 连接。

此 Linux 服务器 (CentOS 8) 有两个使用 JDBC 连接的 tomcat 安装。我有一个 Tomcat 8.0.32 实例,它使用 JTDS 驱动程序连接到 SQL Server 2012 实例,连接时没有任何问题。我尝试将该驱动程序切换到 MS 驱动程序,然后遇到了相同的错误。所以我把它改回来了。但是第二次安装Tomcat(9.0.33)有一个应用程序需要JDBC 4.0或更高版本的驱动程序,而JTDS驱动程序只是3.0驱动程序,所以我必须使用MS驱动程序。但是,我不知道如何获得成功的连接。

通过互联网挖掘,我发现了对 jsse.jar 的引用并安装了正确的证书(尽管没有具体说明如何做到这一点或为什么)。我还挖了一篇文章,说 JTDS 驱动程序使用 NTLM 进行连接(不能 100% 确定,因为我在 JTDS 连接中没有引用域)。无论如何,我只需要一些关于如何配置 MS 驱动程序以从 Linux 连接到不安全的 SQL Server 2012 的指导。我发现的 Microsoft 参考资料解决了安全连接问题,但没有提及不安全的连接。

运行Java版本:

  • openjdk版本“1.8.0_252”

  • OpenJDK 运行时环境(内部版本 1.8.0_252-b09)

  • OpenJDK 64 位服务器 VM(内部版本 25.252-b09,混合模式)

    driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver url=jdbc:sqlserver://192.168.80.214:1433;databaseName=DB_Central;
    IntegratedSecurity=true;authenticationScheme=NTLM;domain=mydomain.org;

还尝试过:

url=jdbc:sqlserver://192.168.80.214:1433;databaseName=DB_Central;encrypt=false;sslProtocol=TLSv1.2;
Run Code Online (Sandbox Code Playgroud)

只是:

url=jdbc:sqlserver://192.168.80.214:1433;databaseName=DB_Central
Run Code Online (Sandbox Code Playgroud)

有效的 JTDS(在 tomcat 8.0.32 / JDBC 3.0 环境中):

driverClassName=net.sourceforge.jtds.jdbc.Driver
url=jdbc:jtds:sqlserver://192.168.80.214:1433;databaseName=DB_Central
Run Code Online (Sandbox Code Playgroud)

任何可能为我指明正确方向的事情都会很有帮助,特别是为什么 MS 驱动程序希望(或认为)连接是安全的。另一个花絮是,当部署到 Windows 10 时,我没有看到这些错误......所以它与 Linux 有关,也许与 Linux 上的 Java 配置有关。或者,也许我只需要在 Linux 中连接字符串的正确咒语......

Pet*_*ren 0

因此,经过多次尝试和错误后,我能够使其正常工作的方法是将 java.security 文件从 Windows 10 安装复制到 CentOS 8 安装。我认为两者之间唯一不同的是在本节中:

'# 以此字符串开头或等于此字符串的逗号分隔包列表

'# 将导致抛出安全异常

'# 传递给 checkPackageDefinition 除非

'#对应的RuntimePermission("defineClassInPackage."+package)有

'# 已被授予。

'#

'# 默认情况下,JDK 调用中没有提供任何类加载器

'# 检查包定义。

'#

CentOS 中的条目包含在列表末尾:

           org.GNOME.Accessibility.,\
           org.GNOME.Bonobo.
Run Code Online (Sandbox Code Playgroud)

Windows 版本中的条目最后只有一个条目:

           com.sun.java.accessibility.
Run Code Online (Sandbox Code Playgroud)

这是我能发现的唯一区别。而且,我不明白为什么这会产生影响..但它现在确实可以毫无错误地连接,这就是我想要的......