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 中连接字符串的正确咒语......
因此,经过多次尝试和错误后,我能够使其正常工作的方法是将 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)
这是我能发现的唯一区别。而且,我不明白为什么这会产生影响..但它现在确实可以毫无错误地连接,这就是我想要的......
归档时间: |
|
查看次数: |
20577 次 |
最近记录: |