在不同服务器上Spring Boot 3.2.12连接SQL Server 2008 R2

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 主机上执行:

  1. 打开 SQL Server 配置管理器

  2. 右键服务器 → 属性 → 安全性

  3. 设置:

    • 服务器身份验证: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. 1.

    启用/禁用 SSL/TLS 加密

    • 当 encrypt=true 时,强制使用 SSL/TLS 加密 传输数据,确保通信安全(适用于敏感数据场景)。
    • 当 encrypt=false(默认值)时,不强制加密,但若服务器配置要求加密,仍可能启用加密 。
  2. 2.

    与 trustServerCertificate 的关联

    • 若 encrypt=true 且 trustServerCertificate=false
      客户端会验证服务器的 SSL 证书(需配置有效证书,否则报 PKIX path building failed 错误)。
    • 若 encrypt=true 且 trustServerCertificate=true
      客户端跳过证书验证(仅用于测试或内网环境)。

trustServerCertificate 是 SQL Server JDBC 连接中的一个关键安全参数,用于控制客户端是否自动信任服务器的 SSL/TLS 证书。以下是详细解释:


一、核心作用

  1. 1.

    跳过证书验证

    • 当 trustServerCertificate=true 时,客户端不会验证 SQL Server 的 SSL 证书是否有效或可信(即使证书是自签名或已过期)。
    • 当 trustServerCertificate=false(默认值)时,客户端会严格检查证书的有效性(如是否由受信任的 CA 签发、是否在有效期内)。
  2. 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. 1.设置为 trustServerCertificate=false
    2. 2.为 SQL Server 配置 受信任的 CA 签名证书 ;
    3. 3.确保证书链完整(避免 PKIX path building failed 错误)。

四、常见错误场景

  • 报错 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. 1.

    控制加密协议

    • useSSL=true:强制使用 SSL/TLS 协议 加密客户端与数据库之间的通信(提升安全性)。
    • useSSL=false禁用 SSL/TLS 加密,数据以明文传输(仅适用于安全内网环境)。
  2. 2.

    与 encrypt 参数的关系

    • 在 SQL Server 官方驱动(mssql-jdbc)中,useSSL 并非标准参数,实际应使用 encrypt 控制加密 。
    • 部分配置中出现的 useSSL 可能是历史遗留写法或第三方驱动(如 jTDS)的别名,需注意驱动兼容性 。

二、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. 1.

    报错 PKIX path building failed

    • 原因encrypt=true 但未信任服务器证书(trustServerCertificate=false)。
    • 解决
      • 设置为 trustServerCertificate=true(临时方案);
      • 或为服务器配置有效 CA 签名的证书(生产环境推荐)。
  2. 2.

    驱动兼容性问题

    • 部分 JDBC 驱动版本(如 mssql-jdbc 9.x+)可能对旧版 SQL Server 支持不佳,建议使用 8.4.1.jre8 。

总结

  • 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),主要作用是增强网络通信的安全性。

核心作用:

  1. 禁用弱加密算法
    防止使用已知存在漏洞的算法(如 MD5SHA-1RC4)。

  2. 禁用不安全的协议版本
    如过时的 SSLv3TLSv1TLSv1.1

  3. 限制弱密钥长度
    禁止使用密钥长度不足的算法(如 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
参数说明:
条目类型示例作用
协议版本SSLv3TLSv1TLSv1.1禁用不安全的 TLS/SSL 协议
算法名称RC4DES3DESMD5withRSA禁用特定加密算法或签名组合
密钥长度约束RSA keySize < 2048禁用 RSA 密钥长度 < 2048 位的证书
EC keySize < 224禁用椭圆曲线密钥 < 224 位的证书
特殊关键字anon禁用匿名密钥交换(无证书)
NULL禁用无加密的通信(仅认证)
include jdk.disabled.namedCurves引用其他禁用列表(如弱椭圆曲线)

实际影响:

  • 客户端/服务器连接:若尝试使用禁用的算法或协议,Java 会抛出 SSLHandshakeException

  • 默认配置:不同 Java 版本默认值不同(新版禁用更多弱算法)。例如:

    • Java 8:默认禁用 SSLv3RC4MD5 等。

    • Java 11+:额外禁用 TLSv1TLSv1.13DES 等。

  • 调试提示:遇到 TLS 连接失败时,检查此配置是否禁用了所需算法。


如何修改:

  1. 编辑 JAVA_HOME/conf/security/java.security 文件。

  2. 找到 jdk.tls.disabledAlgorithms 属性。

  3. 删除或注释需启用的算法(谨慎操作!确保不会引入安全风险)。

  4. 重启 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 官方文档 获取最新安全建议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值