SQL Server SSL 加密 - 自签名证书有效 - 为什么?

Noo*_*oob 5 authentication sql-server encryption connections certificate

我意识到这是一种奇怪的行为,我想知道在使用 SQL Server 生成的自签名证书时它是否应该以这种方式工作。

  1. 设置“加密连接”选项的客户端(Management Studio),客户端将在 SQL Server 端验证自签名证书并失败,因为自签名证书不受信任

  2. 客户端 (Management Studio)没有设置“加密连接”选项,但使用 SQL Server 配置管理器在 SQL Server 端打开了“强制加密”。客户端不会验证自签名证书,并将成功连接加密连接。

问题

  1. 在服务器端强制执行加密时,为什么客户端不尝试验证 SQL Server 自签名证书?为什么客户端只在客户端强制加密时验证自签名证书?

  2. 如果服务器端加密没有在客户端进行证书身份验证,那么使用 CA 签名证书有什么意义?

更准确地说:当仅打开服务器端加密时,为什么客户端(Mgmt Studio)不尝试验证/验证证书(无论是自签名/CA 签名)?当客户端加密(“加密连接”)打开时,为什么客户端只对服务器提供的证书进行身份验证/验证?

我添加了一个签名证书(由内部 CA 签名)用于服务器端加密。这需要在客户端计算机上安装内部 CA 证书(到受信任的根 CA),但我没有这样做。但是,当服务器端加密打开时,客户端(mgmt studio)仍然连接成功。

Dan*_*man 8

当您在服务器端打开强制加密选项时,无论客户端加密规范如何(SSCM-->SQL Server 网络配置-->MSSQLSERVER 的协议-->属性-->标志-->强制加密),流量都将被加密)。如果不安装来自受信任 CA 的证书,SQL Server 将使用自签名证书。

客户端无法验证自签名证书,因为不存在受信任的第三方。因此,需要加密 ( Encrypt=true)的客户端还必须明确指定证书是可信的,以便使用自签名证书成功连接。TrustServerCertificate=true基本上是说“是的,我了解风险,但无论如何都可以连接”并且证书链未经验证。

CA 颁发的证书将受信任的第三方添加到组合中,因此客户端可以使用TrustServerCertificate=false. 尽管您可以连接TrustServerCertificate=trueCA 颁发的证书(我认为这是您的第二个问题),但这不太安全,因为客户端可能会在不知不觉中使用自签名证书。


当仅打开 ServerSide 加密时,为什么客户端 (Mgmt Studio) 不尝试验证/认证证书(无论是自签名/CA 签名)?

当 > 客户端加密(“加密连接”)打开时,为什么客户端只验证/验证服务器提供的证书?

服务器可以为所有客户端强制加密流量,但客户端始终有责任验证证书。考虑默认连接设置Encrypt=false在 SSMS 和其他客户端中。这就是说“我不需要加密流量,因此无论服务器设置或证书如何都可以连接。” 该ForceEncryption=true服务器设置加强了这一违约而不考虑客户端请求的加密级别的加密通讯。此行为与ADO.NET 提供程序连接字符串语法文档中的以下摘录一致:

应用程序设置永远不会降低 SQL Server 客户端配置管理器设置的安全级别,但可能会加强它。

由于客户端首先没有请求加密,因此不会执行证书验证,但通过使用 SQL Server 上提供的任何证书对流量进行加密,仍然可以加强安全性。客户端可以指定Encrypt=trueTrustServerCertificate=false进一步加强安全性。这不仅可以验证可信证书是否存在,而且即使ForceEncryption=false在服务器上也可以加密流量。


客户必须选择加入证书验证。这样做是为了使您能够从服务器强制加密,而无需获得受信任的证书、在客户端上安装证书或更改客户端连接字符串。请参阅产品文档中的使用未经验证的加密