在使用阿里云SDK调用OpenAPI操作资源时,必须正确配置凭证信息。Java V1.0 SDK支持多种凭据配置方式,本文详细阐述了如何配置访问凭据,以确保安全有效地使用SDK进行开发。
使用AccessKey
阿里云账号的AccessKey泄露会威胁该账号下所有资源的安全。为保证账号安全,强烈建议您使用RAM用户的AccessKey。具体操作,请参见创建AccessKey。
请确保代码运行环境已设置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。具体操作,请参见在Linux、macOS和Windows系统配置环境变量。
通过DefaultProfile配置AccessKey初始化客户端。
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.profile.DefaultProfile; public class Sample { public static void main(String[] args) { DefaultProfile profile = DefaultProfile.getProfile( "<REGION_ID>", // 从环境变量获取RAM用户的AccessKey ID System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), // 从环境变量获取RAM用户的AccessKey Secret System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); IAcsClient client = new DefaultAcsClient(profile); // 省略调用API步骤... } }
通过BasicCredentials配置AccessKey初始化客户端。
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.auth.BasicCredentials; import com.aliyuncs.profile.DefaultProfile; public class Sample { public static void main(String[] args) { BasicCredentials basicCredentials = new BasicCredentials( // 从环境变量获取RAM用户的AccessKey ID System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), // 从环境变量获取RAM用户的AccessKey Secret System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") ); DefaultProfile profile = DefaultProfile.getProfile("<REGION_ID>"); IAcsClient client = new DefaultAcsClient(profile, basicCredentials); // 省略调用API步骤... } }
使用STS Token
使用临时访问凭据(STS Token)初始化凭据客户端。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.profile.DefaultProfile;
public class Test {
public static void main(String[] args) {
DefaultProfile profile = DefaultProfile.getProfile(
"<REGION_ID>",
// 从环境变量获取RAM用户的AccessKey ID
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 从环境变量获取RAM用户的AccessKey Secret
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
// STS Token
System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
IAcsClient client = new DefaultAcsClient(profile);
// 省略调用API步骤...
}
}
使用RamRoleArn
以一个RAM用户的身份调用STS服务的AssumeRole接口获取STS Token。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.STSAssumeRoleSessionCredentialsProvider;
import com.aliyuncs.profile.DefaultProfile;
public class Sample {
public static void main(String[] args) {
DefaultProfile profile = DefaultProfile.getProfile();
// 使用STS Token方式
STSAssumeRoleSessionCredentialsProvider stsProvider = new STSAssumeRoleSessionCredentialsProvider(
// 从环境变量获取RAM用户的AccessKey ID
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 从环境变量获取RAM用户的Access Key Secret
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
// 自定义会话名称
"<ROLE_SESSION_NAME>",
// RAM角色ARN
"<ROLE_ARN>",
// region id
"<REGION_ID>"
);
DefaultAcsClient client = new DefaultAcsClient(profile, stsProvider);
// 省略调用API步骤...
}
}
使用ECSRamRole
为了在提高应用部署安全性的同时增强便利性,阿里云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.profile.DefaultProfile;
public class Sample {
public static void main(String[] args) {
DefaultProfile profile = DefaultProfile.getProfile("<REGION_ID>");
// 使用ECS RAM Role方式
InstanceProfileCredentialsProvider provider = new InstanceProfileCredentialsProvider(
"<ROLE_NAME>"
);
DefaultAcsClient client = new DefaultAcsClient(profile, provider);
// 省略调用API步骤...
}
}
使用OIDCRoleArn
在容器服务Kubernetes版中配置了Worker节点RAM角色后,您可以基于RRSA功能在集群内实现Pod级别的应用关联RAM角色功能。各个应用可以独立扮演不同的RAM角色,并利用获取的临时凭证访问云资源,从而实现应用RAM权限的最小化,并满足无AccessKey访问阿里云OpenAPI的需求,以避免AccessKey泄露。
阿里云容器集群会为不同的应用Pod创建和挂载相应的服务账户OIDC Token文件,并将相关配置信息注入到环境变量中,SDK底层通过获取环境变量的配置信息,调用STS服务的AssumeRoleWithOIDC - OIDC角色SSO时获取扮演角色的临时身份凭证接口换取绑定角色的STS Token。详情请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.auth.OIDCCredentialsProvider;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
public class OIDC {
public static void main(String[] args) throws ClientException {
// 使用OIDC方式
OIDCCredentialsProvider provider = new OIDCCredentialsProvider(
// RAM角色名称ARN
System.getenv("ALIBABA_CLOUD_ROLE_ARN"),
// OIDC提供商ARN
System.getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN"),
// OIDC Token文件路径
System.getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE"),
// 自定义会话名称
"<ROLE_SESSION_NAME>",
// 指定STS服务的region id
"<REGION_ID>"
);
DefaultProfile profile = DefaultProfile.getProfile(
// 指定client的region id
"<REGION_ID>");
IAcsClient client = new DefaultAcsClient(profile, provider);
// 省略调用API步骤...
}
}
使用Bearertoken
只有CCC这个产品支持此方式。
import com.aliyuncs.auth.BearerTokenCredentials;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.DefaultAcsClient;
public class BearerToken {
public static void main(String[] args) {
DefaultProfile profile = DefaultProfile.getProfile("<REGION_ID>");
// 使用BearerTokenCredentials设置访问凭据
BearerTokenCredentials bearerTokenCredential = new BearerTokenCredentials("<BEARER_TOKEN>");
DefaultAcsClient client = new DefaultAcsClient(profile, bearerTokenCredential);
// 省略调用API步骤...
}
}
使用默认凭证提供链
当您在初始化凭据客户端不传入任何参数时,SDK会使用默认凭据链方式初始化客户端。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
public class Test {
public static void main(String[] args) throws ClientException {
// 使用默认凭据链
IAcsClient client = new DefaultAcsClient("<REGION_ID>");
// 省略调用API步骤...
}
}
默认凭证提供程序链将按照以下顺序查找可用的凭证:
1. 系统属性
在系统属性里寻找环境凭证,如果定义了 alibabacloud.accessKeyId
和 alibabacloud.accessKeyIdSecret
系统属性且不为空,程序将使用它们创建默认凭证。
2. 环境凭证
在环境变量里寻找环境凭证,如果定义了 ALIBABA_CLOUD_ACCESS_KEY_ID
和 ALIBABA_CLOUD_ACCESS_KEY_SECRET
环境变量且不为空,程序将使用它们创建默认凭证。
3. OIDC RAM角色
若不存在优先级更高的凭据信息,Credentials工具会在环境变量中获取如下内容:
ALIBABA_CLOUD_ROLE_ARN:RAM角色名称ARN;
ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC提供商ARN;
ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC Token文件路径;
若以上三个环境变量都已设置内容,Credentials将会使用变量内容调用STS服务的AssumeRoleWithOIDC接口换取STS Token作为默认凭据。
4. 配置文件
如果用户主目录存在默认文件 ~/.alibabacloud/credentials.ini (Windows 为 C:\Users\USER_NAME\.alibabacloud\credentials.ini)
,程序会自动创建指定类型和名称的凭证。默认文件可以不存在,但解析错误会抛出异常。配置名小写。不同的项目、工具之间可以共用这个配置文件,因为不在项目之内,也不会被意外提交到版本控制。 可以通过定义 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` 的配置
enable = false # 不启用
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 # 选填
5. ECS实例RAM角色
若不存在优先级更高的凭据信息,Credentials工具会在环境变量中获取ALIBABA_CLOUD_ECS_METADATA(ECS实例RAM角色名称),若存在,程序将会通过ECS的元数据服务(Meta Data Server)获取ECS实例RAM角色的STS Token作为默认凭据信息。