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

