Spring Boot 3.2.12 与 SQL Server 2008 R2 不在同一服务器上。
解决方案(针对 SQL Server 2008 R2)
1. 使用兼容的 JDBC 驱动版本(重要关键操作)
在 pom.xml 中使用专门为旧版 SQL Server 设计的驱动:
<!-- mssql驱动依赖,若不指定版本,默认的是最新版本 -->
<!-- Spring Boot 3.2.12 + SQL Server 2008 R2 组合,经验证正常使用的版本 8.2.2.jre8、8.4.1.jre8(推荐)、9.4.1.jre11 -->
<!-- 使用 8.2.2.jre8,控制台不会输出警告 2025-07-11T19:47:04.998+08:00 WARN 26336 [onnection adder] c.m.s.jdbc.internals.TDS.Channel : TLSv1 was negotiated. Please update server and client to use TLSv1.2 at minimum. -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.2.2.jre8</version>
</dependency>
<!-- 使用 8.2.2.jre8,控制台不会输出警告 2025-07-11T19:47:04.998+08:00 WARN 26336 [onnection adder] c.m.s.jdbc.internals.TDS.Channel : TLSv1 was negotiated. Please update server and client to use TLSv1.2 at minimum. -->
2. 修改连接配置
在 application.yml 中使用以下配置:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://192.168.2.103:1433;databaseName=wylims
# 确保稳定连接 SQL Server 2008 R2 的组合设置,经测试不显式设置也是可以的
# encrypt: true # 启用加密
# trustServerCertificate: true # 跳过证书验证
# useSSL: false # 禁用旧版 SSL 协议
# # 启禁 SSL/TLS 加密,用于控制客户端与数据库之间的通信加密方式
# encrypt: true
# # 启禁 SSL 证书验证(简化配置,适用于开发、测试、内网、旧版数据库环境),用于控制客户端是否自动信任服务器的 SSL/TLS 证书
# trustServerCertificate: true
# # 启禁 SSL 连接
# useSSL: false
username: sa
password: Sinmia123
3. 修改 Java 安全策略文件(重要关键操作)
编辑 $JAVA_HOME/conf/security/java.security
修改配置项 jdk.tls.disabledAlgorithms,移除 TLSv1, TLSv1.1,
###jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL
4. SQL Server 端配置
在 SQL Server 主机上执行:
-
打开 SQL Server 配置管理器
-
右键服务器 → 属性 → 安全性
-
设置:
-
服务器身份验证:SQL Server 和 Windows 身份验证模式
-
登录审核:仅限失败的登录
-
服务器代理帐户:留空
-
重启 SQL Server 服务
-
5. 运行应用
使用简单命令运行应用:
java -jar lims-server-1.0-SNAPSHOT.jar
若无法连接数据库,添加 JVM 参数运行应用:(可选)
java -Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true -jar lims-server-1.0-SNAPSHOT.jar
或将相应命令做成批处理文件 .bat 或 .cmd,双击启动以进程方式运行应用:(可选)
Widows脚本命令 lims-server.cmd
@echo off
REM 使用简单命令运行应用(单行排版)
start "lims-server" javaw -jar D:\MyCode\wylims\lims-server\target\lims-server-1.0-SNAPSHOT.jar
:: 使用 JVM 参数运行应用(单行排版)
REMstart "lims-server" javaw -Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true -jar D:\MyCode\wylims\lims-server\target\lims-server-1.0-SNAPSHOT.jar
:: 使用 JVM 参数运行应用(多行排版)
:: 1、使用 ^ 符号将长命令分解为多行,提高易读性
:: 2、增加防御性编程,路径使用引号包裹,避免空格或特殊字符问题
::start "lims-server" javaw ^
::-Djdk.tls.client.protocols=TLSv1 ^
::-Djsse.enableSNIExtension=false ^
::-Djdk.tls.allowUnsafeServerCertChange=true ^
::-jar "D:\MyCode\wylims\lims-server\target\lims-server-1.0-SNAPSHOT.jar"
exit
Widows批处理文件 lims-server.bat
@echo off
REM 使用简单命令运行应用(单行排版)
REMstart "lims-server" javaw -jar D:\MyCode\wylims\lims-server\target\lims-server-1.0-SNAPSHOT.jar
:: 使用 JVM 参数运行应用(单行排版)
::start "lims-server" javaw -Djdk.tls.client.protocols=TLSv1 -Djsse.enableSNIExtension=false -Djdk.tls.allowUnsafeServerCertChange=true -jar D:\MyCode\wylims\lims-server\target\lims-server-1.0-SNAPSHOT.jar
:: 使用 JVM 参数运行应用(多行排版)
:: 1、使用 ^ 符号将长命令分解为多行,提高易读性
:: 2、增加防御性编程,路径使用引号包裹,避免空格或特殊字符问题
start "lims-server" javaw ^
-Djdk.tls.client.protocols=TLSv1 ^
-Djsse.enableSNIExtension=false ^
-Djdk.tls.allowUnsafeServerCertChange=true ^
-jar "D:\MyCode\wylims\lims-server\target\lims-server-1.0-SNAPSHOT.jar"
exit
运行效果:

扩展知识:
一、encrypt 参数的作用
- 1.
启用/禁用 SSL/TLS 加密
- 当
encrypt=true时,强制使用 SSL/TLS 加密 传输数据,确保通信安全(适用于敏感数据场景)。 - 当
encrypt=false(默认值)时,不强制加密,但若服务器配置要求加密,仍可能启用加密 。
- 当
- 2.
与
trustServerCertificate的关联- 若
encrypt=true且trustServerCertificate=false:
客户端会验证服务器的 SSL 证书(需配置有效证书,否则报PKIX path building failed错误)。 - 若
encrypt=true且trustServerCertificate=true:
客户端跳过证书验证(仅用于测试或内网环境)。
- 若
trustServerCertificate 是 SQL Server JDBC 连接中的一个关键安全参数,用于控制客户端是否自动信任服务器的 SSL/TLS 证书。以下是详细解释:
一、核心作用
- 1.
跳过证书验证
- 当
trustServerCertificate=true时,客户端不会验证 SQL Server 的 SSL 证书是否有效或可信(即使证书是自签名或已过期)。 - 当
trustServerCertificate=false(默认值)时,客户端会严格检查证书的有效性(如是否由受信任的 CA 签发、是否在有效期内)。
- 当
- 2.
适用场景
- 开发/测试环境:无需配置正式证书,简化连接流程 。
- 内网环境:网络本身安全,可临时降低验证强度。
- 旧版 SQL Server(如 2008 R2):配置有效证书较复杂,此参数可避免
PKIX类错误 。
二、与 encrypt 参数的关联
- 若
encrypt=true(启用加密):trustServerCertificate=true→ 强制加密但跳过证书验证(快速连接)。trustServerCertificate=false→ 强制加密且验证证书(需有效证书,否则报错)。
- 若
encrypt=false(不加密):
trustServerCertificate参数无效(不触发加密流程)。
典型配置示例(SQL Server 2008 R2):
jdbc:sqlserver://localhost:1433;databaseName=test; encrypt=true; # 启用加密 trustServerCertificate=true; # 跳过证书验证 useSSL=false; # 禁用旧版 SSL 协议参考配置
三、安全风险与建议
- 风险:
trustServerCertificate=true可能遭受 中间人攻击(攻击者可伪造证书窃听数据)。 - 生产环境建议:
- 1.设置为
trustServerCertificate=false; - 2.为 SQL Server 配置 受信任的 CA 签名证书 ;
- 3.确保证书链完整(避免
PKIX path building failed错误)。
- 1.设置为
四、常见错误场景
- 报错
PKIX path building failed:
原因:encrypt=true且trustServerCertificate=false,但证书无效 。
解决:- 临时方案:设为
trustServerCertificate=true; - 根治方案:更新有效证书 。
- 临时方案:设为
- 驱动兼容性问题:
旧版 SQL Server(如 2008 R2)建议使用mssql-jdbc 8.4.1.jre8驱动 。
总结
trustServerCertificate=true→ 跳过 SSL 证书验证,简化连接(仅推荐非生产环境)。- 关键组合:需与
encrypt=true配合生效,避免与useSSL混淆(后者控制协议版本)。 - 安全底线:生产环境务必验证证书,禁用此参数
useSSL 是数据库连接字符串中用于控制 是否启用 SSL/TLS 加密传输 的参数,但其具体行为在不同数据库驱动中可能存在差异。以下是针对 SQL Server 场景的详细解析:
一、核心作用
- 1.
控制加密协议
useSSL=true:强制使用 SSL/TLS 协议 加密客户端与数据库之间的通信(提升安全性)。useSSL=false:禁用 SSL/TLS 加密,数据以明文传输(仅适用于安全内网环境)。
- 2.
与
encrypt参数的关系- 在 SQL Server 官方驱动(
mssql-jdbc)中,useSSL并非标准参数,实际应使用encrypt控制加密 。 - 部分配置中出现的
useSSL可能是历史遗留写法或第三方驱动(如 jTDS)的别名,需注意驱动兼容性 。
- 在 SQL Server 官方驱动(
二、SQL Server 2008 R2 的配置建议
在连接旧版 SQL Server 2008 R2 时,推荐组合使用以下参数:
url: jdbc:sqlserver://localhost:1433;databaseName=test;
encrypt=true; # 启用加密
trustServerCertificate=true; # 跳过证书验证(避免证书配置问题)
useSSL=false; # 禁用旧版 SSL 协议(兼容性优化)
原因:
- SQL Server 2008 R2 的证书配置较复杂,
trustServerCertificate=true可规避证书错误 。 useSSL=false确保兼容旧版加密协议(部分驱动版本需显式禁用)。
三、常见问题场景
- 1.
报错
PKIX path building failed- 原因:
encrypt=true但未信任服务器证书(trustServerCertificate=false)。 - 解决:
- 设置为
trustServerCertificate=true(临时方案); - 或为服务器配置有效 CA 签名的证书(生产环境推荐)。
- 设置为
- 原因:
- 2.
驱动兼容性问题
- 部分 JDBC 驱动版本(如
mssql-jdbc 9.x+)可能对旧版 SQL Server 支持不佳,建议使用8.4.1.jre8。
- 部分 JDBC 驱动版本(如
总结
encrypt=true:强制加密通信,提升安全性。trustServerCertificate=true:跳过证书验证(简化配置,适合测试环境)。- 实际使用:在 SQL Server 2008 R2 中,建议同时设置
encrypt=true+trustServerCertificate=true+useSSL=false以确保稳定连接 。
在 Java 安全策略中,jdk.tls.disabledAlgorithms 是一个关键的安全属性,用于禁用不安全的 TLS/SSL 加密算法、协议版本或密钥参数。它通过 Java 的 java.security 配置文件进行管理(路径:JAVA_HOME/conf/security/java.security),主要作用是增强网络通信的安全性。
核心作用:
-
禁用弱加密算法
防止使用已知存在漏洞的算法(如MD5、SHA-1、RC4)。 -
禁用不安全的协议版本
如过时的SSLv3、TLSv1、TLSv1.1。 -
限制弱密钥长度
禁止使用密钥长度不足的算法(如 RSA 密钥 < 2048 位)。
配置格式(示例):
# 在 java.security 文件中的典型配置
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 2048, RSA keySize < 2048, EC keySize < 224, \
anon, NULL, include jdk.disabled.namedCurves
参数说明:
| 条目类型 | 示例 | 作用 |
|---|---|---|
| 协议版本 | SSLv3, TLSv1, TLSv1.1 | 禁用不安全的 TLS/SSL 协议 |
| 算法名称 | RC4, DES, 3DES, MD5withRSA | 禁用特定加密算法或签名组合 |
| 密钥长度约束 | RSA keySize < 2048 | 禁用 RSA 密钥长度 < 2048 位的证书 |
EC keySize < 224 | 禁用椭圆曲线密钥 < 224 位的证书 | |
| 特殊关键字 | anon | 禁用匿名密钥交换(无证书) |
NULL | 禁用无加密的通信(仅认证) | |
include jdk.disabled.namedCurves | 引用其他禁用列表(如弱椭圆曲线) |
实际影响:
-
客户端/服务器连接:若尝试使用禁用的算法或协议,Java 会抛出
SSLHandshakeException。 -
默认配置:不同 Java 版本默认值不同(新版禁用更多弱算法)。例如:
-
Java 8:默认禁用
SSLv3、RC4、MD5等。 -
Java 11+:额外禁用
TLSv1、TLSv1.1、3DES等。
-
-
调试提示:遇到 TLS 连接失败时,检查此配置是否禁用了所需算法。
如何修改:
-
编辑
JAVA_HOME/conf/security/java.security文件。 -
找到
jdk.tls.disabledAlgorithms属性。 -
删除或注释需启用的算法(谨慎操作!确保不会引入安全风险)。
-
重启 Java 应用。
⚠️ 警告:随意启用禁用项可能导致安全漏洞!仅当兼容性要求且风险可控时调整。
示例场景:
# 允许 TLSv1(不推荐!仅用于演示) jdk.tls.disabledAlgorithms=SSLv3, TLSv1.1, RC4, ... # 移除了 TLSv1
此时应用可使用 TLSv1,但需承担已知漏洞风险。
扩展知识:
-
动态更新:Java 8u151+ 支持运行时更新(通过
Security.setProperty())。 -
相关属性:
-
jdk.certpath.disabledAlgorithms(影响证书链验证)。 -
jdk.tls.ephemeralDHKeySize(控制临时密钥长度)。
-
通过合理配置此属性,可显著提升 Java 应用的 TLS/SSL 安全性。建议参考 Oracle 官方文档 获取最新安全建议。



441

被折叠的 条评论
为什么被折叠?



