伺服器可能會想要驗證用戶端,並要求用戶端向其提供 SSL 憑證,該憑證會根據其已知的憑證授權單位進行驗證,或者在需要時對用戶端身分執行額外的檢查 (詳細資料請參閱 CREATE USER SSL/TLS 選項)。在這種情況下,Connector/J 需要存取用戶端憑證,以便在建立新的資料庫連線時將其傳送至伺服器。這可以使用 Java 金鑰儲存檔案來完成。
為了允許用戶端驗證,連線至伺服器的用戶端必須擁有自己的金鑰和 SSL 憑證集。用戶端憑證必須經過簽署,以便伺服器可以驗證它。雖然您可以讓官方憑證授權單位簽署用戶端憑證,但更常見的做法是使用中繼、私人的 CA 憑證來簽署用戶端憑證。這種中繼 CA 憑證可以是自我簽署的,也可以由受信任的根 CA 簽署。要求是伺服器知道能夠驗證用戶端憑證的 CA 憑證。
某些 MySQL 伺服器組建能夠產生用於通訊加密的 SSL 金鑰和憑證,包括憑證和私密金鑰 (包含在 client-cert.pem
和 client-key.pem
檔案中),任何用戶端都可以使用。此 SSL 憑證已由自我簽署的 CA 憑證 ca.pem
簽署,伺服器可能已設定為使用該憑證。
如果您不想使用伺服器產生的用戶端金鑰和憑證檔案,您也可以使用 建立 SSL 和 RSA 憑證和金鑰 中描述的程序產生新的金鑰和憑證。請注意,根據伺服器的設定,您可能必須重複使用伺服器設定為使用的現有 CA 憑證來簽署新的用戶端憑證,而不是建立新的憑證。
一旦您擁有想要使用的用戶端私密金鑰和憑證檔案,您就需要將它們匯入 Java 金鑰儲存區,以便 Java SSL 程式庫和 Connector/J 可以使用它們。以下指示說明如何建立金鑰儲存區檔案
-
將用戶端金鑰和憑證檔案轉換為 PKCS #12 封存
$> openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem \ -name "mysqlclient" -passout pass:mypassword -out client-keystore.p12
-
將用戶端金鑰和憑證匯入 Java 金鑰儲存區
$> keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 \ -srcstorepass mypassword -destkeystore keystore -deststoretype JKS -deststorepass mypassword
為命令選項提供適當的引數。如果金鑰儲存區檔案尚不存在,則會建立新的檔案;否則,憑證會新增至現有檔案。keytool 的輸出看起來像這樣
Entry for alias mysqlclient successfully imported. Import command completed: 1 entries successfully imported, 0 entries failed or cancelled
請務必記住您選擇的密碼。此外,請注意,密碼必須以純文字形式寫入您的 Connector/J 組態檔案或應用程式原始碼中。
執行此步驟後,您可以刪除 PKCS #12 封存 (
在範例中)。client-keystore.p12
下一步是設定 Java 或 Connector/J,使其讀取您剛建立或修改的金鑰儲存區。這可以使用下列三種方法之一來完成
-
使用 Java 命令列引數
-Djavax.net.ssl.keyStore=path_to_keystore_file -Djavax.net.ssl.keyStorePassword=mypassword
-
直接在用戶端程式碼中設定系統屬性
System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file"); System.setProperty("javax.net.ssl.keyStorePassword","mypassword");
-
透過 Connector/J 連線屬性
clientCertificateKeyStoreUrl=file:path_to_truststore_file clientCertificateKeyStorePassword=mypassword
請注意,當一起使用時,連線屬性會覆寫其他兩種方法設定的值。此外,使用連線屬性設定的任何值僅在該連線中使用,而使用系統範圍值設定的值會用於所有連線 (除非被連線屬性覆寫)。設定連線屬性 fallbackToSystemKeyStore
為 false
可防止 Connector/J 在未使用方法 (3) 時,回復為您使用方法 (1) 或 (2) 建立的系統範圍金鑰儲存區設定。
透過以上設定,建立的所有連線都將使用 SSL 加密,並且在 SSL 交握過程中驗證用戶端,而且伺服器現在可以安全地信任要求連線至它的用戶端。
對於 X 通訊協定連線,連線屬性 xdevapi.ssl-keystore
、xdevapi.ssl-keystore-type
、xdevapi.ssl-keystore-password
和 xdevapi.ssl-fallbackToSystemKeyStore
會指定金鑰儲存區設定,就像 trustCertificateKeyStoreUrl
、trustCertificateKeyStoreType
、trustCertificateKeyStorePassword
和 fallbackToSystemTKeyStore
對於 MySQL 通訊協定連線一樣;如果未明確設定,xdevapi.ssl-keystore
、xdevapi.ssl-keystore-type
、xdevapi.ssl-keystore-password
和 xdevapi.ssl-fallbackToSystemKeyStore
會分別採用 clientCertificateKeyStoreUrl
、clientCertificateKeyStoreType
、clientCertificateKeyStorePassword
和 fallbackToSystemKeyStore
的值。