首页  编辑  

SSL/TLS连接MS SQLServer

Tags: /Java/   Date Created:
MSSQL JDBC 驱动,从9.4.1.jre8版本,升级到 12.4.2.jre8 版本之后,启动程序报错:
com.microsoft.sqlserver.jdbc.SQLServerException: "encrypt" property is set to "true" and "trustServerCertificate" property is set to "false" but the driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption
9.4版本后"encrypt"属性的默认值发生了改变,变成“true" ,会对客户端和服务端之间通信的所有数据使用TLS加密,且trustServerCertificate默认为false(即默认不自动信任服务器证书,强制验证服务证书必须有效),这样在使用自签名的证书的时候会出现问题,如果是公签证书,则不会有问题。

这两个属性的值的详细含义,请参考: 设置连接属性 - JDBC Driver for SQL Server | Microsoft Learn,摘录如下:
encrypt

字符串

Null
设置为“true”时指示在服务器已安装有证书的情况下,SQL Server 对在客户端与服务器之间发送的所有数据使用 TLS 加密。 在版本 10.2 及更高版本中,默认值为“true”;在版本 9.4 及更低版本中,则为“false”。
在版本 6.0 及更高版本中,有一个新的连接设置“身份验证”默认使用 TLS 加密。
有关此属性的详细信息,请参阅“authentication”属性。
在 11.2.0 及更高版本中,“加密”已从“布尔”更改为“字符串”,这使得在属性设置为“严格”时支持 TDS 8.0。
trustServerCertificate

boolean
["true" | "false"]

false
设置为“true” 可指定驱动程序不验证服务器 TLS/SSL 证书。
如果为“true”,则在使用 TLS 加密通信层时会自动信任服务器 TLS/SSL 证书。
如果为“false”,则驱动程序会验证服务器 TLS/SSL 证书。 如果服务器证书验证失败,驱动程序将引发错误并关闭连接。 默认值为“false”。 确保传递给 serverName 的值与服务器证书中使用者可选名称 (SAN) 中的公用名称 (CN) 或 DNS 名称完全匹配,以便成功建立 TLS 连接 。 有关加密支持的详细信息,请参阅了解加密支持

注意: 此属性与 encrypt /authentication 属性结合使用。 当连接使用 TLS 加密时,此属性才会影响服务器 TLS/SSL 证书验证。
解决方法,任选其一:
  1. 推荐:导入MS SQL Server自签名证书到Java的cacerts, <JAVA_HOME>表示你的Java runtime所在的目录:
    <JAVA_HOME>/bin/keytool -importcert -alias <server_name> -keystore <JAVA_HOME>/jre/lib/security/cacerts -file 你的MSSQLServer证书.crt -storepasswd changeit
  2. 设置trustStorePassword为true,忽略证书验证即可:
    jdbc:sqlserver://localhost:1433;trushServerCertificate=true