All Products
Search
Document Center

Alibaba Cloud SDK:Manage credentials

Last Updated:Jun 22, 2026

Alibaba Cloud SDK menggunakan tool Credentials untuk mengelola kredensial secara terpusat, seperti AccessKey dan STS Token Anda. Topik ini menjelaskan jenis kredensial yang didukung dan metode konfigurasinya.

Prasyarat

Instal Credentials

Gunakan paket dependensi Credentials versi terbaru untuk mengakses semua fitur.

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>credentials-java</artifactId>
  <version>latest-version</version>
</dependency>
<!-- Jika Anda hanya menggunakan credentials-java, Anda juga harus menyertakan paket dependensi Tea. -->
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>tea</artifactId>
  <version>latest-version</version>
</dependency>

Untuk versi terbaru paket dependensi Credentials, lihat GitHub atau Maven Repository. Untuk versi terbaru paket dependensi Tea, lihat GitHub atau Maven Repository.

Jenis dan parameter kredensial

Kelas com.aliyun.credentials.models.Config mendefinisikan jenis kredensial dan parameter konfigurasi yang didukung oleh tool Credentials. Parameter type menentukan jenis kredensial, dan jenis yang berbeda memerlukan parameter konfigurasi yang berbeda pula. Tabel ini menjelaskan nilai valid untuk type dan parameter yang didukungnya. Dalam tabel, Required menunjukkan parameter wajib, - menunjukkan parameter opsional, dan Not supported menunjukkan bahwa parameter tersebut tidak didukung.

Catatan

Jenis dan parameter kredensial yang tidak tercantum dalam tabel ini sudah tidak digunakan lagi (deprecated).

Parameter

access_key

sts

ram_role_arn

ecs_ram_role

oidc_role_arn

credentials_uri

bearer

accessKeyId: ID access key.

Required

Required

Required

Not supported

Not supported

Not supported

Not supported

accessKeySecret: Secret access key.

Required

Required

Required

Not supported

Not supported

Not supported

Not supported

securityToken: Token keamanan.

Not supported

Required

-

Not supported

Not supported

Not supported

Not supported

roleArn: ARN dari RAM role.

Not supported

Not supported

Required

Not supported

Required

Not supported

Not supported

roleSessionName: Nama sesi kustom. Format default adalah credentials-java-<timestamp>.

Not supported

Not supported

-

Not supported

-

Not supported

Not supported

roleName: Nama RAM role.

Not supported

Not supported

Not supported

-

Not supported

Not supported

Not supported

disableIMDSv1: Menentukan apakah akan menggunakan mode keamanan tinggi. Nilai default adalah false.

Not supported

Not supported

Not supported

-

Not supported

Not supported

Not supported

bearerToken: Bearer token.

Not supported

Not supported

Not supported

Not supported

Not supported

Not supported

Required

policy: Kebijakan izin kustom.

Not supported

Not supported

-

Not supported

-

Not supported

Not supported

roleSessionExpiration: Waktu kedaluwarsa sesi dalam detik. Nilai default adalah 3.600. Nilainya harus antara 900 hingga durasi sesi maksimum dari RAM role.

Not supported

Not supported

-

Not supported

-

Not supported

Not supported

oidcProviderArn: ARN dari penyedia identitas OIDC.

Not supported

Not supported

Not supported

Not supported

Required

Not supported

Not supported

oidcTokenFilePath: Jalur file ke token OIDC.

Not supported

Not supported

Not supported

Not supported

Required

Not supported

Not supported

externalId: External ID untuk RAM role. Parameter ini membantu mencegah masalah confused deputy. Untuk informasi selengkapnya, lihat Gunakan external ID untuk mencegah masalah confused deputy.

Not supported

Not supported

-

Not supported

Not supported

Not supported

Not supported

credentialsURI: URI dari kredensial eksternal.

Not supported

Not supported

Not supported

Not supported

Not supported

Required

Not supported

STSEndpoint: Titik akhir layanan untuk Security Token Service (STS). Parameter ini mendukung titik akhir VPC dan titik akhir publik. Untuk daftar nilai yang mungkin, lihat Titik akhir layanan. Nilai default adalah sts.aliyuncs.com.

Not supported

Not supported

-

Not supported

-

Not supported

Not supported

timeout: Timeout baca dalam milidetik. Nilai default adalah 5.000.

Not supported

Not supported

-

-

-

-

Not supported

connectTimeout: Timeout koneksi dalam milidetik. Nilai default adalah 10.000.

Not supported

Not supported

-

-

-

-

Not supported

Menggunakan tool Credentials

Bagian sebelumnya menjelaskan jenis kredensial dan parameter konfigurasi yang didukung oleh tool Credentials. Bagian berikut memberikan contoh kode yang menunjukkan cara menggunakan tool ini. Pilih metode yang paling sesuai dengan skenario Anda.

Penting
  • Menyematkan AccessKey secara langsung di proyek Anda menciptakan risiko keamanan. Izin repositori yang tidak dikelola dengan baik dapat mengekspos semua sumber daya dalam akun Anda. Disarankan untuk menyimpan AccessKey di variabel lingkungan atau file konfigurasi.

  • Gunakan pola singleton dengan tool Credentials. Pola ini memungkinkan mekanisme cache kredensial bawaan tool untuk mencegah pembatasan laju akibat panggilan API yang terlalu sering dan menghindari pemborosan sumber daya akibat pembuatan banyak instans. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi.

Metode 1: Rantai kredensial default

Catatan

Ini adalah metode default yang digunakan dalam contoh kode di Portal OpenAPI.

Jika Anda tidak memberikan parameter konfigurasi apa pun saat menginisialisasi tool Credentials, tool ini akan mengambil kredensial dari rantai kredensial default. Untuk menggunakan metode ini, pastikan lingkungan runtime aplikasi Anda dikonfigurasi dengan setidaknya satu metode pengambilan kredensial yang didukung oleh rantai kredensial default.

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
    public static void main(String[] args) throws Exception {
        // Jika tidak ada parameter konfigurasi yang ditentukan, tool akan mengambil kredensial dari rantai kredensial default.
        Client credentialClient = new Client();
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
    }
}

Metode 2: AK

Tool Credentials menggunakan AccessKey yang Anda berikan sebagai kredensial akses.

Peringatan

Akun Alibaba Cloud (akun root) memiliki hak istimewa penuh atas semua sumber dayanya, sehingga AK yang terekspos menimbulkan risiko keamanan signifikan. Jangan gunakan AK dari akun root.

Gunakan AK dari Pengguna RAM dengan izin minimal (least-privilege).

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
    public static void main(String[] args) throws Exception {
        Config credentialConfig = new Config();
        credentialConfig.setType("access_key");
        // Wajib. Contoh ini mengambil ID AccessKey dari variabel lingkungan.
        credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // Wajib. Contoh ini mengambil rahasia AccessKey dari variabel lingkungan.
        credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        Client credentialClient = new Client(credentialConfig);
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
    }
}

Metode 3: Token STS

Tool Credentials menggunakan token STS statis yang Anda berikan sebagai kredensial akses.

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
    public static void main(String[] args) {
        Config credentialConfig = new Config();
        credentialConfig.setType("sts");
        // Wajib. Contoh ini mengambil ID AccessKey dari variabel lingkungan.
        credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // Wajib. Contoh ini mengambil rahasia AccessKey dari variabel lingkungan.
        credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Wajib. Contoh ini mengambil token keamanan sementara dari variabel lingkungan.
        credentialConfig.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
        Client credentialClient = new Client(credentialConfig);
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
    }
}

Metode 4: AK dan ARN RAM role

Tool Credentials menggunakan AK dan ARN RAM role Anda untuk memanggil API AssumeRole dan mendapatkan token STS, yang berfungsi sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi.

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
    public static void main(String[] args) throws Exception {
        Config credentialConfig = new Config();
        credentialConfig.setType("ram_role_arn");
        // Wajib. Contoh ini mengambil ID AccessKey dari variabel lingkungan.
        credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // Wajib. Contoh ini mengambil rahasia AccessKey dari variabel lingkungan.
        credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Opsional. Memungkinkan penggunaan kredensial sementara untuk mengasumsikan RAM role lain.
        credentialConfig.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
        // Wajib. ARN dari RAM role yang akan diasumsikan. Contoh: acs:ram::123456789012****:role/adminrole. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
        credentialConfig.setRoleArn("<RoleArn>");
        // Opsional. Nama sesi role. Format default: credentials-java-<timestamp>. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
        credentialConfig.setRoleSessionName("<RoleSessionName>");
        // Opsional. Kebijakan izin yang lebih ketat. Tidak wajib. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
        credentialConfig.setPolicy("<Policy>");
        // Opsional. External ID untuk mencegah masalah confused deputy.
        credentialConfig.setExternalId("<ExternalId>");
        // Opsional. Waktu kedaluwarsa sesi dalam detik. Nilai default: 3600.
        credentialConfig.setRoleSessionExpiration(3600);
        Client credentialClient = new Client(credentialConfig);
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
    }
}</timestamp>

Metode 5: RAM role instans ECS

Jika aplikasi Anda berjalan pada instans Elastic Compute Service (ECS) atau Elastic Container Instance (ECI) yang telah diberi RAM role, tool Credentials akan mengambil token STS dari metadata instans untuk digunakan sebagai kredensial akses. Saat mengakses metadata instans, tool pertama-tama mengambil nama RAM role yang ditetapkan ke instans tersebut. Anda dapat menentukan nama RAM role secara langsung menggunakan parameter roleName atau variabel lingkungan ALIBABA_CLOUD_ECS_METADATA untuk mengurangi waktu pengambilan dan meningkatkan efisiensi. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi.

Secara default, tool Credentials mengakses metadata instans dalam mode aman (IMDSv2). Jika akses ini gagal, gunakan parameter disableIMDSv1 atau variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLED untuk mengontrol perilaku fallback:

  • Jika diatur ke false (default), tool akan beralih ke mode normal untuk mengambil kredensial.

  • Jika diatur ke true, tool hanya menggunakan mode aman dan akan melemparkan exception jika akses gagal.

Dukungan server Anda terhadap IMDSv2 bergantung pada konfigurasinya.

Untuk menonaktifkan akses kredensial dari metadata instans, atur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.

Catatan
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
    public static void main(String[] args) throws Exception {
        Config credentialConfig = new Config();
        credentialConfig.setType("ecs_ram_role");
        // Opsional. Nama RAM role yang diberikan ke instans ECS. Jika tidak ditentukan, tool akan mengambilnya secara otomatis. Kami menyarankan untuk mengatur parameter ini guna mengurangi jumlah permintaan. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
        credentialConfig.setRoleName("<RoleName>");
        // Opsional. Atur ke true untuk menerapkan mode aman. Nilai default: false. Tool pertama-tama mencoba mendapatkan kredensial dalam mode aman. Jika gagal, tool beralih ke mode normal.
        credentialConfig.setDisableIMDSv1(false);
        Client credentialClient = new Client(credentialConfig);
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
    }
}

Metode 6: ARN role OIDC

Jika Anda menggunakan OIDC untuk autentikasi dan telah membuat RAM role untuk penyedia identitas OIDC, Anda dapat memberikan ARN penyedia OIDC, jalur file token OIDC, dan ARN RAM role ke tool Credentials. Tool ini kemudian secara otomatis memanggil API AssumeRoleWithOIDC untuk mendapatkan token STS untuk RAM role tersebut, yang digunakan sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi. Sebagai contoh, jika aplikasi Anda berjalan di kluster Container Service for Kubernetes (ACK) dengan RRSA diaktifkan, tool Credentials dapat membaca konfigurasi OIDC dari variabel lingkungan pod dan memanggil API AssumeRoleWithOIDC untuk mendapatkan token STS. Anda kemudian dapat menggunakan token STS ini untuk mengakses layanan Alibaba Cloud.

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
    public static void main(String[] args) throws Exception {
        Config credentialConfig = new Config();
        credentialConfig.setType("oidc_role_arn");
        // Wajib. ARN RAM role. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
        credentialConfig.setRoleArn("<RoleArn>");
        // Wajib. ARN penyedia identitas OIDC. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
        credentialConfig.setOidcProviderArn("<OidcProviderArn>");
        // Wajib. Jalur file token OIDC. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
        credentialConfig.setOidcTokenFilePath("<OidcTokenFilePath>");
        // Opsional. Nama sesi role. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
        credentialConfig.setRoleSessionName("<RoleSessionName>");
        // Opsional. Kebijakan izin yang lebih ketat. Tidak wajib. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
        credentialConfig.setPolicy("<Policy>");
        // Opsional. Waktu kedaluwarsa sesi dalam detik. Nilai default: 3600.
        credentialConfig.setRoleSessionExpiration(3600);
        Client credentialClient = new Client(credentialConfig);
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
    }
}

Metode 7: URI Kredensial

Anda dapat mengenkapsulasi Security Token Service (STS) di balik URI layanan, memungkinkan layanan eksternal mendapatkan token STS tanpa mengekspos informasi sensitif seperti AK. Tool Credentials kemudian dapat menggunakan URI ini untuk mengambil token STS sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi.

URI harus memenuhi kondisi berikut:

  • Mendukung permintaan GET.

  • Mengembalikan kode status HTTP 2xx.

  • Badan respons harus mengembalikan objek JSON dengan struktur berikut:

    {
      "Code": "Success",
      "AccessKeySecret": "yourAccessKeySecret",
      "AccessKeyId": "STS.****************",
      "Expiration": "2021-09-26T03:46:38Z",
      "SecurityToken": "yourSecurityToken"
    }
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
    public static void main(String[] args) throws Exception {
        Config credentialConfig = new Config();
        credentialConfig.setType("credentials_uri");
        // Wajib. URI untuk mengambil kredensial eksternal. Format: http://local_or_remote_uri/. Anda juga dapat mengatur ini melalui variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
        credentialConfig.setCredentialsUri("<CredentialsUri>");
        Client credentialClient = new Client(credentialConfig);
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // Jika Anda menggunakan SDK produk cloud V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
    }
}

Metode 8: Token Bearer

Saat ini, hanya Alibaba Cloud Call Center (CCC) yang mendukung autentikasi token bearer.

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
    public static void main(String[] args) throws Exception {
        Config credentialConfig = new Config();
        credentialConfig.setType("bearer");
        // Wajib. Masukkan token bearer Anda.
        credentialConfig.setBearerToken("<BearerToken>");
        Client credentialClient = new Client(credentialConfig);
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // Jika Anda menggunakan SDK CCC V2.0, gunakan com.aliyun.teaopenapi.models.Config untuk meneruskan kredensial.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // Kode untuk menginisialisasi client produk cloud dengan objek config dihilangkan.
    }
}

Rantai penyedia kredensial default

Rantai penyedia kredensial default adalah mekanisme fallback yang mencari kredensial dengan memeriksa urutan lokasi yang telah ditentukan. Pencarian berlanjut hingga kredensial ditemukan. Jika tidak ditemukan kredensial setelah memeriksa semua lokasi, CredentialException akan dilemparkan. Urutan pencarian adalah sebagai berikut:

1. Properti sistem

Rantai penyedia pertama-tama memeriksa kredensial di properti sistem Java.

  • Jika properti sistem alibabacloud.accessKeyId dan alibabacloud.accessKeySecret didefinisikan, rantai penyedia menggunakan AccessKey sebagai kredensial default.

  • Jika properti sistem alibabacloud.accessKeyId, alibabacloud.accessKeySecret, dan alibabacloud.sessionToken didefinisikan, rantai penyedia menggunakan token STS sebagai kredensial default.

Anda dapat menentukan nilai-nilai ini dengan menambahkan parameter JVM berikut saat menjalankan program Java Anda:

-Dalibabacloud.accessKeyId=your-access-key-id -Dalibabacloud.accessKeySecret=your-access-key-secret

2. Variabel lingkungan

Jika tidak ditemukan kredensial di properti sistem, rantai penyedia kemudian memeriksa variabel lingkungan.

  • Jika ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET keduanya ada dan tidak kosong, rantai penyedia menggunakannya sebagai kredensial default.

  • Jika ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET, dan ALIBABA_CLOUD_SECURITY_TOKEN juga diatur, rantai penyedia menggunakan token STS sebagai kredensial default.

3. RAM role OIDC

Jika belum ditemukan kredensial, rantai penyedia memeriksa variabel lingkungan berikut yang terkait dengan RAM role OIDC:

  • ALIBABA_CLOUD_ROLE_ARN: ARN dari RAM role.

  • ALIBABA_CLOUD_OIDC_PROVIDER_ARN: ARN dari penyedia OIDC.

  • ALIBABA_CLOUD_OIDC_TOKEN_FILE: Jalur file token OIDC.

Jika ketiga variabel lingkungan tersebut ada dan tidak kosong, rantai penyedia menggunakan nilai-nilai ini untuk memanggil API AssumeRoleWithOIDC dari Security Token Service (STS) untuk mendapatkan token STS.

4. Berkas kredensial bersama

Catatan

Fitur ini memerlukan credentials-java versi 0.3.8 atau lebih baru.

Jika belum ditemukan kredensial, rantai penyedia mencoba memuat berkas kredensial bersama, config.json, dari lokasi defaultnya dan menggunakan kredensial yang ditentukan dalam berkas tersebut.

  • Linux/macOS: ~/.aliyun/config.json

  • Windows: C:\Users\USER_NAME\.aliyun\config.json

Untuk mengonfigurasi kredensial dengan cara ini, Anda dapat menggunakan Alibaba Cloud CLI atau membuat berkas config.json secara manual di jalur yang sesuai. Contoh berikut menunjukkan format kontennya:

{
  "current": "<PROFILE_NAME>",
  "profiles": [
    {
      "name": "<PROFILE_NAME>",
      "mode": "AK",
      "access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
      "access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
    },
    {
      "name": "<PROFILE_NAME1>",
      "mode": "StsToken",
      "access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
      "access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
      "sts_token": "<SECURITY_TOKEN>"
    },
    {
      "name":"<PROFILE_NAME2>",
      "mode":"RamRoleArn",
      "access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
      "access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
      "ram_role_arn":"<ROLE_ARN>",
      "ram_session_name":"<ROLE_SESSION_NAME>",
      "expired_seconds":3600
    },
    {
      "name":"<PROFILE_NAME3>",
      "mode":"EcsRamRole",
      "ram_role_name":"<RAM_ROLE_ARN>"
    },
    {
      "name":"<PROFILE_NAME4>",
      "mode":"OIDC",
      "oidc_provider_arn":"<OIDC_PROVIDER_ARN>",
      "oidc_token_file":"<OIDC_TOKEN_FILE>",
      "ram_role_arn":"<ROLE_ARN>",
      "ram_session_name":"<ROLE_SESSION_NAME>",
      "expired_seconds":3600
    },
    {
      "name":"<PROFILE_NAME5>",
      "mode":"ChainableRamRoleArn",
      "source_profile":"<PROFILE_NAME>",
      "ram_role_arn":"<ROLE_ARN>",
      "ram_session_name":"<ROLE_SESSION_NAME>",
      "expired_seconds":3600
    }
  ]
}

Parameter

Deskripsi

current

Tentukan nama kredensial untuk mengambil konfigurasi kredensial yang sesuai. Nama kredensial adalah nilai parameter name dalam profiles. Secara default, sistem memberikan prioritas pada nama kredensial yang ditentukan oleh variabel lingkungan ALIBABA_CLOUD_PROFILE . Jika variabel lingkungan ini tidak dikonfigurasi, sistem menggunakan nama kredensial yang ditentukan oleh current.

profiles

Berisi kumpulan konfigurasi kredensial. Parameter mode menentukan jenis kredensial:

  • AK: Menggunakan AccessKey Pengguna RAM sebagai kredensial.

  • StsToken: Menggunakan token STS sebagai kredensial.

  • RamRoleArn: Mengasumsikan RAM role dengan menggunakan kredensial Pengguna RAM untuk mendapatkan kredensial sementara.

  • EcsRamRole: Mendapatkan kredensial dari metadata instans.

  • OIDC: Mendapatkan kredensial dengan menggunakan ARN penyedia OIDC, token OIDC, dan ARN RAM role.

  • ChainableRamRoleArn: Menggunakan perantai role untuk mendapatkan kredensial baru, menggunakan kredensial awal dari profiles yang ditentukan oleh parameter source_profile.

5. RAM role instans

Jika belum ditemukan kredensial, rantai penyedia mencoba mengambil token STS untuk RAM role instans dari metadata instans. Token ini kemudian digunakan sebagai kredensial default. Untuk melakukan ini, rantai pertama-tama mengambil nama RAM role yang ditetapkan ke instans tersebut, lalu menggunakan role tersebut untuk mendapatkan token STS yang sesuai. Untuk mengurangi waktu pengambilan kredensial dan meningkatkan efisiensi, Anda dapat menentukan nama RAM role secara langsung menggunakan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.

Secara default, rantai penyedia mengakses metadata instans dalam mode hardening keamanan (IMDSv2). Jika terjadi exception dalam mode hardening keamanan, Anda dapat menggunakan variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLED untuk mengontrol perilaku fallback:

  • Saat nilainya false (default), sistem mencoba beralih ke mode lama untuk mengambil kredensial.

  • Saat nilainya true, mode hardening keamanan diterapkan. Jika akses gagal dalam mode ini, exception akan dilemparkan.

Selain itu, Anda dapat mencegah rantai penyedia mengakses metadata instans untuk kredensial dengan mengatur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.

Catatan

6. CredentialsURI

Jika belum ditemukan kredensial, rantai penyedia memeriksa variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI. Jika variabel ini diatur dan mengarah ke URI yang valid, rantai akan mengakses URI tersebut untuk mengambil token STS.

Refresh otomatis kredensial sesi

Jenis kredensial sesi, seperti ram_role_arn, ecs_ram_role, oidc_role_arn, dan credentials_uri, mendukung refresh otomatis melalui mekanisme bawaan di penyedia kredensial. Saat client kredensial mengambil kredensial untuk pertama kalinya, penyedia menyimpannya dalam cache. Pada operasi selanjutnya, instans client yang sama secara otomatis mengambil kredensial dari cache ini. Jika kredensial yang di-cache telah kedaluwarsa, instans client mengambil yang baru dan memperbarui cache sesuai.

Catatan

Untuk kredensial ecs_ram_role, penyedia kredensial secara proaktif merefresh-nya 15 menit sebelum kedaluwarsa.

Contoh berikut menggunakan pola singleton untuk membuat client kredensial. Contoh ini menunjukkan mekanisme refresh dengan mengambil kredensial pada interval waktu berbeda dan memanggil operasi OpenAPI untuk memverifikasi bahwa kredensial tersebut dapat digunakan.

import com.aliyun.credentials.models.CredentialModel;
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import java.util.Date;
import java.util.concurrent.*;
public class Sample {
    /**
     * Kelas Credential menggunakan pola singleton untuk mengelola instans client kredensial Alibaba Cloud.
     */
    private static class Credential {
        private static volatile com.aliyun.credentials.Client instance;
        private Credential() {
        }
        public static com.aliyun.credentials.Client getInstance() {
            if (instance == null) {
                synchronized (Credential.class) {
                    if (instance == null) {
                        try {
                            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
                            config.setType("ram_role_arn");
                            config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
                            config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
                            config.setRoleArn(System.getenv("ALIBABA_CLOUD_ROLE_ARN"));
                            config.setRoleSessionName("RamRoleArnTest");
                            config.setRoleSessionExpiration(3600);
                            instance = new com.aliyun.credentials.Client(config);
                        } catch (Exception e) {
                            throw new RuntimeException("Inisialisasi kredensial gagal: " + e.getMessage(), e);
                        }
                    }
                }
            }
            return instance;
        }
    }
    /**
     * Kelas EcsClient menggunakan pola singleton untuk mengelola client ECS.
     */
    private static class EcsClient {
        private static volatile Client instance;
        private EcsClient() {
        }
        public static Client getInstance(com.aliyun.credentials.Client credentialClient) {
            if (instance == null) {
                synchronized (EcsClient.class) {
                    if (instance == null) {
                        try {
                            Config ecsConfig = new Config();
                            ecsConfig.setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
                            ecsConfig.setCredential(credentialClient);
                            instance = new Client(ecsConfig);
                        } catch (Exception e) {
                            throw new RuntimeException("Inisialisasi client ECS gagal: " + e.getMessage(), e);
                        }
                    }
                }
            }
            return instance;
        }
    }
    public static void main(String[] args) {
        // Menginisialisasi thread pool terjadwal.
        ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(
                1,
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        scheduler.setKeepAliveTime(0L, TimeUnit.SECONDS);
        scheduler.allowCoreThreadTimeOut(false); // Jangan izinkan thread inti timeout.
        // Mendefinisikan logika eksekusi sebagai tugas Runnable.
        Runnable task = () -> {
            try {
                com.aliyun.credentials.Client credentialClient = Credential.getInstance();
                CredentialModel credential = credentialClient.getCredential();
                System.out.println(new Date());
                System.out.printf("AK ID:%s, AK Secret:%s, STS Token:%s%n", credential.accessKeyId, credential.accessKeySecret, credential.securityToken);
                // Contoh ini memanggil operasi ECS untuk memverifikasi bahwa kredensial dapat digunakan. Anda dapat menyesuaikannya untuk kasus penggunaan Anda.
                Client ecsClient = EcsClient.getInstance(credentialClient);
                DescribeRegionsRequest request = new DescribeRegionsRequest();
                RuntimeOptions runtime = new RuntimeOptions();
                DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(request, runtime);
                System.out.printf("Hasil pemanggilan:%s%n", response.statusCode);
            } catch (Exception e) {
                throw new RuntimeException("Eksekusi client ECS gagal: " + e.getMessage(), e);
            }
        };
        try {
            // Jalankan tugas pertama kali (segera).
            scheduler.execute(task);
            // Jadwalkan tugas kedua untuk dijalankan setelah penundaan 600 detik.
            scheduler.schedule(task, 600, TimeUnit.SECONDS);
            // Jadwalkan tugas ketiga untuk dijalankan setelah 4.200 detik.
            scheduler.schedule(task, 4200, TimeUnit.SECONDS);
            // Jadwalkan tugas keempat untuk dijalankan setelah 4.300 detik.
            scheduler.schedule(task, 4300, TimeUnit.SECONDS);
        } finally {
            // Matikan thread pool setelah semua tugas selesai.
            scheduler.shutdown();
            try {
                if (!scheduler.awaitTermination(4500, TimeUnit.SECONDS)) {
                    scheduler.shutdownNow();
                }
            } catch (InterruptedException e) {
                scheduler.shutdownNow();
                Thread.currentThread().interrupt();
            }
        }
    }
}
Wed May 28 13:33:43 CST 2025
AK ID:STS.NWWcxxx2xbcw, AK Secret:5p3FMoRjxxx7KPm9k5mNf89, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5TiJI7/vapF1IaoR6vcqFAsebcel6fIlTz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VtLjwYFIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAITxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxX9IIPPt3pm4K8Qdpz0agAEZc36x
/FgKbLSDQh4DZiv0gPracQVKbiHF7snw5rRXtu4PJHyGSOZfR8a3H7sxxxp0GR7TbZwX48kHARr95UXTTVi0bn+kS6UfjCJASAA
Invoke result:200
Wed May 28 13:43:39 CST 2025
AK ID:STS.NWWcxxx2xbcw, AK Secret:5p3FMoRjxxx7KPm9k5mNf89, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5TiJI7/vapF1IaoR6vcqFAsebcel6fIlTz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VtLjwYFIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAIxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxX9IIPPt3pm4K8Qdpz0agAEZc36x
/FgKbLSDQh4DZiv0gPracQVKbiHF7snw5rRXtu4PJHyGSOZfR8a3H7sxxxp0GR7TbZwX48kHARr95UXTTVi0bn+kS6UfjCJASAA
Invoke result:200
Wed May 28 14:43:40 CST 2025
AK ID:STS.NXF5xxxbMWQ9b, AK Secret:8sLqjJ39PyxxxG65t6onfid7, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5vzfovNrLLVwpinMHSDkmoQQu1huJSSgDz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VsbkQYHIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAIxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxE7NJKbtm6l6aMQdpz0agAFkyTyo8rjEFLKPKG6DdLq7fkrBDqe7PtCiBD
+dZVf1xhPof9i8DluMHBXNp6m13SbpKR5ROYta43jKyzqQaiI3oE64kxxxBbHAti3yAA
Invoke result:200
Wed May 28 14:45:19 CST 2025
AK ID:STS.NXF5xxxbMWQ9b, AK Secret:8sLqjJ39PyxxxG65t6onfid7, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5vzfovNrLLVwpinMHSDkmoQQu1huJSSgDz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VsbkQYHIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAIxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxE7NJKbtm6l6aMQdpz0agAFkyTyo8rjEFLKPKG6DdLq7fkrBDqe7PtCiBD
+dZVf1xhPof9i8DluMHBXNp6m13SbpKR5ROYta43jKyzqQaiI3oE64kxxxBbHAti3yAA
Invoke result:200

Analisis berdasarkan output log:

  • Pada pemanggilan pertama, cache kosong. Sistem mengambil kredensial berdasarkan konfigurasi Anda, lalu menyimpannya dalam cache.

  • Pemanggilan kedua menggunakan kredensial yang sama dengan yang pertama, menunjukkan bahwa kredensial diambil dari cache.

  • Pada pemanggilan ketiga, kredensial yang di-cache telah kedaluwarsa. Waktu kedaluwarsanya (RoleSessionExpiration) adalah 3.600 detik, tetapi pemanggilan ini dilakukan 4.200 detik setelah yang pertama. Akibatnya, mekanisme refresh otomatis SDK mengambil kredensial baru dan memperbarui cache.

  • Pemanggilan keempat menggunakan kredensial yang sama dengan yang ketiga, mengonfirmasi bahwa cache telah diperbarui.

Dokumen terkait