文件首頁
MySQL Connector/J 開發者指南
相關文件 下載本手冊
PDF (美式信紙) - 1.2Mb
PDF (A4) - 1.2Mb


6.9.2 設定用戶端驗證

伺服器可能會想要驗證用戶端,並要求用戶端向其提供 SSL 憑證,該憑證會根據其已知的憑證授權單位進行驗證,或者在需要時對用戶端身分執行額外的檢查 (詳細資料請參閱 CREATE USER SSL/TLS 選項)。在這種情況下,Connector/J 需要存取用戶端憑證,以便在建立新的資料庫連線時將其傳送至伺服器。這可以使用 Java 金鑰儲存檔案來完成。

為了允許用戶端驗證,連線至伺服器的用戶端必須擁有自己的金鑰和 SSL 憑證集。用戶端憑證必須經過簽署,以便伺服器可以驗證它。雖然您可以讓官方憑證授權單位簽署用戶端憑證,但更常見的做法是使用中繼、私人的 CA 憑證來簽署用戶端憑證。這種中繼 CA 憑證可以是自我簽署的,也可以由受信任的根 CA 簽署。要求是伺服器知道能夠驗證用戶端憑證的 CA 憑證。

某些 MySQL 伺服器組建能夠產生用於通訊加密的 SSL 金鑰和憑證,包括憑證和私密金鑰 (包含在 client-cert.pemclient-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,使其讀取您剛建立或修改的金鑰儲存區。這可以使用下列三種方法之一來完成

  1. 使用 Java 命令列引數

    -Djavax.net.ssl.keyStore=path_to_keystore_file
    -Djavax.net.ssl.keyStorePassword=mypassword

  2. 直接在用戶端程式碼中設定系統屬性

    System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file"); 
    System.setProperty("javax.net.ssl.keyStorePassword","mypassword");

  3. 透過 Connector/J 連線屬性

    clientCertificateKeyStoreUrl=file:path_to_truststore_file 
    clientCertificateKeyStorePassword=mypassword

請注意,當一起使用時,連線屬性會覆寫其他兩種方法設定的值。此外,使用連線屬性設定的任何值僅在該連線中使用,而使用系統範圍值設定的值會用於所有連線 (除非被連線屬性覆寫)。設定連線屬性 fallbackToSystemKeyStorefalse 可防止 Connector/J 在未使用方法 (3) 時,回復為您使用方法 (1) 或 (2) 建立的系統範圍金鑰儲存區設定。

透過以上設定,建立的所有連線都將使用 SSL 加密,並且在 SSL 交握過程中驗證用戶端,而且伺服器現在可以安全地信任要求連線至它的用戶端。

對於 X 通訊協定連線,連線屬性 xdevapi.ssl-keystorexdevapi.ssl-keystore-typexdevapi.ssl-keystore-passwordxdevapi.ssl-fallbackToSystemKeyStore 會指定金鑰儲存區設定,就像 trustCertificateKeyStoreUrltrustCertificateKeyStoreTypetrustCertificateKeyStorePasswordfallbackToSystemTKeyStore 對於 MySQL 通訊協定連線一樣;如果未明確設定,xdevapi.ssl-keystorexdevapi.ssl-keystore-typexdevapi.ssl-keystore-passwordxdevapi.ssl-fallbackToSystemKeyStore 會分別採用 clientCertificateKeyStoreUrlclientCertificateKeyStoreTypeclientCertificateKeyStorePasswordfallbackToSystemKeyStore 的值。