加密与 Linux 上的 SQL Server 的连接

适用于:Linux 上的 SQL Server

Linux 上的 SQL Server 可以使用传输层安全性 (TLS) 对通过网络在客户端应用程序与 SQL Server 实例之间传输的数据进行加密。

操作系统支持

SQL Server在 Windows 和 Linux 上支持相同的 TLS 协议:1.3、1.2、1.1 和 1.0。

从 SQL Server 2025 开始(17.x):

  • 默认情况下启用 TLS 1.3
  • 不支持 SUSE Linux Enterprise Server (SLES)

配置 TLS 的步骤特定于运行 SQL Server 的作系统。

Note

AlwaysOn 可用性组数据库镜像终结点不支持 TLS。

证书要求

确保证书符合以下要求:

  • 当前系统时间必须晚于证书的 Valid from 属性,并早于证书的 Valid to 属性。

  • 该证书必须用于服务器身份验证。 这需要证书的 Enhanced Key Usage 属性指定 Server Authentication (1.3.6.1.5.5.7.3.1) 才能实现。

  • 必须使用 KeySpec 的 AT_KEYEXCHANGE 选项创建该证书。 通常,证书的密钥使用属性 (KEY_USAGE) 还包括密钥加密 (CERT_KEY_ENCIPHERMENT_KEY_USAGE)。

  • 证书的 Subject 属性必须指明,证书公用名称 (CN) 与服务器计算机的主机名或完全限定的域名 (FQDN) 相同。

    Note

    支持通配符证书。

配置要使用的 OpenSSL 库(可选)

可以在 /opt/mssql/lib/ 目录中创建符号链接,以引用应当用于加密的 libcrypto.so 和 libssl.so 库。 若要强制 SQL Server 使用特定的 OpenSSL 版本,而不是系统提供的默认版本,此方法非常有用。 如果未提供这些符号链接,SQL Server 将在系统上加载默认配置的 OpenSSL 库。

这些符号链接应命名为 libcrypto.so 和 libssl.so,并放在 /opt/mssql/lib/ 目录中。

Note

有关使用 Let's Encrypt 生成证书的示例,请参阅博客文章使用 Linux Azure VM 上的 SQL Server 和 Azure AI 搜索解锁 Azure 中的数据的强大功能。

Overview

TLS 用于加密从客户端应用程序到 SQL Server 的连接。 正确配置后,TLS 可为客户端和服务器之间的通信提供隐私和数据完整性。 TLS 连接可以是客户端启动的或服务器启动的。

Note

AlwaysOn 可用性组数据库镜像终结点不支持 TLS。

以下部分将介绍如何设置客户端启动的加密。

生成证书

/CN 应与 SQL Server 主机的完全限定域名匹配。

注意

本例使用自签名证书。 不应将自签名证书用于生产方案。 你应该使用 CA 证书。

确保用于保存证书和私钥的文件夹可由 mssql 用户或组访问,并且权限设置为 700(drwx------)。 你可以手动创建文件夹,将权限设置为 700(drwx------),并将其所有者设为 mssql 用户或组。 或者,将权限 755 设置为(drwxr-xr-x),并确保这些文件夹对 mssql 组成员开放。 例如,你可以在路径/var/opt/mssql/下创建一个调用sslcert的文件夹,保存证书和私钥,文件权限设置为 600,如下示例所示。

openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=mssql.contoso.com' -keyout mssql.key -out mssql.pem -days 365
sudo chown mssql:mssql mssql.pem mssql.key
sudo chmod 600 mssql.pem mssql.key
# Save the certificate to the certs folder under /etc/ssl/
sudo mv mssql.pem /etc/ssl/certs/
# Save the private key to the private folder under /etc/ssl/
sudo mv mssql.key /etc/ssl/private/

配置SQL Server

对于 SQL Server 2022(16.x)和早期版本:

systemctl stop mssql-server
sudo cat /var/opt/mssql/mssql.conf
sudo /opt/mssql/bin/mssql-conf set network.tlscert /etc/ssl/certs/mssql.pem
sudo /opt/mssql/bin/mssql-conf set network.tlskey /etc/ssl/private/mssql.key
sudo /opt/mssql/bin/mssql-conf set network.tlsprotocols 1.2
sudo /opt/mssql/bin/mssql-conf set network.forceencryption 0
systemctl restart mssql-server

对于 SQL Server 2025(17.x):

systemctl stop mssql-server
sudo cat /var/opt/mssql/mssql.conf
sudo /opt/mssql/bin/mssql-conf set network.tlscert /etc/ssl/certs/mssql.pem
sudo /opt/mssql/bin/mssql-conf set network.tlskey /etc/ssl/private/mssql.key
sudo /opt/mssql/bin/mssql-conf set network.forceencryption 0
systemctl restart mssql-server

在客户端计算机(Windows、Linux 或 macOS)上注册证书

  • 如果你使用CA签名的证书,请将证书授权机构(CA)证书复制到客户端机器,而不是用户证书。

  • 如果你使用自签名证书,将文件复制 .pem 到你发行版的文件夹,并执行启用它的命令:

    • Ubuntu:将证书复制到 /usr/share/ca-certificates/,将其扩展名重命名为 .crt,并用 dpkg-reconfigure ca-certificates 来启用系统CA证书。

    • RHEL:将证书复制到 /etc/pki/ca-trust/source/anchors/,并使用 update-ca-trust 将其启用为系统 CA 证书。

    • SUSE:复制证书到 /usr/share/pki/trust/anchors/ 并使用 update-ca-certificates ,使其作为系统CA证书启用。

    • Windows:将 .pem 文件作为证书导入到 当前用户>受信任的根证书颁发机构>证书 下。

    • macOS:

      • 将证书复制到 /usr/local/etc/openssl/certs。

      • 运行以下命令获取哈希值:

        /usr/local/Cellar/openssl/1.0.2l/openssl x509 -hash -in mssql.pem -noout
        
      • 将证书重命名为该值。 例如,使用 mv mssql.pem dc2dd900.0。 确保 dc2dd900.0 在 /usr/local/etc/openssl/certs 中。

连接字符串示例

注意

密码应遵循 SQL Server 默认密码策略。 默认情况下,密码必须为至少八个字符且包含以下四种字符中的三种:大写字母、小写字母、十进制数字、符号。 密码可最长为 128 个字符。 使用的密码应尽可能长,尽可能复杂。

  • SQL Server Management Studio

    SQL Server Management Studio 连接对话框的屏幕截图。

  • sqlcmd

    sqlcmd -S <sqlhostname> -N -U sa -P '<password>'

  • ADO.NET

    "Encrypt=True; TrustServerCertificate=False;"

  • ODBC

    "Encrypt=Yes; TrustServerCertificate=no;"

  • JDBC

    "encrypt=true; trustServerCertificate=false;"

常见的连接错误

错误消息 修复
The certificate chain was issued by an authority that is not trusted. 如果客户端在 TLS 握手期间无法验证 SQL Server 提供的证书上的签名,则会发生此错误。 请确保客户端直接信任 SQL Server 证书,或者信任签署 SQL Server 证书的 CA。
The target principal name is incorrect. 确保 SQL Server 证书上的公共名称字段与客户端 连接字符串 中指定的服务器名称一致。
An existing connection was forcibly closed by the remote host. 如果客户端不支持 SQL Server 所需的 TLS 协议版本,则会发生此错误。 例如,如果 SQL Server 配置为需要 TLS 1.2,请确保客户端也支持 TLS 1.2 协议。

Ubuntu 20.04 及其他最新的 Linux 发行版

症状

当 Linux 实例上的 SQL Server 加载由未达到 112 位安全性的签名算法(例如 MD5、SHA-1)创建的证书时,可能会看到连接失败错误,如下例所示:

A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - An existing connection was forcibly closed by the remote host.) (Microsoft SQL Server, Error: 10054)

发生此错误的原因是 Ubuntu 20.04 及更高版本上默认启用了 OpenSSL 安全级别 2。 安全级别 2 禁止建立未达到 112 位安全性的 TLS 连接。

解决方案

安装采用至少达到 112 位安全性的签名算法的证书。 满足此要求的签名算法包括 SHA-224、SHA-256、SHA-384 和 SHA-512。