すべてのプロダクト
Search
ドキュメントセンター

Key Management Service:Secrets JDBC クライアント

最終更新日:Nov 09, 2025

Java Database Connectivity (JDBC) を使用してデータベースに接続する場合、データベースのアカウントとパスワードを RDS シークレットまたは汎用シークレットに保存できます。その後、secrets JDBC クライアントをアプリケーションに統合して、Key Management Service (KMS) で管理されているシークレットを使用してデータベース接続を認証できます。このトピックでは、secrets JDBC クライアントのインストール方法と使用方法について説明します。

SDK の概要

secrets JDBC クライアントは、JDBC を使用してデータベースに接続するシナリオ向けに設計されています。クライアントは KMS からシークレットを自動的に取得してデータベース接続を認証するため、統合が簡素化されます。シークレットを取得して使用する必要がある他のシナリオでは、secrets クライアントを使用することをお勧めします。または、KMS インスタンス SDK または Alibaba Cloud SDK を使用することもできます。詳細については、「SDK リファレンス」をご参照ください。

説明

シークレットの管理操作は、Alibaba Cloud SDK を使用してのみ実行できます。

secrets JDBC クライアントは、次の特徴を提供します。

  • c3p0 や DBCP などの接続プール内のデータベース接続、およびデータソースを含む JDBC をサポートします。

  • MySQL、SQL Server、PostgreSQL、MariaDB の 4 種類のデータベースをサポートします。

  • カスタムのシークレット更新頻度をサポートします。

注意事項

  • サポートされるシークレットタイプ: 汎用シークレットと RDS シークレット。

    • RDS シークレットを使用する場合は、デュアルアカウントで管理される RDS シークレットを使用することをお勧めします。

    • 汎用シークレットを使用する場合、シークレット値は次の JSON フォーマットである必要があります。

      {
          "AccountName":"<your_database_account_username>",
          "AccountPassword":"<your_database_account_password>"
      }
  • サポートされるプログラミング言語: Java 8 以降。

  • サポートされるデータベース接続プール: c3p0、DBCP、および Druid。

    重要

    Spring Boot のデフォルトの HikariCP 接続プールは、JDBC エラーコードを標準的な方法で処理しません。これにより、KMS シークレットのリフレッシュが失敗する可能性があります。

ステップ 1: アクセス資格情報の作成

シナリオ 1: 共有ゲートウェイを使用してシークレット値を取得する

インターネットまたは VPC (Virtual Private Cloud) を使用できます。サポートされている RAM ベースの認証方式には、Elastic Compute Service (ECS) インスタンスのインスタンス RAM ロール、RamRoleArn、セキュリティトークンサービス (STS) トークン、および AccessKey が含まれます。詳細については、「アクセス資格情報の管理」をご参照ください。

ECS インスタンス RAM ロール

RamRoleArn

STS トークン

AccessKey

ClientKey (非推奨)

シナリオ 2: 専用ゲートウェイを使用してシークレット値を取得する (非推奨)

このシナリオでは、KMS プライベートネットワークを使用します。アクセス資格情報として使用できるのは ClientKey のみです。

ステップ 2: クライアントのインストール

Maven を使用して、プロジェクトに secrets JDBC クライアントをインストールできます。

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-secretsmanager-jdbc</artifactId>
    <version>x.x.x</version>
</dependency>
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>4.x.x</version>
</dependency>
説明

SDK の 最新バージョン をインストールすることをお勧めします。インストールとソースコードの詳細については、「aliyun-secretsmanager-jdbc」をご参照ください。

ステップ 3: secretsmanager.properties 構成ファイルを使用してクライアントを初期化する

secretsmanager.properties 構成ファイルをプロジェクトに追加します。パラメーターは、使用するアクセス資格情報によって異なります。

AccessKey

## アクセス資格情報のタイプ。
credentials_type=ak
## AccessKey ID。
credentials_access_key_id=#credentials_access_key_id#
## AccessKey Secret。
credentials_access_secret=#credentials_access_secret#
## 関連付けられた KMS サービスのリージョン。
cache_client_region_id=[{"regionId":"#regionId#"}]
## カスタムの更新頻度。デフォルト値: 6 時間。最小値: 5 分。単位: ミリ秒。
refresh_secret_ttl=21600000

RAMRoleArn

## アクセス資格情報のタイプ。
credentials_type=ram_role
## AccessKey ID。
credentials_access_key_id=#credentials_access_key_id#
## AccessKey Secret。
credentials_access_secret=#credentials_access_secret#
## アクセス資格情報に関連付けられたセッションの名前。
credentials_role_session_name=#credentials_role_session_name#
## RAM ロールの ARN。
credentials_role_arn=#credentials_role_arn#
## アクセス資格情報のポリシー。
credentials_policy=#credentials_policy#
## 関連付けられた KMS サービスのリージョン。
cache_client_region_id=[{"regionId":"#regionId#"}]
## カスタムの更新頻度。デフォルト値: 6 時間。最小値: 5 分。単位: ミリ秒。
refresh_secret_ttl=21600000

ECS インスタンス RAM ロール

## アクセス資格情報のタイプ。
credentials_type=ecs_ram_role
## ECS RAM ロールの名前。
credentials_role_name=#credentials_role_name#
## 関連付けられた KMS サービスのリージョン。
cache_client_region_id=[{"regionId":"#regionId#"}]
## カスタムの更新頻度。デフォルト値: 6 時間。最小値: 5 分。単位: ミリ秒。
refresh_secret_ttl=21600000

STS トークン

## アクセス資格情報のタイプ。
credentials_type=sts
## AccessKey ID。
credentials_access_key_id=#credentials_access_key_id#
## AccessKey Secret。
credentials_access_secret=#credentials_access_secret#
## アクセス資格情報に関連付けられたセッションの名前。
credentials_role_session_name=#credentials_role_session_name#
## RAM ロールの ARN。
credentials_role_arn=#credentials_role_arn#
## アクセス資格情報のポリシー。
credentials_policy=#credentials_policy#
## 関連付けられた KMS サービスのリージョン。
cache_client_region_id=[{"regionId":"#regionId#"}]
## カスタムの更新頻度。デフォルト値: 6 時間。最小値: 5 分。単位: ミリ秒。
refresh_secret_ttl=21600000

ClientKey (共有ゲートウェイ)

## アクセス資格情報のタイプ。
credentials_type=client_key
# ClientKey ファイルのパス。
client_key_private_key_path=#your client key private key file path#
## ClientKey の復号パスワード。パスワードは環境変数またはファイルから読み取ることができます。
client_key_password_from_env_variable=#your client key private key password environment variable name#
client_key_password_from_file_path=#your client key private key password file path#
## 関連付けられた KMS サービスのリージョン。
cache_client_region_id=[{"regionId":"#regionId#"}]
## カスタムの更新頻度。デフォルト値: 6 時間。最小値: 5 分。単位: ミリ秒。
## 次の構成では、シークレットの更新頻度を 1 時間に設定します。
refresh_secret_ttl=3600000

ClientKey (専用ゲートウェイ)

  • 方法 1: 環境変数からクライアントキーのパスワードを取得する

    cache_client_dkms_config_info=[{"regionId":"<DKMS_REGION_ID>","endpoint":"<DKMS_ENDPOINT>","passwordFromEnvVariable":"<PASSWORD_ENV_VARIABLE>","clientKeyFile":"<CLIENT_KEY_FILE_PATH>","ignoreSslCerts":false,"caFilePath":"<CA_CERTIFICATE_FILE_PATH>"}]

    ファイルを設定する前に、カスタム名で環境変数を定義し、クライアントキーのパスワードをその値として設定します。次に、<PASSWORD_ENV_VARIABLE> を変数名に置き換えます。

    例:

    cache_client_dkms_config_info=[{"regionId":"ap-southeast-1","endpoint":"kst-hzz634e67d126u9p9****.cryptoservice.kms.aliyuncs.com","passwordFromEnvVariable":"passwordFromEnvVariable","clientKeyFile":"C:\RamSecretPlugin\src\main\resources\clientKey_KAAP.json","ignoreSslCerts":false,"caFilePath":"C:\RamSecretPlugin\src\main\resources\PrivateKmsCA_kst-hzz634e67d126u9p9****.pem"}]
  • 方法 2: ファイルからクライアントキーのパスワードを取得する

    ダウンロード後の [Client Key Password (ClientKeyPassword)] のデフォルトのファイル名は clientKey_****_Password.txt です。ファイルの名前を変更できますが、cache_client_dkms_config_info の値にある <your Client Key file path> を新しいファイルパスに置き換える必要があります。

    cache_client_dkms_config_info=[{"regionId":"<your dkms regionId >","endpoint":"<your dkms endpoint>","passwordFromFilePath":"< your password file path >","clientKeyFile":"<your Client Key file path>","ignoreSslCerts":false,"caFilePath":"<your CA certificate file path>"}]

    例:

    cache_client_dkms_config_info=[{"regionId":"cn-hangzhou","endpoint":"kst-hzz634e67d126u9p9****.cryptoservice.kms.aliyuncs.com","passwordFromFilePath":"C:\RamSecretPlugin\src\main\resources\clientKeyPassword.txt","clientKeyFile":"C:\RamSecretPlugin\src\main\resources\clientKey_KAAP.json","ignoreSslCerts":false,"caFilePath":"C:\RamSecretPlugin\src\main\resources\PrivateKmsCA_kst-hzz634e67d126u9p9****.pem"}]

パラメーターの説明

パラメーター

説明

注意

regionId

KMS インスタンスのリージョン ID。

特定のリージョン ID については、「リージョンとゾーン」をご参照ください。

endpoint

KMS インスタンスのドメイン名。フォーマットは {インスタンス ID}.kms.aliyuncs.com です。

インスタンス管理 ページにアクセスし、インスタンスの詳細ページで インスタンス VPC エンドポイント を確認します。これがエンドポイントです。

clientKeyFile

JSON フォーマットのクライアントキーファイルへの絶対パスまたは相対パス。

  • クライアントキーファイル: アプリケーションアクセスポイント (AAP) でクライアントキーを作成するときにダウンロードされる Application Access Secret。ダウンロード後のデフォルトのファイル名は ClientKey_******.json です。

  • パスワード: AAP でクライアントキーを作成するときにダウンロードされるクライアントキーのパスワード。ダウンロード後のデフォルトのファイル名は ClientKey_******_password.txt です。

重要

各クライアントキーには一意のパスワードがあり、どちらも作成時にのみ生成されます。どちらかを紛失した場合は、AAP で新しいクライアントキーを作成する必要があります。手順については、「アプリケーションアクセスポイントの作成」をご参照ください。

passwordFromFilePath または passwordFromEnvVariable

  • passwordFromFilePath: ファイルからパスワードを取得します。値は、クライアントキーのパスワードを含むファイルへの絶対パスまたは相対パスです。

  • passwordFromEnvVariable: 環境変数からパスワードを取得します。値は、クライアントキーのパスワードを値とする環境変数の名前です。

ignoreSslCerts

KMS インスタンスの SSL 証明書の有効性チェックを無視するかどうかを指定します。KMS インスタンスには、ID 検証および SSL または TLS 暗号化通信に使用される組み込みの SSL 証明書があります。有効な値:

  • true: 有効性チェックは無視されます。

    値が true の場合、[caFilePath] パラメーターは不要です。

  • false: 有効性チェックが実行されます。

本番環境では、このパラメーターを false に設定してください。

caFilePath

KMS インスタンスの認証局 (CA) 証明書ファイルへの絶対パスまたは相対パス。

CA 証明書は、証明書の発行者、有効期間、ドメイン名が KMS エンドポイントと一致するかどうかなどのチェックを含め、KMS インスタンスの SSL 証明書を検証します。

インスタンス管理 ページにアクセスします。インスタンスの詳細ページで、Instance CA Certificate セクションの ダウンロード をクリックします。

ステップ 4: secrets JDBC クライアントを使用してデータベースに接続する

重要

この例では、変更が必要なプロパティのみを提供します。必要に応じて他のプロパティを設定できます。

JDBC を使用してデータベースに接続する

  • MySQL データベース

    説明

    サンプルコードの #your-mysql-secret-name#<your-mysql-ip><your-mysql-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class SecretManagerJDBCSample {
        public static void main(String[] args) throws Exception {
            // Alibaba Cloud secrets JDBC クライアント com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver をロードします。
            Class.forName("com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver");
            Connection connect = null;
            try {
                connect = DriverManager.getConnection("secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>", "#your-mysql-secret-name#","");
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }
  • SQL Server データベース

    説明

    サンプルコードの #your-sqlserver-secret-name#<your-sqlserver-ip><your-sqlserver-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class SecretManagerJDBCSqlServerSample {
    
        public static void main(String[] args) throws Exception{
            // Alibaba Cloud secrets JDBC クライアント com.aliyun.kms.secretsmanager.MssqlSecretsManagerSimpleDriver をロードします。
            Class.forName("com.aliyun.kms.secretsmanager.MssqlSecretsManagerSimpleDriver");
            Connection connect = null;
            try {
                connect = DriverManager.getConnection("secrets-manager:sqlserver://<your-sqlserver-ip>:<your-sqlserver-port>;databaseName=<your-database-name>", "#your-sqlserver-secret-name#", "");
            }  catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
  • PostgreSQL データベース

    説明

    サンプルコードの #your-postgresql-secret-name#<your-postgresql-ip><your-postgresql-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class SecretManagerJDBCPostgreSQLSample {
        public static void main(String[] args) throws Exception {
            // Alibaba Cloud secrets JDBC クライアント com.aliyun.kms.secretsmanager.PostgreSQLSecretManagerSimpleDriver をロードします。
            Class.forName("com.aliyun.kms.secretsmanager.PostgreSQLSecretManagerSimpleDriver");
            Connection connect = null;
            try {
                connect = DriverManager.getConnection("secrets-manager:postgresql://<your-postgresql-ip>:<your-postgresql-port>/<your-database-name>", "#your-postgresql-secret-name#", "");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
  • MariaDB データベース

    説明

    サンプルコードの #your-mariadb-secret-name#<your-mariadb-ip><your-mariadb-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class SecretManagerJDBCMarialDBSample {
    
    	public static void main(String[] args) throws Exception{
    		// Alibaba Cloud secrets JDBC クライアント com.aliyun.kms.secretsmanager.MariaDBSecretManagerSimpleDriver をロードします。
    		Class.forName("com.aliyun.kms.secretsmanager.MariaDBSecretManagerSimpleDriver");
    		Connection connect = null;
    		try {
    			connect = DriverManager.getConnection("secrets-manager:mariadb://<your-mariadb-ip>:<your-mariadb-port>/<your-database-name>", "#your-mariadb-secret-name#", "");
    		}  catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    }

接続プールを使用してデータベースに接続する

c3p0.properties 構成ファイルで c3p0.userc3p0.driverClass、および c3p0.jdbcUrl を設定します。c3p0.user をシークレットの名前に設定し、c3p0.driverClass を Alibaba Cloud secrets JDBC ドライバークラスの名前に設定します。c3p0.jdbcUrl の値は secrets-manager で始まる必要があります。

  • MySQL データベース

    説明

    サンプルコードの #your-mysql-secret-name#<your-mysql-ip><your-mysql-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。

    c3p0.user=#your-mysql-secret-name#
    c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver
    c3p0.jdbcUrl=secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>
  • SQL Server データベース

    説明

    サンプルコードの #your-sqlserver-secret-name#<your-sqlserver-ip><your-sqlserver-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。

    c3p0.user=#your-sqlserver-secret-name#
    c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver
    c3p0.jdbcUrl=secrets-manager:sqlserver://<your-sqlserver-ip>:<your-sqlserver-port>/<your-database-name>
  • PostgreSQL データベース

    説明

    サンプルコードの #your-postgresql-secret-name#<your-postgresql-ip><your-postgresql-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。

    c3p0.user=#your-postgresql-secret-name#
    c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver
    c3p0.jdbcUrl=secrets-manager:postgresql://<your-postgresql-ip>:<your-postgresql-port>/<your-database-name>
  • MariaDB データベース

    説明

    サンプルコードの #your-mariadb-secret-name#<your-mariadb-ip><your-mariadb-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。

    c3p0.user=#your-mariadb-secret-name#
    c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver
    c3p0.jdbcUrl=secrets-manager:mariadb://<your-mariadb-ip>:<your-mariadb-port>/<your-database-name>

データソースを使用してデータベースに接続する

この例では、c3p0 ComboPooledDataSource と MySQL データベースを使用します。Spring 構成ファイルに次の構成を追加します。

説明

サンプルコードの #your-mysql-secret-name#<your-mysql-ip><your-mysql-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
      <property name="driverClass" value="com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver" />
      <property name="user" value="#your-mysql-secret-name#" />
      <property name="jdbcUrl" value="secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>" />
      <property name="maxPoolSize" value="***" />
      <property name="minPoolSize" value="***" />
      <property name="initialPoolSize" value="***" />
  </bean>
  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
      <property name="dataSource" ref="dataSource" />
  </bean>
説明

必要に応じて、maxPoolSize、minPoolSize、および initialPoolSize パラメーターの値を設定します。

Druid 接続プールを使用してデータベースに接続する

この例では MySQL データベースを使用します。構成ファイルで次のプロパティを変更する必要があります。

説明

サンプルコードの #your-mysql-secret-name#<your-mysql-ip><your-mysql-port>、および <your-database-name> を、実際のシークレット名、サーバーの IP アドレス、ポート、およびデータベース名に置き換えてください。

  • プロパティ構成ファイルの使用

    username=#your-mysql-secret-name#
    driverClassName=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver
    url=secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>
  • Bean 構成の使用

    • 方法 1: XML 構成ファイル

      <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
           <property name="username" value="${your-mysql-secret-name}" />
           <property name="driverClassName" value="com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver" />
           <property name="url" value="secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>" />
      </bean>
      
    • 方法 2: プロパティインジェクション

      アプリケーションでドライバークラスを作成して、データベース接続情報をロードします。

      @Configuration
      public class DataConfig {
      
          @Value("${your-mysql-secret-name}")
          private String username;
      
          @Value("com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver")
          private String driverClassName;
      
          @Value("secrets-manager:mysql://<your-mysql-ip>:<your-mysql-port>/<your-database-name>")
          private String url;
      
          @Bean(name = "dataSource",initMethod = "init",destroyMethod = "close")
          public DruidDataSource dataSource(){
              DruidDataSource druidDataSource = new DruidDataSource();
              druidDataSource.setUsername(username);
              druidDataSource.setDriverClassName(driverClassName);
              druidDataSource.setUrl(url);
              return druidDataSource;
          }
      }