背景

在公司有一个plm的项目,使用的是jdk1.8.0_66,有个需求是需要在plm项目中引入

SQLServerPostgreSQL组成两个数据源,因为项目之前引入过SQLServer,便直接将该依赖引入,然后跑起来,不出意外的确实出意外了。所以便记录了这次排查过程


问题:

在plm中引用了sqlServer版本10.2.1.jre8版本

1
2
3
4
5
<dependency> 
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>10.2.1.jre8</version>
</dependency>

配置如下:

1
2
url: jdbc:sqlserver//ip:1433;databaseName=test;
driver-class-name:com.microsoft.sqlserver.jdbc.SQLServerDriver

启动会有如下报错:

1
2
3
4
'PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target'.
ClientConnectionId:85411829-6853-4fdb-9373-b4c93e1d5e8f

截图

截图


问题分析

PKIX 路径构建失败 - 无法找到请求目标的有效证书路径

stackoverflow分析

关于OpenJDK禁用TLS 1.0与1.1的分析

JDBC Driver 10.2 for SQL Server Released

1.openJdk8_291后连接sqlserver需要ssl安全连接,如果通过 AAD 身份验证连接时客户端计算机上缺少所需的证书,就会报错。

在项目中,查看了jdk版本是1.8.0_66

截图

测试使用了另一个jdk版本1.8.0_331

截图

可以正常启动

猜测可能是版本比较老,依然允许tls1.0和tls1.1版本,在搜索资料时没有找到oraclejdk禁用tls1.1的信息


在第四个文档中指出了,sqlserver从10.2 引入了默认情况下应用的重大更改Encrypt=true

截图

解决方法

  1. 在此项目中,可以通过使用jdk1.8.0_331 此项目测试可行
  2. url参数中添加 encrypt=true;trustServerCertificate=true 此项目测试可行
  3. 修改sqlServer驱动到10.2以下 如:9.4.1.jre8 此项目测试可行
  4. 将jre中的java.security的禁用算法(路径为JAVA_HOME/jre/lib/security/java.security) 将TLSv1和TLSv1.1删除 此方法没试,此系统中查看jre并没禁用

1edaf951e3fb25cb1f5d60a2eede9ede.png