如何连接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.
详情参考:
修改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
- 修改
${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"/>- 修改
${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- 修改完成后重启服务。
Linux
- 修改
${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"- 修改完成后重启服务。
修改配置参数
打开 项目 > 设置 > 主要设置 > 服务启动选项,添加 -Djsse.enableCBCProtection=false

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

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