全部產品
Search
文件中心

Key Management Service:憑據JDBC用戶端

更新時間:Feb 12, 2025

針對使用JDBC方式串連資料庫的業務情境,您將資料庫帳號密碼儲存在RDS憑據或通用憑據後,應用可以整合憑據JDBC用戶端,通過在KMS託管的憑據完成資料庫連接身份鑒別。本文介紹如何安裝和使用憑據JDBC用戶端。

SDK介紹

憑據JDBC用戶端是針對使用JDBC方式串連資料庫的業務情境,該用戶端自動從KMS擷取憑據用於資料庫連接身份鑒別,更便於您整合。其他擷取和使用憑據的業務情境推薦您優先使用憑據用戶端,其次是KMS執行個體SDK和阿里雲SDK。詳細資料,請參見SDK參考

說明

如果您需要對憑據進行管控類操作,僅支援使用阿里雲SDK。

憑據JDBC用戶端具有以下功能特性:

  • 支援Java資料庫連接(Java Database Connectivity,簡稱JDBC),包括在資料庫連接池(例如c3p0和DBCP)和資料來源中通過JDBC串連資料庫。

  • 支援MySQL、SQL Server、PostgreSQL和MariaDB四種資料庫類型。

  • 支援使用者自訂憑據重新整理頻率。

注意事項

  • 支援的憑據類型:通用憑據、RDS憑據。

    • 如果是RDS憑據,建議您使用雙帳號託管的RDS憑據。

    • 如果是通用憑據,憑據值為JSON格式且內容格式如下。

      {
          "AccountName":"<您的資料庫帳號使用者名稱>",
          "AccountPassword":"<您的資料庫帳號密碼>"
      }
  • 支援的開發語言:Java(Java 8及以上版本)。

  • 支援的訪問憑證:AccessKey、RAM角色、ECS RAM角色、STS、ClientKey

步驟一:建立訪問憑證

重要
  • AccessKey、RAM角色、ECS RAM角色、STS僅支援通過KMS服務Endpoint擷取憑據值,ClientKey既支援通過KMS服務Endpoint,也支援通過KMS執行個體Endpoint擷取憑據值。關於Endpoint的詳細介紹,請參見SDK參考

  • KMS執行個體Endpoint支援更高的效能,因此推薦您使用ClientKey通過KMS執行個體Endpoint擷取憑據值。

AccessKey

具體操作,請參見建立AccessKey

RAM角色

  1. 建立RAM角色。具體操作,請參見建立RAM角色

  2. 擷取目標RAM角色的RamRoleArn。具體操作,請參見查看RAM角色

    說明

    RamRoleArn是RAM角色的ARN資訊,即需要扮演的角色ID。格式為acs:ram::$accountID:role/$roleName。$accountID為阿里雲帳號ID。$roleName為RAM角色名稱。

ECS RAM角色

為ECS執行個體授予RAM角色。具體操作,請參見執行個體RAM角色

STS

  1. 建立RAM使用者或RAM角色。具體操作,請參見建立RAM使用者建立RAM角色

  2. 為RAM使用者或RAM角色授予AliyunSTSAssumeRoleAccess許可權。具體操作,請參見為RAM使用者授權為RAM角色授權

  3. 使用RAM使用者或RAM角色調用STS服務的AssumeRole介面擷取STS臨時訪問憑證。具體操作,請參見AssumeRole - 擷取扮演角色的臨時身份憑證

ClientKey

您需要先建立應用存取點AAP,然後在AAP中建立ClientKey。具體操作,請參見建立應用存取點

步驟二:安裝用戶端

訪問aliyun-secretsmanager-jdbc瞭解更多安裝資訊和原始碼。

通過Maven的方式安裝憑據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。

步驟三:通過設定檔(secretsmanager.properties)設定用戶端運行參數

在專案的運行代碼中新增設定檔secretsmanager.properties,不同訪問憑證需要配置的參數不同。

AccessKey

## 訪問憑據類型
credentials_type=ak
## Access Key Id
credentials_access_key_id=#credentials_access_key_id#
## Access Key Secret
credentials_access_secret=#credentials_access_secret#
## 關聯的KMS服務地區
cache_client_region_id=[{"regionId":"#regionId#"}]
## 使用者自訂的重新整理頻率, 預設為6小時,最小值為5分鐘,單位為毫秒
refresh_secret_ttl=21600000

RAM角色

## 訪問憑據類型
credentials_type=ram_role
## Access Key Id
credentials_access_key_id=#credentials_access_key_id#
## Access Key Secret
credentials_access_secret=#credentials_access_secret#
## 訪問憑據Session名稱
credentials_role_session_name=#credentials_role_session_name#
## RAM Role ARN
credentials_role_arn=#credentials_role_arn#
## 訪問憑據Policy
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 Role名稱
credentials_role_name=#credentials_role_name#
## 關聯的KMS服務地區
cache_client_region_id=[{"regionId":"#regionId#"}]
## 使用者自訂的重新整理頻率, 預設為6小時,最小值為5分鐘,單位為毫秒
refresh_secret_ttl=21600000

STS

## 訪問憑據類型
credentials_type=sts
## Access Key Id
credentials_access_key_id=#credentials_access_key_id#
## Access Key Secret
credentials_access_secret=#credentials_access_secret#
## 訪問憑據Session名稱
credentials_role_session_name=#credentials_role_session_name#
## RAM Role ARN
credentials_role_arn=#credentials_role_arn#
## 訪問憑據Policy
credentials_policy=#credentials_policy#
## 關聯的KMS服務地區
cache_client_region_id=[{"regionId":"#regionId#"}]
## 使用者自訂的重新整理頻率, 預設為6小時,最小值為5分鐘,單位為毫秒
refresh_secret_ttl=21600000

ClientKey

  • 訪問KMS服務Endpoint

    ## 訪問憑據類型
    credentials_type=client_key
    # Client Key檔案路徑
    client_key_private_key_path=#your client key private key file path#
    ## 讀取client key的解密密碼:支援從環境變數或者檔案讀取
    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
  • 訪問KMS執行個體Endpoint

    • 方式一:通過檔案擷取ClientKey憑證口令

      您還需要將password配置到檔案中,檔案名稱由您自訂,但需要和passwordFromFilePath的取值相同。

      cache_client_dkms_config_info=[{"regionId":"<your dkms region>","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":ch-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"}]
    • 方式二:通過環境變數擷取ClientKey憑證口令

      您還需要將password配置到系統內容變數中,變數名稱由您自訂,但需要和passwordFromEnvVariable的取值相同。

      cache_client_dkms_config_info=[{"regionId":"<your dkms region>","endpoint":"<your dkms endpoint>","passwordFromEnvVariable":"<your_password_env_variable>","clientKeyFile":"<your ClientKey file path>","ignoreSslCerts":false,"caFilePath":"<your CA certificate file path>"}]

    各配置項說明:

    配置項

    配置項含義

    說明

    regionId

    KMS執行個體所在地區ID。

    具體的地區ID,請參見地區和接入地址

    endpoint

    KMS執行個體的網域名稱地址,格式為{執行個體ID}.kms.aliyuncs.com

    在控制台实例管理頁面,單擊目標KMS執行個體,在執行個體詳情頁面查看实例VPC地址,將https://去掉後即為KMS執行個體的網域名稱地址。

    clientKeyFile

    ClientKey檔案(JSON格式)的絕對路徑或相對路徑。

    • ClientKey檔案:在應用存取點AAP中建立ClientKey時下載的应用身份凭证内容(ClientKeyContent),下載後檔案名稱預設為ClientKey_******.json。

    • 憑證口令:在應用存取點AAP中建立ClientKey時下載的憑證口令(ClientKeyPassword),下載後檔案名稱預設為ClientKey_******_password.txt。

    重要

    ClientKey檔案和憑證口令是一一對應的,僅支援您在建立ClientKey時擷取。如果您在建立時未儲存,則需要在應用存取點AAP中重新建立ClientKey。更多詳細內容,請參見建立應用存取點

    passwordFromFilePathpasswordFromEnvVariable

    • passwordFromFilePath:從檔案中擷取憑證口令,取值為檔案的絕對路徑或相對路徑。您需要將憑證口令儲存到檔案中。

    • passwordFromEnvVariable:從環境變數擷取憑證口令,取值為環境變數名稱。您需要將憑證口令配置到環境變數中。

    ignoreSslCerts

    是否忽略KMS執行個體SSL認證的有效性檢查。KMS執行個體內建SSL認證,使用SSL/TLS協議用於身分識別驗證和加密通訊。取值:

    • true:表示忽略,不檢查KMS執行個體SSL認證的有效性。

      說明

      取值為true時,無需配置caFilePath

    • false:表示驗證,檢查KMS執行個體SSL認證的有效性。

    正式生產環境中,請將該值設定為false。

    caFilePath

    KMS執行個體CA認證檔案的絕對路徑或相對路徑。

    KMS執行個體CA認證,用於檢查KMS執行個體SSL認證的有效性。例如:檢查KMS執行個體SSL認證是否由對應的CA中心簽發、是否在有效期間內、以及對應的網域名稱是否為KMS執行個體的網域名稱地址(endpoint)。

    实例管理頁面,單擊获取实例CA证书地區的下载,下載KMS執行個體的CA認證。

步驟四:使用憑據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 {
            // 載入阿里雲憑據JDBC用戶端 Load the JDBC Driver 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();
            }
        }
    }
  • SQLServer資料庫

    說明

    請將#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{
            // 載入阿里雲憑據JDBC用戶端 Load the JDBC Driver 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 {
            // 載入阿里雲憑據JDBC用戶端 Load the JDBC Driver 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{
    		// 載入阿里雲憑據JDBC用戶端 Load the JDBC Driver 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設定檔(c3p0.properties)中的c3p0.userc3p0.driverClassc3p0.jdbcUrlc3p0.user為憑據名稱,c3p0.driverClass為阿里雲憑據JDBC Driver類名稱,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>
  • SQLServer資料庫

    說明

    請將#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>

通過資料來源(DataSource)串連資料庫

以使用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地址、連接埠、資料庫名稱。

  • properties設定檔方式

    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配置方式

    • 方式一: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>
      
    • 方式二:配置屬性注入

      在應用中建立一個載入資料庫連接資訊的驅動類。

      @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;
          }
      }