在使用阿里雲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
在Container ServiceKubernetes版中配置了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作為預設憑據資訊。