Skip to content

如何连接SQL Server 2008 R2数据库

问题现象

连接外部 SQL Server 2008 数据库时连接重置,会出现Connection Reset的错误。

问题根因

Java Bug 导致

Java 6u29 中引入了一个 Bug,可阻止与 SQL Server 2008 R2 的 SSL 连接。

Oracle 在 6u30 中提供了一个修复程序,但 Java 1.7 也无法正常工作。

TLS 版本不兼容

SQL Server 2008 R2 使用 TLS 1.0,而 JRE 默认使用 TLS 1.2,导致连接失败。

解决方案

用户可以通过降级 Java 版本(1.6.0_24 版本已确认可以使用)或向 Java 传递以下属性和值来解决这个错误:-Djsse.enableCBCProtection=false.

详情参考:

https://confluence.atlassian.com/fishkb/java-sql-sqlexception-i-o-error-connection-reset-when-connecting-to-an-external-sql-server-2008-database-284365810.html

修改JRE安全配置

SQL Server 2008 R2使用的TLS 1.0,而JRE默认使用的是TLS 1.2,所以需要修改JRE安全配置,否则会报错。 找到JRE安装目录下的${JRE_HOME}\lib\security\java.security

bash
# 修改前
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, DH keySize < 1024, \
    EC keySize < 224, 3DES_EDE_CBC, anon, NULL

# 修改后
jdk.tls.disabledAlgorithms=RC4, DES, MD5withRSA, DH keySize < 1024, \
    EC keySize < 224, 3DES_EDE_CBC, anon, NULL

修改启动配置文件

Windows

  1. 修改${CHINLINK_HOME}\windows.service.xml
bash
# 修改前
<env name="JAVA_OPTS" value="-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"/>

# 修改后
<env name="JAVA_OPTS" value="-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -Djsse.enableCBCProtection=false"/>
  1. 修改${CHINLINK_HOME}\.configure.cmd
bash
# 修改前
@SET JAVA_OPTS=-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai

# 修改后
@SET JAVA_OPTS=-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -Djsse.enableCBCProtection=false
  1. 修改完成后重启服务。

Linux

  1. 修改${CHINLINK_HOME}/.configure.sh
bash
# 修改前
export JAVA_OPTS="-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"

# 修改后
export JAVA_OPTS="-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -Djsse.enableCBCProtection=false"
  1. 修改完成后重启服务。

修改配置参数

打开 项目 > 设置 > 主要设置 > 服务启动选项,添加 -Djsse.enableCBCProtection=false

修改启动参数

注意事项

在设置ConnectionString的时候,请默认添加 trustservercertificate=true; 参数。

连接参数

注意:trustservercertificate=true 会跳过证书验证,仅适用于可信任网络环境。