加密 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 企業伺服器(SLES)不支援

設定 TLS 的步驟是執行 SQL Server 的作業系統特有的。

Note

TLS 不支援 Always On 可用性群組的資料庫鏡像端點。

憑證需求

請確定您的憑證遵循下列需求:

  • 目前的系統時間必須在憑證的 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 虛擬機器上使用 SQL Server 和 Azure AI 搜尋來釋放 Azure 資料的潛力。

Overview

TLS 用來加密從用戶端應用程式到 SQL Server 的連線。 當已正確設定時,TLS 可為用戶端與伺服器之間的通訊同時提供私密性和安全性。 TLS 連線可以由用戶端起始或伺服器端起始。

Note

TLS 不支援 Always On 可用性群組的資料庫鏡像端點。

下一節說明如何設定用戶端起始的加密。

產生憑證

/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 憑證。

    • RHELs:複製憑證到 /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 預設 密碼原則。 根據預設,密碼長度必須至少為8個字元,且包含下列四個集合中的三個字元:大寫字母、小寫字母、基底10位數和符號。 密碼長度最多可達 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. 當用戶端無法驗證 SQL Server 在 TLS 信號交換期間所出示憑證上的簽章時,就會發生此錯誤。 確定用戶端直接信任 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。