Connector/J 可以使用 SSL 加密 JDBC 驅動程式和伺服器之間傳輸的所有資料(初始交握除外)。啟用連線加密會產生效能損失,其嚴重性取決於多個因素,包括(但不限於)查詢大小、傳回的資料量、伺服器硬體、使用的 SSL 程式庫、網路頻寬等等。
此系統透過兩個 Java 金鑰儲存檔運作:一個檔案包含伺服器的憑證資訊(以下範例中的 truststore
),另一個檔案包含用戶端的金鑰和憑證(以下範例中的 keystore
)。所有 Java 金鑰儲存檔都受到您在建立檔案時提供給 keytool 的密碼保護。您需要檔案名稱和相關聯的密碼才能建立 SSL 連線。
為了讓 SSL 支援運作,您必須具有下列項目
支援 SSL 的 MySQL 伺服器,並且已編譯和設定為如此。如需詳細資訊,請參閱使用加密連線和設定 SSL 程式庫支援。
如果使用雙向(雙向)驗證,則必須有已簽署的用戶端憑證。
預設情況下,Connector/J 會與 MySQL 伺服器建立安全連線。請注意,使用 OpenSSL 編譯的 MySQL 伺服器 5.7 及更高版本,可以在啟動時自動產生遺失的 SSL 檔案並相應地設定 SSL 連線。
對於 8.0.12 及更早版本:只要伺服器已正確設定為使用 SSL,就不需要在 Connector/J 用戶端上設定任何項目來使用加密連線(例外情況是當 Connector/J 連接到非常舊的伺服器版本,例如 5.6.25 及更早版本或 5.7.5 及更早版本時,在這種情況下,用戶端必須設定連線屬性 useSSL=true
才能使用加密連線)。用戶端可以透過設定連線屬性 requireSSL=true
來要求使用 SSL;如果伺服器未設定為使用 SSL,則連線會失敗。如果沒有 requireSSL=true
,如果伺服器未設定為使用 SSL,則連線只會回復為非加密模式。
對於 8.0.13 及更高版本:只要伺服器已正確設定為使用 SSL,就不需要在 Connector/J 用戶端上設定任何項目來使用加密連線。用戶端可以透過設定連線屬性 sslMode=REQUIRED
、VERIFY_CA
或 VERIFY_IDENTITY
來要求使用 SSL;如果伺服器未設定為使用 SSL,則連線會失敗。如果使用 sslMode=PREFERRED
,如果伺服器未設定為使用 SSL,則連線只會回復為非加密模式。對於 X-Protocol 連線,連線屬性 xdevapi.ssl-mode
指定 SSL 模式設定,就像 sslMode
對於 MySQL-protocol 連線一樣(不同之處在於 X Protocol 不支援 PREFERRED
);如果未明確設定,則 xdevapi.ssl-mode
會採用 sslMode
的值(如果未設定 xdevapi.ssl-mode
,且 sslMode
設定為 PREFERRED
,則 xdevapi.ssl-mode
會設定為 REQUIRED
)。
為了提高安全性,您可以設定用戶端進行單向(伺服器或用戶端)或雙向(伺服器和用戶端)SSL 驗證,允許用戶端或伺服器驗證彼此的身分。
TLS 版本:可以使用連線屬性 tlsVersions
,以及對於 X DevAPI 連線和 8.0.19 及更高版本,可以使用 xdevapi.tls-versions
來限制允許的 TLS 通訊協定版本(未指定 xdevapi.tls-versions
時,它會採用 tlsVersions
的值)。如果未指定任何此類限制,Connector/J 會嘗試使用 TLSv1.2 和 TLSv1.3 連接到伺服器。
自 Connector/J 8.0.28 起,連線屬性
enabledTLSProtocols
已重新命名為tlsVersions
,而enabledSSLCipherSuites
已重新命名為tlsCiphersuites
;原始名稱仍保留為別名。對於 Connector/J 8.0.26 及更高版本:TLSv1 和 TLSv1.1 已在 Connector/J 8.0.26 中棄用,並在 8.0.28 版本中移除;移除的值被認為對連線選項和工作階段設定無效。可以使用更安全的 TLSv1.2 和 TLSv1.3 通訊協定進行連線。使用 TLSv1.3 需要使用 OpenSSL 1.1.1 或更高版本編譯伺服器,並且使用支援 TLSv1.3 的 JVM 執行 Connector/J(例如,Oracle Java 8u261 及更高版本)。
對於使用 JDBC API 連接到 MySQL Community Server 5.6 和 5.7 的 Connector/J 8.0.18 及更早版本:由於與使用 yaSSL 編譯的 MySQL Server 存在相容性問題,Connector/J 預設不會啟用使用 TLSv1.2 及更高版本的連線。連線到限制連線使用這些更高 TLS 版本的伺服器時,請透過設定 Connector/J 連線屬性
enabledTLSProtocols
來明確啟用它們(例如,設定enabledTLSProtocols=TLSv1.2,TLSv1.3
)。
加密套件:自 8.0.19 版本起,Connector/J 可使用的加密套件會預先由屬性檔案限制,該檔案位於原始程式碼樹中 src
資料夾內的 src/main/resources/com/mysql/cj/TlsSettings.properties
,或在 Connector/J 的與平台無關的發行版本封存檔(.tar.gz
或 .zip
格式)中。該檔案包含四個區段,每個區段列出強制性、核准、已棄用和不可接受的加密。只能使用前三個區段中列出的套件。最後一個區段(不可接受)定義了封鎖不安全加密套件的模式或遮罩。實際上,由於前三個區段中已提供允許清單,因此第四個區段中的封鎖清單模式是多餘的;但它們作為額外保護措施來防止不需要的加密。加密套件的允許清單和封鎖清單適用於 JDBC 和 X DevAPI 連線。
可以使用連線屬性 tlsCiphersuites
來限制 SSL 連線允許的加密套件,而對於 X DevAPI 連線以及 8.0.19 及更高版本,則可以使用 xdevapi.tls-ciphersuites
(當未指定 xdevapi.tls-ciphersuites
時,會採用 tlsCiphersuites
的值)。如果沒有指定這些限制,Connector/J 會嘗試建立 SSL 連線,並使用伺服器接受的任何允許清單中的加密套件。