You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.7.0升级后SQL Server SSL连接失败规范修复方案

问题根因

Spring Boot 2.7.0 版本默认绑定的 MSSQL JDBC 驱动从9.x系列升级到10.x系列,该版本驱动存在两项影响SSL连接的核心默认配置变更:

  • 数据库连接默认开启SSL加密,encrypt=true从可选配置变为强制默认值
  • 默认关闭服务端证书无条件信任逻辑,trustServerCertificate=false为默认值,SSL握手阶段会严格校验SQL Server出示的证书是否存在于客户端信任链中
    2.5.x版本绑定的低版本JDBC驱动默认不强制开启SSL加密,不会触发证书校验流程,这是版本升级后连接报错的唯一核心原因。在连接串追加trustServerCertificate=true本质是完全跳过证书合法性校验,存在中间人攻击风险,仅适合本地开发临时调试,生产环境禁止使用。
符合安全规范的正式修复方案

第一步:SQL Server侧配置合法SSL证书

首先需要为目标SQL Server实例配置合规的SSL证书,配置要求如下:

  • 生产环境优先使用公共CA签发的证书,内网环境可使用企业内部CA签发的证书,禁止使用SQL Server安装时自动生成的非信任自签名证书
  • 证书增强密钥用法必须包含服务器身份验证(1.3.6.1.5.5.7.3.1)
  • 证书主体名称(CN)或主题备用名称(SAN)必须和JDBC连接串中填写的数据库主机名完全一致,否则会触发域名匹配失败
  • 运行SQL Server服务的系统账号必须持有证书私钥的读取权限,证书配置完成后需要重启SQL Server实例生效

第二步:将证书导入客户端信任库

  1. 从SQL Server服务端导出证书公钥文件(cer/pem格式均可,无需导出私钥);如果使用内部CA签发证书,直接导出CA根证书公钥即可,后续该CA签发的所有服务端证书都会被自动信任,无需逐台导入。
  2. 选择信任库存放方式:
    • 方式一:导入到应用运行时使用的JDK全局信任库,执行以下keytool命令:
      keytool -import -alias mssql-trusted-cert -file 导出的证书公钥文件路径.cer -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
      
      执行命令后输入yes确认信任该证书即可,changeit为JDK cacerts信任库的默认密码,若自定义过密码请替换为实际值。
    • 方式二:创建独立的自定义信任库文件,不修改JDK全局配置,避免影响同JDK下运行的其他应用,导入证书命令逻辑和上述一致,仅需替换keystore路径为自定义信任库的存放路径。

第三步:Spring Boot侧配置

JDBC连接串中保持trustServerCertificate=false(可省略,默认即为该值),示例application.yml配置如下:

spring:
  datasource:
    url: jdbc:sqlserver://数据库主机名:1433;databaseName=目标库名;encrypt=true;hostNameInCertificate=证书配置的CN/SAN值
    username: 数据库账号
    password: 数据库密码
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

如果使用自定义独立信任库,需要在应用启动时追加JVM参数指定信任库位置:

java -jar 你的应用包名.jar \
  -Djavax.net.ssl.trustStore=自定义信任库文件路径 \
  -Djavax.net.ssl.trustStorePassword=自定义信任库密码
有效性验证

启动应用后观察数据库连接日志,无SSL握手异常、可正常执行SQL请求即为配置生效,可通过网络抓包确认数据库连接流量已被SSL加密,证书校验逻辑正常运行。

内容的提问来源于stack exchange,提问作者BugsOverflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:01:06