本文聚焦於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 檔案