本文聚焦于V1.0 Java SDK的认证信息管理,详细阐述了如何配置访问凭据,以确保安全有效地使用SDK进行开发。
阿里云账号的AccessKey泄露会威胁该账号下所有资源的安全。为保证账号安全,强烈建议您给RAM用户的AccessKey。具体操作,请参见创建AccessKey。
使用AccessKey(包含STS Token方式)
最简单且最常用的方法是通过DefaultProfile配置进行设置。示例代码通过获取环境变量中的凭据信息来初始化客户端,因此请确保代码运行环境已设置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。具体操作,请参见在Linux、macOS和Windows系统配置环境变量。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
public class Sample {
public static void main(String[] args) {
// 创建DefaultAcsClient实例并初始化
DefaultProfile profile = DefaultProfile.getProfile(
// 地域ID
"<region-id>",
// 从环境变量获取RAM账号的AccessKey ID
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 从环境变量获取RAM账号Access Key Secret
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
);
IAcsClient client = new DefaultAcsClient(profile);
// 创建API请求并设置参数
DescribeInstancesRequest request = new DescribeInstancesRequest();
request.setPageSize(10);
// 发起请求并处理应答或异常
DescribeInstancesResponse response;
try {
response = client.getAcsResponse(request);
for (DescribeInstancesResponse.Instance instance : response.getInstances()) {
System.out.println(instance.getPublicIpAddress());
}
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}
或者使用 SDK Credentials 以及 CredentialsProvider 的方式:
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.BasicCredentials;
import com.aliyuncs.auth.STSAssumeRoleSessionCredentialsProvider;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
public class Sample {
public static void main(String[] args) {
DefaultProfile profile = DefaultProfile.getProfile("<region-id>");
BasicCredentials basicCredentials = new BasicCredentials(
// 从环境变量获取RAM账号的AccessKey ID
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 从环境变量获取RAM账号Access Key Secret
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
);
STSAssumeRoleSessionCredentialsProvider provider = new STSAssumeRoleSessionCredentialsProvider(
basicCredentials,
"<role-arn>",
profile
);
// 直接使用 AK
DefaultAcsClient client = new DefaultAcsClient(profile,basicCredentials);
/** 使用 STS Token 方式
DefaultAcsClient client = new DefaultAcsClient(profile, provider);
**/
DescribeInstancesRequest request = new DescribeInstancesRequest();
try {
DescribeInstancesResponse response = client.getAcsResponse(request);
System.out.println(new Gson().toJson(response));
} catch (ClientException e) {
System.err.println(e.toString());
}
}
}
使用RamRole
为了提高应用部署的安全性的同时提升便利性,阿里云SDK支持通过ECS实例RAM角色Token服务来获取ECS RAM角色的授权信息来访问阿里云资源和服务。使用这种方式,您部署在ECS上的应用程序,无需在SDK上配置授权信息即可访问阿里云API(即不需要配置AccessKey)。通过这种方式授权的SDK,可以拥有这个ECS RAM角色的权限。
确保ECS实例已经配置了RAM角色。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.InstanceProfileCredentialsProvider;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
public class RamRoleSample {
public static void main(String[] args) {
DefaultProfile profile = DefaultProfile.getProfile("<region-id>");
InstanceProfileCredentialsProvider provider = new InstanceProfileCredentialsProvider(
"<role-name>"
);
DefaultAcsClient client = new DefaultAcsClient(profile, provider);
DescribeInstancesRequest request = new DescribeInstancesRequest();
try {
DescribeInstancesResponse response = client.getAcsResponse(request);
} catch (ClientException e) {
System.err.println(e.toString());
}
}
}
或者使用环境变量的方式,如果定义了环境变量 ALIBABA_CLOUD_ECS_METADATA
且不为空,程序会将该环境变量的值作为角色名称,请求 http://100.100.100.200/latest/meta-data/ram/security-credentials/ 获取临时安全凭证,不用额外在请求代码中做任何认证配置。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.ecs.model.v20140526.*;
public class Main {
public static void main(String[] args) {
IAcsClient client = new DefaultAcsClient("your-region-id");
// 创建API请求并设置参数
DescribeInstancesRequest request = new DescribeInstancesRequest();
request.setPageSize(10);
// 发起请求并处理应答或异常
DescribeInstancesResponse response;
try {
response = client.getAcsResponse(request);
for (DescribeInstancesResponse.Instance instance:response.getInstances()) {
System.out.println(instance.getPublicIpAddress());
}
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}
使用Bearertoken
只有CCC这个产品支持此方式。
package com.aliyun.sample;
import com.aliyuncs.auth.BearerTokenCredentials;
import com.aliyuncs.ccc.model.v20200701.ListPhoneNumbersRequest;
import com.aliyuncs.ccc.model.v20200701.ListPhoneNumbersResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
public class Test {
public static void main(String[] args) {
// 创建DefaultAcsClient实例并初始化寻址地域
DefaultProfile profile = DefaultProfile.getProfile("<region-id>");
BearerTokenCredentials bearerTokenCredential = new BearerTokenCredentials("<bearer-token>");
DefaultAcsClient client = new DefaultAcsClient(profile,bearerTokenCredential);
// 创建API请求并设置参数
ListPhoneNumbersRequest request = new ListPhoneNumbersRequest();
request.setInstanceId("yourId");
// 发起请求并处理应答或异常
ListPhoneNumbersResponse response;
try{
response = client.getAcsResponse(request);
// 自己的逻辑
} catch(ServerException e) {
e.printStackTrace();
} catch(ClientException e) {
e.printStackTrace();
}
}
}
使用默认凭证提供链
默认凭证提供程序链查找可用的凭证,寻找顺序如下:
1.系统属性
在系统属性里寻找环境凭证,如果定义了 alibabacloud.accessKeyId
和 alibabacloud.accessKeyIdSecret
系统属性且不为空,程序将使用它们创建默认凭证。
2.环境凭证
在环境变量里寻找环境凭证,如果定义了 ALIBABA_CLOUD_ACCESS_KEY_ID
和 ALIBABA_CLOUD_ACCESS_KEY_SECRET
环境变量且不为空,程序将使用它们创建默认凭证。
3.配置文件
如果用户主目录存在默认文件 ~/.alibabacloud/credentials (Windows 为 C:\Users\USER_NAME\.alibabacloud\credentials)
,程序会自动创建指定类型和名称的凭证。默认文件可以不存在,但解析错误会抛出异常。配置名小写。不同的项目、工具之间可以共用这个配置文件,因为不在项目之内,也不会被意外提交到版本控制。 可以通过定义 ALIBABA_CLOUD_CREDENTIALS_FILE
环境变量修改默认文件的路径。不配置则使用默认配置 default
,也可以设置环境变量 ALIBABA_CLOUD_PROFILE
使用配置。
[default] # 默认配置
enable = true # 启用,没有该选项默认不启用
type = access_key # 认证方式为 access_key
access_key_id = foo # Key
access_key_secret = bar # Secret
[client1] # 命名为 `client1` 的配置
type = ecs_ram_role # 认证方式为 ecs_ram_role
role_name = EcsRamRoleTest # Role Name
[client2] # 命名为 `client2` 的配置
enable = false # 不启用
type = ram_role_arn # 认证方式为 ram_role_arn
region_id = cn-test # 获取session用的region
policy = test # 选填 指定权限
access_key_id = foo
access_key_secret = bar
role_arn = role_arn
role_session_name = session_name # 选填
[client3] # 命名为 `client3` 的配置
type = rsa_key_pair # 认证方式为 rsa_key_pair
public_key_id = publicKeyId # Public Key ID
private_key_file = /your/pk.pem # Private Key 文件