适用于: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
sqlcmdsqlcmd -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。