了解加密支援
連線到 SQL Server 時,如果應用程式要求加密且 SQL Server 的執行個體設定為支援 TLS 加密,則 Microsoft JDBC 驅動程式會起始 TLS 交握。 交握可讓伺服器與用戶端交涉要用來保護資料的加密和密碼編譯演算法。 TLS 交握完成後,用戶端和伺服器就可以安全地傳送加密的資料。 在 TLS 交握期間,伺服器會將其公開金鑰憑證傳送到用戶端。 公開金鑰憑證的發行者也就是所謂的「憑證授權單位 (CA)」。 用戶端負責驗證憑證授權單位為用戶端所信任的憑證授權單位。
如果應用程式沒有要求加密,適用於 SQL Server 的 Microsoft JDBC 驅動程式就不會強制SQL Server 支援 TLS 加密。 如果 SQL Server 執行個體未設定為強制 TLS 加密,則不使用加密即可建立連線。 如果 SQL Server 執行個體設定為強制 TLS 加密,則在正確設定的 Java Virtual Machine (JVM) 上執行時,此驅動程式將會自動啟用 TLS 加密,否則連線會中止,而且驅動程式會引發錯誤。
注意
確定傳遞給 serverName 的值完全符合伺服器憑證中主旨替代名稱 (SAN) 內的一般名稱 (CN) 或 DNS 名稱,TLS 連線才會成功。
如需如何為 SQL Server 設定 TLS 的詳細資訊,請參閱啟用資料庫引擎的加密連線。
備註
為了讓應用程式能夠使用 TLS 加密,適用於 SQL Server 的 Microsoft JDBC 驅動程式已從 1.2 版起引入下列連線屬性:encrypt、trustServerCertificate、trustStore、trustStorePassword 和 hostNameInCertificate。 為了允許驅動程式搭配 TLS 加密使用 TDS 8.0,從 11.2 版開始,已引進連線屬性 serverCertificate。 如需詳細資訊,請參閱設定連線屬性。
下表摘要說明適用於 SQL Server 的 Microsoft JDBC 驅動程式版本如何針對可能的 TLS 連線狀況運作。 每個狀況都使用一組不同的 TLS 連線屬性。 此資料表包括:
- 空白:「屬性不存在於連接字串中」
- value:「屬性存在於連接字串中,而且其值有效」
- 任意:「屬性是否存在於連接字串中,或者其值是否有效都不重要」
注意
相同的行為也適用於 SQL Server 使用者驗證與 Windows 整合式驗證。
屬性設定 | 行為 |
---|---|
encrypt = false 或空白 trustServerCertificate = any hostNameInCertificate = any trustStore = any trustStorePassword = any |
驅動程式不會強制伺服器支援 TLS 加密。 如果伺服器有自我簽署憑證,驅動程式會起始 TLS 憑證交換。 TLS 憑證將不會經過驗證,且只有認證 (在登入封包中) 會經過加密。 如果伺服器需要用戶端支援 TLS 加密,驅動程式將會起始 TLS 憑證交換。 TLS 憑證將不會經過驗證,但是整個通訊將會經過加密。 |
encrypt = true trustServerCertificate = true hostNameInCertificate = any trustStore = any trustStorePassword = any |
驅動程式要求搭配伺服器使用 TLS 加密。 如果伺服器要求用戶端支援 TLS 加密,或者,如果伺服器支援加密,驅動程式將會起始 TLS 憑證交換。 若將 trustServerCertificate 屬性設為 "true",則驅動程式將不會驗證 TLS 憑證。 如果伺服器的設定不支援加密,驅動程式將引發錯誤,並中止連線。 |
encrypt = true trustServerCertificate = false 或空白 hostNameInCertificate = 空白 trustStore = 空白 trustStorePassword = 空白 |
驅動程式要求搭配伺服器使用 TLS 加密。 如果伺服器要求用戶端支援 TLS 加密,或者,如果伺服器支援加密,驅動程式將會起始 TLS 憑證交換。 驅動程式將使用在連線 URL 上指定的 serverName 屬性,驗證伺服器 TLS 憑證,並依賴信任管理員 Factory 的查閱規則來決定要使用的憑證存放區。 如果伺服器的設定不支援加密,驅動程式將引發錯誤,並中止連線。 |
encrypt = true trustServerCertificate = false 或空白 hostNameInCertificate = 值 trustStore = 空白 trustStorePassword = 空白 |
驅動程式要求搭配伺服器使用 TLS 加密。 如果伺服器要求用戶端支援 TLS 加密,或者,如果伺服器支援加密,驅動程式將會起始 TLS 憑證交換。 驅動程式將會使用針對 hostNameInCertificate 屬性指定的值,驗證 TLS 憑證的主旨值。 如果伺服器的設定不支援加密,驅動程式將引發錯誤,並中止連線。 |
encrypt = true trustServerCertificate = false 或空白 hostNameInCertificate = 空白 trustStore = 值 trustStorePassword = 值 |
驅動程式要求搭配伺服器使用 TLS 加密。 如果伺服器要求用戶端支援 TLS 加密,或者,如果伺服器支援加密,驅動程式將會起始 TLS 憑證交換。 驅動程式將會使用 trustStore 屬性值來尋找憑證 trustStore 檔案與 trustStorePassword 屬性值以檢查 trustStore 檔案的完整性。 如果伺服器的設定不支援加密,驅動程式將引發錯誤,並中止連線。 |
encrypt = true trustServerCertificate = false 或空白 hostNameInCertificate = 空白 trustStore = 空白 trustStorePassword = 值 |
驅動程式要求搭配伺服器使用 TLS 加密。 如果伺服器要求用戶端支援 TLS 加密,或者,如果伺服器支援加密,驅動程式將會起始 TLS 憑證交換。 驅動程式將會使用 trustStorePassword 屬性值來檢查預設 trustStore 檔案的完整性。 如果伺服器的設定不支援加密,驅動程式將引發錯誤,並中止連線。 |
encrypt = true trustServerCertificate = false 或空白 hostNameInCertificate = 空白 trustStore = 值 trustStorePassword = 空白 |
驅動程式要求搭配伺服器使用 TLS 加密。 如果伺服器要求用戶端支援 TLS 加密,或者,如果伺服器支援加密,驅動程式將會起始 TLS 憑證交換。 驅動程式將會使用 trustStore 屬性值來查閱 trustStore 檔案的位置。 如果伺服器的設定不支援加密,驅動程式將引發錯誤,並中止連線。 |
encrypt = true trustServerCertificate = false 或空白 hostNameInCertificate = 值 trustStore = 空白 trustStorePassword = 值 |
驅動程式要求搭配伺服器使用 TLS 加密。 如果伺服器要求用戶端支援 TLS 加密,或者,如果伺服器支援加密,驅動程式將會起始 TLS 憑證交換。 驅動程式將會使用 trustStorePassword 屬性值來檢查預設 trustStore 檔案的完整性。 此外,驅動程式將會使用 hostNameInCertificate 屬性值來驗證 TLS 憑證。 如果伺服器的設定不支援加密,驅動程式將引發錯誤,並中止連線。 |
encrypt = true trustServerCertificate = false 或空白 hostNameInCertificate = 值 trustStore = 值 trustStorePassword = 空白 |
驅動程式要求搭配伺服器使用 TLS 加密。 如果伺服器要求用戶端支援 TLS 加密,或者,如果伺服器支援加密,驅動程式將會起始 TLS 憑證交換。 驅動程式將會使用 trustStore 屬性值來查閱 trustStore 檔案的位置。 此外,驅動程式將會使用 hostNameInCertificate 屬性值來驗證 TLS 憑證。 如果伺服器的設定不支援加密,驅動程式將引發錯誤,並中止連線。 |
encrypt = true trustServerCertificate = false 或空白 hostNameInCertificate = 值 trustStore = 值 trustStorePassword = 值 |
驅動程式要求搭配伺服器使用 TLS 加密。 如果伺服器要求用戶端支援 TLS 加密,或者,如果伺服器支援加密,驅動程式將會起始 TLS 憑證交換。 驅動程式將會使用 trustStore 屬性值來尋找憑證 trustStore 檔案與 trustStorePassword 屬性值以檢查 trustStore 檔案的完整性。 此外,驅動程式將會使用 hostNameInCertificate 屬性值來驗證 TLS 憑證。 如果伺服器的設定不支援加密,驅動程式將引發錯誤,並中止連線。 |
encrypt = strict hostNameInCertificate = 值 trustStore = 空白 trustStorePassword = 空白 serverCertificate = 值 |
驅動程式要求搭配伺服器使用 TDS 8.0 strict TLS 加密。驅動程式會起始 TLS 交握和與伺服器憑證交換,做為第一個動作。 trustServerCertificate 設定在 strict 模式中會予以忽略並視為 false。驅動程式會使用選擇性的 hostNameInCertificate 或 serverCertificate 屬性來驗證伺服器 TLS 憑證。 如果伺服器的設定不支援 TDS 8 連線,驅動程式將引發錯誤,並中止連線。 |
如果 encrypt 屬性設定為 true,適用於 SQL Server 的 Microsoft JDBC 驅動程式就會使用 JVM 的預設 JSSE 安全性提供者來與 SQL Server 交涉 TLS 加密。 預設的安全性提供者可能不支援成功交涉 TLS 加密所需的所有功能。 例如,預設的安全性提供者可能不支援 SQL Server TLS 憑證中所使用 RSA 公開金鑰的大小。 在此情況下,預設的安全性提供者可能會引發錯誤,造成 JDBC 驅動程式中止連接。 為了解決此問題,您可使用下列其中一個選項:
- 利用 RSA 公開金鑰較小的伺服器憑證設定 SQL Server
- 設定 JVM 在「<java-home>/lib/security/java.security」安全性屬性檔中使用不同的 JSSE 安全性提供者
- 使用不同的 JVM
驗證伺服器 TLS 憑證
在 TLS 交握期間,伺服器會將其公開金鑰憑證傳送到用戶端。 JDBC 驅動程式或用戶端必須驗證伺服器憑證是由用戶端所信任的憑證授權單位發行。 驅動程式會要求伺服器憑證須符合下列條件:
- 憑證由信任的憑證授權單位所發行。
- 憑證必須針對伺服器驗證而發行。
- 憑證未過期。
- 憑證之主旨內的一般名稱 (CN) 或是主旨替代名稱 (SAN) 內的 DNS 名稱會完全符合連接字串內所指定的 serverName 值或是 hostNameInCertificate 屬性值 (如果指定的話)。
- DNS 名稱可包含萬用字元。 舊版 7.2 適用於 SQL Server 的 Microsoft JDBC 驅動程式不支援萬用字元比對。 也就是說,abc.com 不會符合 *.com 但 *.com 會符合 *.com。 使用 7.2 版和更高版本時,支援標準憑證萬用字元比對。
為了搭配 strict
加密使用 TDS 8.0,serverCertifcate 屬性值提供伺服器憑證的路徑,以供伺服器憑證驗證使用。 此檔案必須使用 PEM 檔案格式。 從伺服器收到的憑證必須完全符合此憑證。