Spring Boot 2.6.7升级至2.7.0出现FlywaySqlException异常如何解决
问题根因
Spring Boot 2.7.0 默认将内置绑定的 SQL Server JDBC 驱动(mssql-jdbc)从9.x版本升级至10.x版本,该版本驱动默认将连接参数encrypt设为true,强制与SQL Server建立SSL加密连接,且默认严格校验服务端SSL证书的信任链。2.6.x版本配套的旧版驱动无此强制校验逻辑,因此升级后如果SQL Server使用自签名证书、内部CA签发证书,且证书未被加入JDK信任列表,就会抛出题目中的PKIX路径构建失败错误。Flyway启动时默认复用主数据源连接,因此会直接抛出连接获取失败的异常。
可行解决方案(无需降级任何驱动版本)
方案1:生产环境合规方案(推荐)
将SQL Server服务端使用的SSL证书导入应用运行环境的信任库,让JDBC驱动可以正常完成证书链校验:
- 从SQL Server服务端导出服务端SSL公钥证书,保存为
sqlserver.crt文件 - 执行JDK自带的keytool命令,将证书导入JDK默认信任库:
keytool -import -alias sqlserver-ssl-cert -file /path/to/sqlserver.crt -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
- 命令交互时输入
yes确认信任该证书,重启应用即可正常连接。
如果应用使用自定义信任库而非JDK默认cacerts,将证书导入对应自定义信任库路径即可。
方案2:连接串指定独立信任库(不修改全局JDK配置)
如果不想修改运行环境全局JDK的信任配置,可以直接在JDBC连接参数中指定独立的信任库文件,不影响同环境下的其他应用:
在原有SQL Server JDBC连接URL末尾追加以下参数:
;encrypt=true;trustServerCertificate=false;trustStore=/path/to/custom/truststore.jks;trustStorePassword=对应信任库密码
Spring Boot环境下直接修改spring.datasource.url配置项拼接上述参数即可生效,Flyway会自动复用该配置。
方案3:非生产环境快速适配方案(仅开发/测试环境使用)
本地开发、测试环境如果不需要做严格的SSL证书校验,可以直接通过连接参数关闭证书信任校验,无需调整证书配置:
- 方式一:直接修改JDBC连接URL,末尾追加参数:
;encrypt=true;trustServerCertificate=true
- 方式二:在Spring配置文件中单独配置数据源连接属性(以YAML配置为例):
spring: datasource: hikari: data-source-properties: encrypt: true trustServerCertificate: true
该配置会跳过SQL Server SSL证书的有效性校验,存在中间人攻击安全风险,严禁在生产环境使用。
内容的提问来源于stack exchange,提问作者Sam Kadam
相关产品推荐
相关产品推荐

