當 Connector/J 連線屬性 sslMode
設定為 VERIFY_CA
或 VERIFY_IDENTITY
時,會啟用透過伺服器憑證驗證的伺服器驗證。如果未設定 sslMode
,當舊版屬性 useSSL
和 verifyServerCertificate
都為 true 時,會啟用透過伺服器憑證驗證的伺服器驗證。
由受信任的 CA 簽署的憑證。 當啟用透過伺服器憑證驗證的伺服器驗證時,如果未對伺服器驗證進行其他設定,Java 會使用其預設的受信任 CA 憑證 (通常來自 $JAVA_HOME/lib/security/cacerts
) 來驗證伺服器憑證。
使用自我簽署的憑證。 不過,MySQL 伺服器憑證通常是自我簽署或由自我簽署的 CA 憑證簽署的;MySQL 伺服器建立的自動產生憑證和金鑰是以後者為基礎 — 也就是說,伺服器會產生所有必要的金鑰和一個自我簽署的 CA 憑證,該憑證用於簽署伺服器和用戶端憑證。然後,伺服器會將自己設定為使用 CA 憑證和伺服器憑證。雖然用戶端憑證檔案會放在相同的目錄中,但伺服器不會使用它。
為了驗證伺服器憑證,Connector/J 需要能夠讀取簽署它的憑證,也就是簽署自己的伺服器憑證或自我簽署的 CA 憑證。這可以透過將憑證 (ca.pem
或任何其他憑證) 匯入 Java 預設信任儲存庫 (雖然不建議竄改預設信任儲存庫) 或將其匯入自訂 Java 信任儲存庫檔案,並相應地設定 Connector/J 驅動程式來完成。使用 Java 的 keytool (通常位於 JDK 或 JRE 安裝的 bin
子目錄中) 匯入伺服器憑證
$> keytool -importcert -alias MySQLCACert -file ca.pem \
-keystore truststore -storepass mypassword
為命令選項提供適當的引數。如果信任儲存庫檔案尚不存在,將會建立一個新的檔案;否則,憑證將會新增至現有的檔案。與 keytool 互動看起來像這樣
Owner: CN=MySQL_Server_8.4.0_Auto_Generated_CA_Certificate
Issuer: CN=MySQL_Server_8.4.0_Auto_Generated_CA_Certificate
Serial number: 1
Valid from: Thu Mar 07 11:37:33 WET 2024 until: Sun Mar 05 11:37:33 WET 2034
Certificate fingerprints:
SHA1: 43:12:0F:96:1A:09:1C:D2:5B:62:7A:2A:55:6C:62:6A:84:5F:78:E4
SHA256: 7D:86:18:FF:06:A7:DF:A7:7C:D0:07:AB:96:1A:51:FD:02:4F:32:BF:1C:51:35:42:27:81:53:0A:8F:D3:56:39
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
Extensions:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
Trust this certificate? [no]: yes
Certificate was added to keystore
命令的輸出會顯示關於匯入憑證的所有詳細資訊。請務必記住您提供的密碼。此外,請注意,密碼必須以純文字的形式寫入您的 Connector/J 組態檔或應用程式原始碼中。
下一個步驟是設定 Java 或 Connector/J 來讀取您剛建立或修改的信任儲存庫。這可以使用下列三種方法之一完成
-
使用 Java 命令列引數
-Djavax.net.ssl.trustStore=path_to_truststore_file -Djavax.net.ssl.trustStorePassword=mypassword
-
直接在用戶端程式碼中設定系統屬性
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file"); System.setProperty("javax.net.ssl.trustStorePassword","mypassword");
-
設定 Connector/J 連線屬性
trustCertificateKeyStoreUrl=file:path_to_truststore_file trustCertificateKeyStorePassword=mypassword
請注意,當一起使用時,連線屬性會覆寫其他兩種方法所設定的值。此外,使用連線屬性設定的任何值僅在該連線中使用,而使用系統範圍值設定的值會用於所有連線 (除非被連線屬性覆寫)。將連線屬性 fallbackToSystemTrustStore
設定為 false
可防止 Connector/J 在未使用方法 (3) 時,回復至您使用方法 (1) 或 (2) 建立的系統範圍信任儲存庫設定。
透過上述設定和啟用的伺服器驗證,所有建立的連線都將會經過 SSL 加密,且在 SSL 交握程序中對伺服器進行驗證,而用戶端現在可以安全地信任其連線的伺服器。
對於 X 協定連線,連線屬性 xdevapi.ssl-truststore
、xdevapi.ssl-truststore-type
、xdevapi.ssl-truststore-password
和 xdevapi.ssl-fallbackToSystemTrustStore
指定信任儲存庫設定,就像 trustCertificateKeyStoreUrl
、trustCertificateKeyStoreType
、trustCertificateKeyStorePassword
和 fallbackToSystemTrustStore
對於 MySQL 協定連線的作用一樣;如果未明確設定,xdevapi.ssl-truststore
、xdevapi.ssl-truststore-type
、xdevapi.ssl-truststore-password
和 xdevapi.ssl-fallbackToSystemTrustStore
會分別採用 trustCertificateKeyStoreUrl
、trustCertificateKeyStoreType
、trustCertificateKeyStorePassword
和 fallbackToSystemTrustStore
的值。
服務身分驗證。 除了透過伺服器憑證驗證的伺服器驗證之外,當 sslMode
設定為 VERIFY_IDENTITY
時,Connector/J 也會執行主機名稱身分驗證,方法是檢查它用於連線的主機名稱是否與伺服器憑證中的 Common Name 值相符。