このトピックでは、SSL 暗号化を有効にした後、MySQL CLI または JDBC を使用して ApsaraDB RDS for MySQL インスタンスに接続する方法について説明します。
前提条件
SSL 暗号化が有効になっていること。有効になっていない場合は、「クラウド証明書を使用した SSL 暗号化のクイック有効化」または「カスタム証明書を使用した SSL 暗号化の有効化」をご参照ください。
データベース CA 証明書を取得していること。証明書を取得するには、「CA 証明書のダウンロード」または「カスタム証明書を使用した SSL 暗号化の有効化」をご参照ください。
操作手順
クラウド証明書を使用した MySQL への接続
SSL 暗号化を有効にした後、クライアントと ApsaraDB RDS for MySQL インスタンス間の接続が暗号化されるかどうかは、クライアントのタイプとその設定によって異なります。暗号化された接続を要求し、インスタンスの ID を検証するために、クライアント設定またはアプリケーションコードを変更できます。
MySQL 8.4、8.0、または 5.7 で、マイナーエンジンバージョンが 20241130 以降のインスタンスは、強制 SSL 暗号化をサポートしています。強制 SSL 暗号化を有効にすると、クライアントは SSL 暗号化接続でのみインスタンスに接続できます。
MySQL CLI
MySQL 5.7.11 以降のクライアントでは、接続コマンドに --ssl-mode オプションを追加して SSL 暗号化を設定できます。
MariaDB クライアントおよびバージョン 5.7.11 より前の MySQL クライアントでは、--ssl や --ssl-verify-server-cert などのオプションを使用します。詳細については、MariaDB および MySQL の公式ドキュメントをご参照ください。
--ssl-mode=DISABLED:接続は暗号化されません。
--ssl-mode=PREFERRED、または --ssl-mode オプションを指定しない場合:暗号化された接続の確立を試みます。試行が失敗した場合、クライアントは暗号化されていない接続を使用します。
--ssl-mode=REQUIRED:暗号化された接続が必要です。暗号化された接続を確立できない場合、接続は失敗します。
--ssl-mode=VERIFY_CA:暗号化された接続を要求し、ローカル CA 証明書を使用してサーバー証明書を検証します。
--ssl-mode=VERIFY_IDENTITY:暗号化された接続を要求し、ローカル CA 証明書を使用してサーバー証明書を検証し、サーバー証明書内のホスト名または IP アドレスが接続に使用されたものと一致することを検証します。
例 1:暗号化された接続の確立を試みます。試行が失敗した場合、暗号化されていない接続が使用されます。
mysql -h {endpoint} -u {username} -p --ssl-mode=PREFERRED例 2:暗号化された接続とサーバー証明書の検証を要求します。
mysql -h {endpoint} -u {username} -p --ssl-mode=VERIFY_CA --ssl-ca={path-to-ca-certificate}/ApsaraDB-CA-Chain.pem上記の例では、{endpoint}、{username}、{path-to-ca-certificate} を実際の値に置き換えてください。
--ssl-mode オプションの詳細については、MySQL の公式ドキュメントをご参照ください。
MySQL Workbench
MySQL Workbench を開き、 を選択します。
エンドポイント、ユーザー名、パスワードを入力します。
[SSL] タブで、[SSL を使用] パラメーターを設定し、[SSL CA ファイル] フィールドにダウンロードした PEM 形式の CA 証明書を指定して、[接続テスト] または [OK] をクリックします。
説明[Use SSL] パラメーターの各オプションについては、MySQL CLI セクションの --ssl-mode の説明をご参照ください。
Data Management (DMS)
Data Management (DMS) で ApsaraDB RDS for MySQL インスタンスを追加する際に、[SSL の有効化] パラメーターを設定できます。 詳細については、「Alibaba Cloud データベースインスタンスを登録する」をご参照ください。
既存のインスタンスを右クリックして [インスタンスの編集] を選択し、[詳細情報] セクションで設定を構成することもできます。
アプリケーションコード
Java
Connector/J (mysql-connector-java) は、MySQL の公式 JDBC ドライバーです。この例では、mysql-connector-java 8.0.19 を依存関係として使用します。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>次のサンプルコードでは、sslMode プロパティを使用して SSL モードを指定します。このプロパティは、mysql-connector-java 8.0.13 以降でサポートされています。それ以前のバージョンを使用する場合は、useSSL、requireSSL、verifyServerCertificate プロパティを使用する必要があります。詳細については、「MySQL ドキュメント」をご参照ください。
サンプルコード:
package com.aliyun.sample;
import com.mysql.cj.jdbc.MysqlDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class Sample {
public static void main(String[] args) {
Connection conn = null;
MysqlDataSource mysqlDS=null;
try{
mysqlDS = new MysqlDataSource();
// 必要に応じて SslMode を設定します。使用可能なオプションについては、MySQL CLI セクションをご参照ください。
mysqlDS.setSslMode("VERIFY_IDENTITY");
// トラストストアは CA 証明書を保存します。トラストストアのタイプは JKS に設定されています。
mysqlDS.setTrustCertificateKeyStoreType("JKS");
// file:/ の後のパスを、ApsaraDB-CA-Chain.jks ファイルのパスに置き換えてください。
mysqlDS.setTrustCertificateKeyStoreUrl("file:/D:\\ApsaraDB-CA-Chain\\ApsaraDB-CA-Chain.jks");
// ダウンロードした JKS ファイルのパスワードは「apsaradb」で、変更できません。
mysqlDS.setTrustCertificateKeyStorePassword("apsaradb");
// データベースエンドポイント
mysqlDS.setServerName("rm-xxxxxx.mysql.rds.aliyuncs.com");
// データベースポート
mysqlDS.setPort(3306);
// データベースユーザー名
mysqlDS.setUser("xxxxxx");
// データベースパスワード
mysqlDS.setPassword("xxxxxx");
// データベース名
mysqlDS.setDatabaseName("xxxxxx");
conn = mysqlDS.getConnection();
}catch(Exception e){
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}Python
# pymysql をインストールします:pip install pymysql
import pymysql
try:
ssl_config = {"ca":"/path/to/path/ca.crt", "mode":"VERIFY_CA"} # "ca" は CA 証明書のパス、"mode" は ssl-mode です。
conn = pymysql.connect(host='******.mysql.rds.aliyuncs.com', user='*****', passwd='******', db='*****', ssl=ssl_config)
cursor = conn.cursor()
cursor.execute('select version()')
data = cursor.fetchone()
print('Database version:', data[0])
cursor.close()
except pymysql.Error as e:
print(e)カスタム証明書を使用した MySQL への接続
MySQL CLI
MySQL 5.7.11 以降のクライアントでは、接続コマンドに --ssl-mode オプションを追加して SSL 暗号化を設定できます。
MariaDB クライアントおよびバージョン 5.7.11 より前の MySQL クライアントでは、--ssl や --ssl-verify-server-cert などのオプションを使用します。詳細については、MariaDB および MySQL の公式ドキュメントをご参照ください。
--ssl-mode=DISABLED:接続は暗号化されません。
--ssl-mode=PREFERRED、または --ssl-mode オプションを指定しない場合:暗号化された接続の確立を試みます。試行が失敗した場合、クライアントは暗号化されていない接続を使用します。
--ssl-mode=REQUIRED:暗号化された接続が必要です。暗号化された接続を確立できない場合、接続は失敗します。
--ssl-mode=VERIFY_CA:暗号化された接続を要求し、ローカル CA 証明書を使用してサーバー証明書を検証します。
--ssl-mode=VERIFY_IDENTITY:暗号化された接続を要求し、ローカル CA 証明書を使用してサーバー証明書を検証し、サーバー証明書内のホスト名または IP アドレスが接続に使用されたものと一致することを検証します。
例:
暗号化された接続の確立を試みます。試行が失敗した場合、暗号化されていない接続が使用されます。
mysql -h {endpoint} -u {username} -p --ssl-mode=PREFERRED暗号化された接続とサーバー証明書の検証を要求します。
mysql -h {endpoint} -u {username} -p --ssl-mode=VERIFY_CA --ssl-ca={path-to-custom-ca-certificate}
上記の例では、
{RDS endpoint}、{RDS username}、{CA certificate path}、および{custom CA certificate path}を実際の値に置き換える必要があります。--ssl-mode オプションの詳細については、「MySQL の公式ドキュメント」をご参照ください。
MySQL Workbench
MySQL Workbench を開き、[Database] > [Manage Connections] を選択します。
エンドポイント、ユーザー名、パスワードを入力します。
[SSL] タブで、[Use SSL] パラメーターを設定し、[SSL CA File] フィールドにカスタム CA 証明書を指定してから、[Test Connection] または [OK] をクリックします。
[Use SSL] パラメーターの各オプションについては、MySQL CLI セクションの --ssl-mode の説明をご参照ください。
Data Management (DMS)
Data Management (DMS) で ApsaraDB RDS for MySQL インスタンスを追加する際、[Enable SSL] パラメーターを設定できます。詳細については、「Alibaba Cloud データベースインスタンスの登録」をご参照ください。
既存のインスタンスを右クリックして [Edit Instance] を選択し、[詳細情報] セクションで設定することもできます。
アプリケーションコード
Java
Connector/J (mysql-connector-java) は、MySQL の公式 JDBC ドライバーです。この例では、mysql-connector-java 8.0.19 を依存関係として使用します。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>カスタム証明書を使用する場合は、次のように JKS ファイルを手動で生成する必要があります。
keytool ユーティリティは PEM 形式からのプライベートキーと証明書のインポートを直接サポートしていないため、OpenSSL を使用してクライアント証明書とプライベートキーを PKCS#12 形式に変換します。
openssl pkcs12 -export -in {custom-ca-certificate} -inkey {custom-ca-private-key} -out keystore.p12 -name ganyang -CAfile {custom-ca-certificate} # パスワードを入力します。このパスワードは接続を確立する際に必要です。 Enter Encryption Password: Verifying - Enter Encryption Password:keytool ユーティリティを使用して、PKCS#12 ファイルを新しい JKS ファイルにインポートします。
keytool -importkeystore -deststorepass JKS-password -destkeypass key-password -destkeystore keystore.jks -deststoretype pkcs12 -srckeystore keystore.p12 -srcstoretype pkcs12 -srcstorepass P12-password -alias your-aliasパラメーター:
-deststorepass:JKS ファイルのパスワード。 -destkeypass:JKS ファイル内のキーのパスワード。 -destkeystore:作成する JKS ファイルまたは既存の JKS ファイル。 -deststoretype:宛先ファイルタイプ (PKCS#12)。 -srckeystore:ソース PKCS#12 ファイル。 -srcstoretype:ソースファイルタイプ (PKCS#12)。 -srcstorepass:ソース PKCS#12 ファイルのパスワード。 -alias:クライアント証明書とプライベートキーのエイリアス。JKS ファイルの取得:インポートが成功したら、実行ディレクトリで keystore.jks ファイルを探します。
次のサンプルコードでは、sslMode プロパティを使用して SSL モードを指定します。このプロパティは、mysql-connector-java 8.0.13 以降でサポートされています。それ以前のバージョンを使用する場合は、useSSL、requireSSL、verifyServerCertificate プロパティを使用する必要があります。詳細については、「MySQL ドキュメント」をご参照ください。
package com.aliyun.sample;
import com.mysql.cj.jdbc.MysqlDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class Sample {
public static void main(String[] args) {
Connection conn = null;
MysqlDataSource mysqlDS=null;
try{
mysqlDS = new MysqlDataSource();
// 必要に応じて SslMode を設定します。使用可能なオプションについては、MySQL CLI セクションをご参照ください。
mysqlDS.setSslMode("VERIFY_IDENTITY");
// トラストストアの値は、カスタム証明書から生成した JKS ファイルのパスとパスワードに置き換えてください。
// トラストストアは CA 証明書を保存します。トラストストアのタイプは JKS に設定されています。
mysqlDS.setTrustCertificateKeyStoreType("JKS");
// file:/ の後のパスを、カスタム JKS ファイルのパスに置き換えてください。
mysqlDS.setTrustCertificateKeyStoreUrl("file:/path/to/your/keystore.jks");
// カスタム JKS ファイル作成時に設定したパスワードを使用してください。
mysqlDS.setTrustCertificateKeyStorePassword("{your-jks-password}");
// データベースエンドポイント
mysqlDS.setServerName("rm-xxxxxx.mysql.rds.aliyuncs.com");
// データベースポート
mysqlDS.setPort(3306);
// データベースユーザー名
mysqlDS.setUser("xxxxxx");
// データベースパスワード
mysqlDS.setPassword("xxxxxx");
// データベース名
mysqlDS.setDatabaseName("xxxxxx");
conn = mysqlDS.getConnection();
}catch(Exception e){
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}Python
# pymysql をインストールします:pip install pymysql
import pymysql
try:
ssl_config = {"ca":"/path/to/path/ca.crt", "mode":"VERIFY_CA"} # "ca" は CA 証明書のパス、"mode" は ssl-mode です。
conn = pymysql.connect(host='******.mysql.rds.aliyuncs.com', user='*****', passwd='******', db='*****', ssl=ssl_config)
cursor = conn.cursor()
cursor.execute('select version()')
data = cursor.fetchone()
print('Database version:', data[0])
cursor.close()
except pymysql.Error as e:
print(e)