加密 Linux 上的 SQL Server 的連線

適用於:SQL Server - Linux

Linux 上的 SQL Server 可以使用傳輸層安全性 (TLS) 來加密在用戶端應用程式與 SQL Server 執行個體之間的網路傳輸的資料。 SQL Server 在 Windows 和 Linux 上支援相同的 TLS 通訊協定:TLS 1.2、1.1 和 1.0。 不過,設定 TLS 的步驟需視 SQL Server 的執行環境作業系統而定。

憑證需求

開始之前,您必須確定憑證符合下列需求:

  • 目前的系統時間必須在憑證的 Valid from 屬性值之後,並且在憑證的 Valid to 屬性值之前。

  • 憑證必須是為了伺服器驗證而準備的。 這需要憑證的 Enhanced Key Usage 屬性才能指定 Server Authentication (1.3.6.1.5.5.7.3.1)

  • 憑證必須使用 AT_KEYEXCHANGEKeySpec 選項來建立。 通常,憑證的金鑰使用方法屬性 (KEY_USAGE) 也包括金鑰編密 (CERT_KEY_ENCIPHERMENT_KEY_USAGE)。

  • 憑證的 Subject 屬性必須指出一般名稱 (CN) 與伺服器電腦的主機名稱或完整網域名稱 (FQDN) 相同。

    注意

    支援萬用字元憑證。

設定要使用的 OpenSSL 程式庫 (選擇性)

您可以在 /opt/mssql/lib/ 目錄中建立會參考應使用哪些 libcrypto.solibssl.so 程式庫來進行加密的符號連結。 如果您想要強制 SQL Server 使用特定版本的 OpenSSL 而不是系統提供的預設值,這會相當有用。 如果這些符號連結不存在,SQL Server 就會在系統上載入預設設定的 OpenSSL 程式庫。

這些符號連結應該命名為 libcrypto.solibssl.so,並放在 /opt/mssql/lib/ 目錄中。

概觀

TLS 用來加密從用戶端應用程式到 SQL Server 的連線。 當已正確設定時,TLS 可為用戶端與伺服器之間的通訊同時提供私密性和安全性。 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
#Saving the certificate to the certs folder under /etc/ssl/ which has the following permission 755(drwxr-xr-x)
sudo mv mssql.pem /etc/ssl/certs/ drwxr-xr-x
#Saving the private key to the private folder under /etc/ssl/ with permissions set to 755(drwxr-xr-x)
sudo mv mssql.key /etc/ssl/private/

設定 SQL Server

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

在您的用戶端機器 (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 Management Studio

    Screenshot of SQL Server Management Studio connection dialog.

  • SQLCMD

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

  • 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),則您可能會發現連線失敗錯誤,例如下列範例:

已順利建立與伺服器的連接,但隨後在登入過程中發生錯誤。 (提供者:SSL 提供者,錯誤:0 - 遠端主機強行關閉現有的連線。) (Microsoft SQL Server,錯誤:10054)

錯誤是預設在 Ubuntu 20.04 和更新版本上啟用的 OpenSSL 安全性層級 2 所造成。 安全性層級 2 禁止建立少於 112 位元安全性的 TLS 連線。

方案

使用至少使用 112 位元安全性的簽章演算法來安裝憑證。 符合此需求的簽章演算法包括 SHA-224、SHA-256、SHA-384 和 SHA-512。