Java 17升级后SQL Server连接字符串trustServerCertificate参数异常求助
升级Java 17后SQL Server连接字符串trustServerCertificate参数被覆盖问题排查
近期将应用升级至Java 17后,出现SQL Server连接异常:连接字符串中明确配置trustServerCertificate=true,但启动时驱动报错显示该参数被设为false,导致SSL连接失败。
连接字符串配置
spring.datasource.url=jdbc:sqlserver://LOCALHOST:1433;databaseName=[mydb];encrypt=true;trustServerCertificate=true
启动错误日志
2023-08-22 12:09:17.746[0;39m [31mERROR[0;39m [35m10768[0;39m [2m---[0;39m [2m[ restartedMain][0;39m [36mcom.zaxxer.hikari.pool.HikariPool [0;39m [2m:[0;39m HikariPool-2 - Exception during pool initialization. com.microsoft.sqlserver.jdbc.SQLServerException: "encrypt" property is set to "true" and "trustServerCertificate" property is set to "false" but the driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption: Error: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target. ClientConnectionId:ae5d4fb9-9813-4ba6-b5d2-c3895eabe0db at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:3957) at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1950) at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:3477) at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:3097) at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2939) at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1801) at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1241) at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.lambda
应用环境
- STS v4.18.1
- Eclipse Adoptium JDK jdk-17.0.8.7-hotspot
- SQLServerDialect:SQLServer2012Dialect
- SQL Server驱动版本:12.3.0.jre17-preview、12.4.0.jre11(均无效)
- HikariCP 4.0.3
- Hibernate 5.6.12
- Spring Boot 2.7.5
排查方案
- 检查Spring Boot配置加载优先级:启动时添加
--debug参数,查看控制台输出的配置加载详情,确认spring.datasource.url的最终生效值,排查是否有外部配置(如环境变量、系统属性、jar外的application.properties)覆盖了原配置。 - 检查HikariCP专属配置:查看是否存在
spring.datasource.hikari.connection-properties配置项,该配置中的参数会覆盖连接字符串中的对应设置,若其中包含trustServerCertificate=false则会导致问题。 - 替换兼容的SQL Server驱动:Java 17需使用对应版本的正式驱动,替换为
com.microsoft.sqlserver:mssql-jdbc:12.4.0.jre17或更高版本,避免使用预览版或针对低版本Java的驱动。 - 排查JVM系统属性:检查启动参数中是否设置了
sqlserver.trustServerCertificate=false或相关SSL系统属性,这类全局属性会优先于连接字符串中的配置。 - 检查代码层面的动态修改:排查项目中是否有@Configuration类通过DataSourceBuilder手动设置连接属性,或Hibernate配置中是否存在覆盖SSL参数的逻辑。
- 启用驱动调试日志:在application.properties中添加
logging.level.com.microsoft.sqlserver.jdbc=DEBUG,通过驱动日志追踪参数解析过程,定位trustServerCertificate参数的实际取值来源。
内容的提问来源于stack exchange,提问作者onoma
相关产品推荐
相关产品推荐

