我正在托管一些 linux SQL Server 2019 实例。与这些实例的所有连接都应加密,因此我在服务器端执行加密,如下所示(按照此处的官方说明):
/opt/mssql/bin/mssql-conf set network.tlscert /etc/opt/mssql/mssql.pem
/opt/mssql/bin/mssql-conf set network.tlskey /etc/opt/mssql/mssql.key
/opt/mssql/bin/mssql-conf set network.tlsprotocols 1.2
/opt/mssql/bin/mssql-conf set network.forceencryption 1
该mssql
证书是自签名证书。
为了验证连接确实是加密的,我在服务器上使用以下脚本:
select session_id, encrypt_option from sys.dm_exec_connections
当我在服务器上执行此操作时,我可以看到确实所有连接都是加密的(除了一些没有会话 ID 的条目,我假设它们是内部连接)。
现在出现了令人费解的事情:由于证书是自签名的,我希望客户端在不明确信任该证书的情况下拒绝连接。但是,这似乎只有在客户端也明确强制加密时才有效。
在sqlcmd
不信任证书的 Windows 机器上,我得到以下信息:
> sqlcmd -S db.mydomain.com -U user -P password -Q "select encrypt_option from sys.dm_exec_connections where session_id = @@spid"
encrypt_option
----------------------------------------
TRUE
(1 rows affected)
似乎加密正在工作,我没有收到证书验证错误。但是,如果我在客户端(即-N
)上强制加密,我会得到:
> sqlcmd -S db.mydomain.com -U user -P password -Q "select encrypt_option from sys.dm_exec_connections where session_id = @@spid" -N
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : SSL Provider: The certificate chain was issued by an authority that is not trusted.
.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Client unable to establish connection.
如果我明确信任证书(即-C
),则连接再次成功:
> sqlcmd -S db.mydomain.com -U user -P password -Q "select encrypt_option from sys.dm_exec_connections where session_id = @@spid" -C -N
encrypt_option
----------------------------------------
TRUE
(1 rows affected)
如果我将自签名证书添加到客户端计算机上我受信任的根权限,则所有连接(有或没有-N
)也会按预期成功。
通过 SQL Server Management Studio (SSMS) 连接时也会发生同样的情况。当我使用默认设置连接到数据库时,它可以正常工作而不会出现验证错误。如果我在 中选择Encrypt connection
,Connection Properties
则会收到证书验证错误。
这是正常的吗?无论谁强制执行加密,我都希望客户端始终验证证书。