加密 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_KEYEXCHANGE
的KeySpec
選項來建立。 通常,憑證的金鑰使用方法屬性 (KEY_USAGE
) 也包括金鑰編密 (CERT_KEY_ENCIPHERMENT_KEY_USAGE
)。憑證的
Subject
屬性必須指出一般名稱 (CN) 與伺服器電腦的主機名稱或完整網域名稱 (FQDN) 相同。注意
支援萬用字元憑證。
設定要使用的 OpenSSL 程式庫 (選擇性)
您可以在 /opt/mssql/lib/
目錄中建立會參考應使用哪些 libcrypto.so
和 libssl.so
程式庫來進行加密的符號連結。 如果您想要強制 SQL Server 使用特定版本的 OpenSSL 而不是系統提供的預設值,這會相當有用。 如果這些符號連結不存在,SQL Server 就會在系統上載入預設設定的 OpenSSL 程式庫。
這些符號連結應該命名為 libcrypto.so
和 libssl.so
,並放在 /opt/mssql/lib/
目錄中。
注意
如需使用 Let's Encrypt 產生憑證的範例,請參閱部落格文章使用 Linux 上的 SQL Server azure VM 和 Azure AI 搜尋來解除鎖定 Azure 中的數據能力。
概觀
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
範例連接字串
警告
一律使用強密碼。 如需詳細資訊,請參閱< Password Policy>。
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),則您可能會發現連線失敗錯誤,例如下列範例:
已順利建立與伺服器的連接,但隨後在登入過程中發生錯誤。 (提供者:SSL 提供者,錯誤:0 - 遠端主機強行關閉現有的連線。) (Microsoft SQL Server,錯誤:10054)
錯誤是預設在 Ubuntu 20.04 和更新版本上啟用的 OpenSSL 安全性層級 2 所造成。 安全性層級 2 禁止建立少於 112 位元安全性的 TLS 連線。
方案
使用至少使用 112 位元安全性的簽章演算法來安裝憑證。 符合此需求的簽章演算法包括 SHA-224、SHA-256、SHA-384 和 SHA-512。