全部產品
Search
文件中心

Alibaba Cloud SDK:管理訪問憑據

更新時間:Jul 01, 2024

本文聚焦於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.accessKeyIdalibabacloud.accessKeyIdSecret 系統屬性且不為空白,程式將使用它們建立預設憑證。

2.環境憑證

在環境變數裡尋找環境憑證,如果定義了 ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_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 檔案