应用程序可以采用多种方式接入凭据管家,动态使用凭据。
接入方式
应用程序可以使用多种开发工具接入凭据管家,不同开发工具说明及其应用场景如下:
开发工具 | 说明 | 应用场景 |
KMS SDK帮助您构造HTTPS请求,更好地使用KMS API。 |
| |
凭据管家客户端(SecretsManager Client)支持简单地配置客户端缓存频率,并定时刷新存储在凭据管家的凭据。 |
| |
凭据管家JDBC客户端(SecretsManager JDBC)支持在JDBC连接中简单地使用托管在凭据管家的凭据。 | 使用动态RDS凭据通过Java程序访问数据库 | |
多种阿里云SDK的托管凭据插件是一个帮助您更有效通过动态RAM凭据快速使用阿里云服务的插件。 | 使用动态RAM凭据获取阿里云访问凭据访问阿里云服务 | |
凭据管家Kubernetes插件是一种以无代码方式快速集成凭据管家能力的插件。 | 以无代码的方式周期性更新配置 |
使用KMS SDK
以下以Java语言为例,为您介绍如何在应用程序中使用动态RDS凭据。如果您使用的不是动态RDS凭据而是其他类型的凭据,也可以使用此方法。
获取密钥管理服务Java SDK的依赖声明。
需要获取的版本请参见SDK概览。示例如下:
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.16</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-kms</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency>
应用程序从凭据管家获取数据库账号和口令,建立数据库连接。
说明阿里云账号AccessKey拥有所有OpenAPI的访问权限,建议您使用RAM用户进行API访问或日常运维。强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
本示例以将AccessKey配置在环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET的方式来实现身份验证为例。
更多认证信息配置方式,请参见Credentials 设置。
不同操作系统的环境变量配置方法不同,具体操作,请参见在Linux、macOS和Windows系统配置环境变量。
示例代码如下:
package com.aliyun.kms.samples; import java.util.Map; import com.google.gson.Gson; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.FormatType; import com.aliyuncs.http.MethodType; import com.aliyuncs.http.ProtocolType; import com.aliyuncs.kms.model.v20160120.GetSecretValueRequest; import com.aliyuncs.kms.model.v20160120.GetSecretValueResponse; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import org.apache.commons.lang3.tuple.Pair; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class RdsSecretSampleCode { private static final String MYSQL_JDBC_DRIVER = "com.mysql.jdbc.Driver"; private static final String MSSQL_JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; private static KmsClient kmsClient; static { kmsClient = KmsClient.getKMSClient("<regionId>", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); } static class KmsClient { private DefaultAcsClient acsClient; private KmsClient(DefaultAcsClient acsClient) { this.acsClient = acsClient; } private static KmsClient getKMSClient(String regionId, String accessKeyId, String accessKeySecret) { IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(profile); return new KmsClient(client); } } // 通过凭据信息获取MySQL链接。 public static Connection getMySQLConnectionBySecret(String secretName, String jdbcUrl) throws ClassNotFoundException, SQLException, ClientException { Class.forName(MYSQL_JDBC_DRIVER); Pair<String, String> userAndPasswordPair = getUserAndPasswordPair(secretName); return DriverManager.getConnection(jdbcUrl, userAndPasswordPair.getKey(), userAndPasswordPair.getValue()); } // 通过凭据信息获取MSSQL链接。 public static Connection getMSSQLConnectionBySecret(String secretName, String jdbcUrl) throws ClassNotFoundException, SQLException, ClientException { Class.forName(MSSQL_JDBC_DRIVER); Pair<String, String> userAndPasswordPair = getUserAndPasswordPair(secretName); return DriverManager.getConnection(jdbcUrl, userAndPasswordPair.getKey(), userAndPasswordPair.getValue()); } // 通过凭据信息获取指定的数据库账号和口令。 private static Pair<String, String> getUserAndPasswordPair(String secretName) throws ClientException { final GetSecretValueRequest request = new GetSecretValueRequest(); request.setProtocol(ProtocolType.HTTPS); request.setAcceptFormat(FormatType.JSON); request.setMethod(MethodType.POST); request.setSecretName(secretName); GetSecretValueResponse response = kmsClient.acsClient.getAcsResponse(request); Map<String,String> map = new Gson().fromJson(response.getSecretData(), Map.class); return Pair.of(map.get("AccountName"), map.get("AccountPassword")); } }