2

我正在托管一些 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 connectionConnection Properties则会收到证书验证错误。

这是正常的吗?无论谁强制执行加密,我都希望客户端始终验证证书。

4

0 回答 0