为了允许应用程序使用 TLS 加密,从 1.2 版开始,Microsoft JDBC Driver for SQL Server 引入了以下连接属性:encrypt、trustServerCertificate、trustStore、trustStorePassword 和 hostNameInCertificate
。 为了使驱动程序能够将 TDS 8.0 与 TLS 加密配合使用,从版本 11.2 开始引入了连接属性 serverCertificate。 有关详细信息,请参阅设置连接属性。
下表总结了此 Microsoft JDBC Driver for SQL Server 版本对于可能的 TLS 连接方案的行为方式。 每种方案使用一组不同的 TLS 连接属性。 该表包含:
- blank:“连接字符串中不存在此属性”
- value:“连接字符串中存在此属性且属性的值有效”
- any:“连接字符串中是否存在此属性或属性的值是否有效均无关紧要”
备注
同样的行为适用于 SQL Server 用户身份验证和 Windows 集成身份验证。
属性设置 | 行为 |
---|---|
encrypt = false 或 blank trustServerCertificate = any hostNameInCertificate = any trustStore = any trustStorePassword = any | 驱动程序不会强制服务器支持 TLS 加密。 如果服务器具有自签名证书,驱动程序将启动 TLS 证书交换。 将不会验证 TLS 证书,并且只会加密登录数据包中的凭据。 如果服务器要求客户端支持 TLS 加密,驱动程序将启动 TLS 证书交换。 将不会验证 TLS 证书,但将加密整个通信。 |
encrypt = true trustServerCertificate = true hostNameInCertificate = any trustStore = any trustStorePassword = any | 驱动程序请求对服务器使用 TLS 加密。 如果服务器要求客户端支持 TLS 加密,或者服务器支持加密,则驱动程序将启动 TLS 证书交换。 如果 trustServerCertificate 属性设置为“true”,驱动程序将不验证 TLS 证书。 如果服务器未配置为支持加密,驱动程序将报错并终止连接。 |
encrypt = true trustServerCertificate = false 或 blank hostNameInCertificate = blank trustStore = blank trustStorePassword = blank | 驱动程序请求对服务器使用 TLS 加密。 如果服务器要求客户端支持 TLS 加密,或者服务器支持加密,则驱动程序将启动 TLS 证书交换。 驱动程序将使用在连接 URL 上指定的 serverName 属性以验证服务器 TLS 证书,并依赖于信任关系管理器工厂的查找规则以确定要使用哪一个证书存储区。 如果服务器未配置为支持加密,驱动程序将报错并终止连接。 |
encrypt = true trustServerCertificate = false 或 blank hostNameInCertificate = value trustStore = blank trustStorePassword = blank | 驱动程序请求对服务器使用 TLS 加密。 如果服务器要求客户端支持 TLS 加密,或者服务器支持加密,则驱动程序将启动 TLS 证书交换。 驱动程序将使用为 hostNameInCertificate 属性指定的值验证 TLS 证书的 subject 值。 如果服务器未配置为支持加密,驱动程序将报错并终止连接。 |
encrypt = true trustServerCertificate = false 或 blank hostNameInCertificate = blank trustStore = value trustStorePassword = value | 驱动程序请求对服务器使用 TLS 加密。 如果服务器要求客户端支持 TLS 加密,或者服务器支持加密,则驱动程序将启动 TLS 证书交换。 驱动程序将使用 trustStore 属性值查找证书 trustStore 文件,并使用 trustStorePassword 属性值检查 trustStore 文件的完整性。 如果服务器未配置为支持加密,驱动程序将报错并终止连接。 |
encrypt = true trustServerCertificate = false 或 blank hostNameInCertificate = blank trustStore = blank trustStorePassword = value | 驱动程序请求对服务器使用 TLS 加密。 如果服务器要求客户端支持 TLS 加密,或者服务器支持加密,则驱动程序将启动 TLS 证书交换。 驱动程序将使用 trustStorePassword 属性值检查默认 trustStore 文件的完整性。 如果服务器未配置为支持加密,驱动程序将报错并终止连接。 |
encrypt = true trustServerCertificate = false 或 blank hostNameInCertificate = blank trustStore = value trustStorePassword = blank | 驱动程序请求对服务器使用 TLS 加密。 如果服务器要求客户端支持 TLS 加密,或者服务器支持加密,则驱动程序将启动 TLS 证书交换。 驱动程序将使用 trustStore 属性值查找 trustStore 文件的位置。 如果服务器未配置为支持加密,驱动程序将报错并终止连接。 |
encrypt = true trustServerCertificate = false 或 blank hostNameInCertificate = value trustStore = blank trustStorePassword = value | 驱动程序请求对服务器使用 TLS 加密。 如果服务器要求客户端支持 TLS 加密,或者服务器支持加密,则驱动程序将启动 TLS 证书交换。 驱动程序将使用 trustStorePassword 属性值检查默认 trustStore 文件的完整性。 此外,驱动程序还将使用 hostNameInCertificate 属性值验证 TLS 证书。 如果服务器未配置为支持加密,驱动程序将报错并终止连接。 |
encrypt = true trustServerCertificate = false 或 blank hostNameInCertificate = value trustStore = value trustStorePassword = blank | 驱动程序请求对服务器使用 TLS 加密。 如果服务器要求客户端支持 TLS 加密,或者服务器支持加密,则驱动程序将启动 TLS 证书交换。 驱动程序将使用 trustStore 属性值查找 trustStore 文件的位置。 此外,驱动程序还将使用 hostNameInCertificate 属性值验证 TLS 证书。 如果服务器未配置为支持加密,驱动程序将报错并终止连接。 |
encrypt = true trustServerCertificate = false 或 blank hostNameInCertificate = value trustStore = value trustStorePassword = value | 驱动程序请求对服务器使用 TLS 加密。 如果服务器要求客户端支持 TLS 加密,或者服务器支持加密,则驱动程序将启动 TLS 证书交换。 驱动程序将使用 trustStore 属性值查找证书 trustStore 文件,并使用 trustStorePassword 属性值检查 trustStore 文件的完整性。 此外,驱动程序还将使用 hostNameInCertificate 属性值验证 TLS 证书。 如果服务器未配置为支持加密,驱动程序将报错并终止连接。 |
encrypt = strict hostNameInCertificate = value trustStore = blank trustStorePassword = blank serverCertificate = value | 驱动程序请求对服务器使用 TDS 8.0 strict TLS 加密。驱动程序将启动与服务器的 TLS 握手和证书交换作为第一个操作。 在 strict 模式下,将忽略 trustServerCertificate 设置将其视为 false。驱动程序将使用可选的 hostNameInCertificate 或 serverCertificate 属性来验证服务器 TLS 证书。 如果服务器未配置为支持 TDS 8 加密,驱动程序将报错并终止连接。 |
如果 encrypt 属性设置为 true,则 Microsoft JDBC Driver for SQL Server 将使用 JVM 的默认 JSSE 安全提供程序与 SQL Server 协商 TLS 加密 。 默认的安全提供程序可能不支持成功协商 TLS 加密所需的全部功能。 例如,默认的安全提供程序可能不支持在 SQL Server TLS 证书中使用的 RSA 公钥的大小。 在这种情况下,默认的安全提供程序可能报错,此错误将导致 JDBC 驱动程序终止连接。 为了解决此问题,可以使用以下选项之一:
- 使用具有较小 RSA 公钥的服务器证书配置 SQL Server
- 在“<java-home>/lib/security/java.security”安全属性文件中将 JVM 配置为使用其他 JSSE 安全提供程序
- 使用其他 JVM
在 TLS 握手期间,服务器向客户端发送其公钥证书。 JDBC 驱动程序或客户端必须验证服务器证书是由客户端信任的证书颁发机构颁发的。 驱动程序要求服务器证书必须满足以下条件:
- 证书是由受信任的证书颁发机构颁发的。
- 必须颁发证书才能进行服务器身份验证。
- 证书未过期。
- 证书使用者中的公用名 (CN) 或使用者替代名称 (SAN) 中的 DNS 名称与连接字符串中指定的 serverName 值完全匹配,或与 hostNameInCertificate 属性值(如果指定)完全匹配。
- DNS 名称可包含通配符。 在版本 7.2 之前,Microsoft JDBC Driver for SQL Server 不支持通配符匹配。 也就是说,abc.com 与 *.com 不匹配,但 *.com 与 *.com 匹配。 在版本 7.2 和更高版本中,支持标准证书通配符匹配。
为了使 TDS 8.0 能够与 strict
加密配合使用,serverCertifcate 属性值提供用于服务器证书验证的服务器证书路径。 此文件必须使用 PEM 文件格式。 从服务器收到的证书必须与此证书完全匹配。