Todos os produtos
Search
Central de documentação

Alibaba Cloud SDK:Gerencie credenciais

Última atualização: Jun 28, 2026

O Alibaba Cloud SDK usa a ferramenta Credentials para gerenciar credenciais centralmente, como AccessKey e STS Token. Este tópico descreve os tipos de credencial compatíveis e seus métodos de configuração.

Pré-requisitos

Instale o Credentials

Use o pacote de dependência mais recente do Credentials para acessar todos os recursos.

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>credentials-java</artifactId>
  <version>latest-version</version>
</dependency>
<!-- If you use credentials-java alone, you must also include the Tea dependency package. -->
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>tea</artifactId>
  <version>latest-version</version>
</dependency>

Para obter a versão mais recente do pacote de dependência Credentials, consulte o GitHub ou o Repositório Maven. Para a versão mais recente do pacote de dependência Tea, consulte o GitHub ou o Repositório Maven.

Tipos de credencial e parâmetros

A classe com.aliyun.credentials.models.Config define os tipos de credencial e os parâmetros de configuração compatíveis com a ferramenta Credentials. O parâmetro type especifica o tipo de credencial, e cada tipo exige diferentes parâmetros de configuração. Esta tabela descreve os valores válidos para type e seus respectivos parâmetros compatíveis. Na tabela, Required indica um parâmetro obrigatório, - indica um parâmetro opcional e Not supported indica que o parâmetro não é compatível.

Nota

Os tipos de credencial e parâmetros não listados nesta tabela estão obsoletos.

Parâmetro

access_key

sts

ram_role_arn

ecs_ram_role

oidc_role_arn

credentials_uri

bearer

accessKeyId: O ID da chave de acesso.

Required

Required

Required

Not supported

Not supported

Not supported

Not supported

accessKeySecret: A chave secreta de acesso.

Required

Required

Required

Not supported

Not supported

Not supported

Not supported

securityToken: O token de segurança.

Not supported

Required

-

Not supported

Not supported

Not supported

Not supported

roleArn: O ARN da função RAM.

Not supported

Not supported

Required

Not supported

Required

Not supported

Not supported

roleSessionName: Um nome de sessão personalizado. O formato padrão é credentials-java-<timestamp>.

Not supported

Not supported

-

Not supported

-

Not supported

Not supported

roleName: O nome da função RAM.

Not supported

Not supported

Not supported

-

Not supported

Not supported

Not supported

disableIMDSv1: Especifique se deve usar o modo de segurança aprimorada. O valor padrão é false.

Not supported

Not supported

Not supported

-

Not supported

Not supported

Not supported

bearerToken: O token bearer.

Not supported

Not supported

Not supported

Not supported

Not supported

Not supported

Required

policy: A política de permissão personalizada.

Not supported

Not supported

-

Not supported

-

Not supported

Not supported

roleSessionExpiration: O tempo de expiração da sessão em segundos. O valor padrão é 3.600. O valor deve estar entre 900 e a duração máxima da sessão da função RAM.

Not supported

Not supported

-

Not supported

-

Not supported

Not supported

oidcProviderArn: O ARN do provedor de identidade OIDC.

Not supported

Not supported

Not supported

Not supported

Required

Not supported

Not supported

oidcTokenFilePath: O caminho do arquivo para o token OIDC.

Not supported

Not supported

Not supported

Not supported

Required

Not supported

Not supported

externalId: O ID externo para a função RAM. Este parâmetro ajuda a prevenir o problema de "confused deputy". Para mais informações, consulte Usar um ID externo para prevenir o problema de confused deputy.

Not supported

Not supported

-

Not supported

Not supported

Not supported

Not supported

credentialsURI: O URI da credencial externa.

Not supported

Not supported

Not supported

Not supported

Not supported

Required

Not supported

STSEndpoint: O endpoint de serviço para o Security Token Service (STS). Este parâmetro é compatível com endpoints de VPC e endpoints públicos. Para uma lista de valores possíveis, consulte Endpoints de serviço. O valor padrão é sts.aliyuncs.com.

Not supported

Not supported

-

Not supported

-

Not supported

Not supported

timeout: O tempo limite de leitura em milissegundos. O valor padrão é 5.000.

Not supported

Not supported

-

-

-

-

Not supported

connectTimeout: O tempo limite de conexão em milissegundos. O valor padrão é 10.000.

Not supported

Not supported

-

-

-

-

Not supported

Uso da ferramenta Credentials

A seção anterior descreveu os tipos de credencial e os parâmetros de configuração compatíveis com a ferramenta Credentials. As seções a seguir fornecem exemplos de código mostrando como usar a ferramenta. Selecione o método mais adequado ao seu cenário.

Importante
  • Codificar um AccessKey diretamente no projeto gera riscos de segurança. Permissões de repositório mal gerenciadas podem expor todos os recursos da sua conta. Recomendamos armazenar o AccessKey em variáveis de ambiente ou arquivos de configuração.

  • Adote o padrão singleton com a ferramenta Credentials. Esse padrão permite que o cache interno de credenciais da ferramenta evite limitações de taxa devido a chamadas frequentes de API e previna desperdício de recursos causado pela criação de múltiplas instâncias. Para mais informações, consulte Atualização automática de credenciais de sessão.

Método 1: Cadeia de credenciais padrão

Nota

Este é o método padrão usado nos códigos de exemplo do Portal OpenAPI.

Se você não passar nenhum parâmetro de configuração ao inicializar a ferramenta Credentials, ela recuperará as credenciais da cadeia de credenciais padrão. Para usar este método, garanta que o ambiente de execução da sua aplicação esteja configurado com pelo menos um dos métodos de recuperação de credenciais compatíveis com a cadeia de credenciais padrão.

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
    public static void main(String[] args) throws Exception {
        // If no configuration parameters are specified, the tool retrieves credentials from the default credential chain.
        Client credentialClient = new Client();
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // The code for initializing the cloud product client with the config object is omitted.
    }
}

Método 2: AK

A ferramenta Credentials usa o AccessKey fornecido por você como credencial de acesso.

Aviso

Uma conta Alibaba Cloud (conta raiz) possui permissões totais sobre todos os seus recursos, portanto, um AK exposto representa um risco significativo de segurança. Não use o AK de uma conta raiz.

Use o AK de um usuário RAM com permissões de privilégio mínimo.

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");
        // Required. This example retrieves the AccessKey ID from an environment variable.
        credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // Required. This example retrieves the AccessKey secret from an environment variable.
        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();
        // If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // The code for initializing the cloud product client with the config object is omitted.
    }
}

Método 3: Token STS

A ferramenta Credentials usa o token STS estático fornecido por você como credencial de acesso.

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");
        // Required. This example retrieves the AccessKey ID from an environment variable.
        credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // Required. This example retrieves the AccessKey secret from an environment variable.
        credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Required. This example retrieves the temporary security token from an environment variable.
        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();
        // If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // The code for initializing the cloud product client with the config object is omitted.
    }
}

Método 4: AK e ARN de função RAM

A ferramenta Credentials usa seu AK e o ARN da função RAM para chamar a API AssumeRole e obter um token STS, que serve como credencial de acesso. As credenciais obtidas dessa forma são compatíveis com atualização automática. Para mais informações, consulte Atualização automática de credenciais de sessão.

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");
        // Required. This example retrieves the AccessKey ID from an environment variable.
        credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // Required. This example retrieves the AccessKey secret from an environment variable.
        credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Optional. Allows the use of temporary credentials to assume another RAM role.
        credentialConfig.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
        // Required. The ARN of the RAM role to assume. Example: acs:ram::123456789012****:role/adminrole. You can also set this by using the ALIBABA_CLOUD_ROLE_ARN environment variable.
        credentialConfig.setRoleArn("<RoleArn>");
        // Optional. The role session name. Default format: credentials-java-. You can also set this by using the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
        credentialConfig.setRoleSessionName("<RoleSessionName>");
        // Optional. A more restrictive permission policy. Not required. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
        credentialConfig.setPolicy("<Policy>");
        // Optional. An external ID to prevent the confused deputy problem.
        credentialConfig.setExternalId("<ExternalId>");
        // Optional. The session expiration time in seconds. Default value: 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();
        // If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // The code for initializing the cloud product client with the config object is omitted.
    }
}

Método 5: Função RAM de instância ECS

Se sua aplicação for executada em uma instância Elastic Compute Service (ECS) ou Elastic Container Instance (ECI) com uma função RAM atribuída, a ferramenta Credentials recupera um token STS dos metadados da instância para usar como credencial de acesso. Ao acessar os metadados da instância, a ferramenta primeiro recupera o nome da função RAM atribuída à instância. Você pode especificar o nome da função RAM usando o parâmetro roleName ou a variável de ambiente ALIBABA_CLOUD_ECS_METADATA para reduzir o tempo de recuperação e melhorar a eficiência. As credenciais obtidas dessa forma são compatíveis com atualização automática. Para mais informações, consulte Atualização automática de credenciais de sessão.

Por padrão, a ferramenta Credentials acessa os metadados da instância no modo seguro (IMDSv2). Se esse acesso falhar, use o parâmetro disableIMDSv1 ou a variável de ambiente ALIBABA_CLOUD_IMDSV1_DISABLED para controlar o comportamento de fallback:

  • Se definido como false (padrão), a ferramenta retorna ao modo normal para recuperar a credencial.

  • Se definido como true, a ferramenta usa apenas o modo seguro e lança uma exceção se o acesso falhar.

O suporte do seu servidor ao IMDSv2 depende da configuração dele.

Para desativar o acesso a credenciais via metadados da instância, defina a variável de ambiente ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.

Nota
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");
        // Optional. The name of the RAM role granted to the ECS instance. If not specified, the tool retrieves it automatically. We recommend setting this parameter to reduce the number of requests. You can also set this by using the ALIBABA_CLOUD_ECS_METADATA environment variable.
        credentialConfig.setRoleName("<RoleName>");
        // Optional. Set to true to enforce secured mode. Default value: false. The tool first attempts to get credentials in secured mode. If it fails, it falls back to normal mode.
        credentialConfig.setDisableIMDSv1(false);
        Client credentialClient = new Client(credentialConfig);
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // The code for initializing the cloud product client with the config object is omitted.
    }
}

Método 6: ARN de função OIDC

Se você usar OIDC para autenticação e tiver criado uma função RAM para um provedor de identidade OIDC, poderá fornecer o ARN do provedor OIDC, o caminho do arquivo de token OIDC e o ARN da função RAM para a ferramenta Credentials. A ferramenta então chama automaticamente a API AssumeRoleWithOIDC para obter um token STS para a função RAM, que é usado como credencial de acesso. As credenciais obtidas dessa forma são compatíveis com atualização automática. Para mais informações, consulte Atualização automática de credenciais de sessão. Por exemplo, se sua aplicação for executada em um cluster Container Service for Kubernetes (ACK) com RRSA ativado, a ferramenta Credentials pode ler a configuração OIDC das variáveis de ambiente do pod e chamar a API AssumeRoleWithOIDC para obter um token STS. Em seguida, você pode usar esse token STS para acessar serviços da 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");
        // Required. The RAM role ARN. You can also set this by using the ALIBABA_CLOUD_ROLE_ARN environment variable.
        credentialConfig.setRoleArn("<RoleArn>");
        // Required. The ARN of the OIDC identity provider. You can also set this by using the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable.
        credentialConfig.setOidcProviderArn("<OidcProviderArn>");
        // Required. The OIDC token file path. You can also set this by using the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable.
        credentialConfig.setOidcTokenFilePath("<OidcTokenFilePath>");
        // Optional. The role session name. You can also set this by using the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
        credentialConfig.setRoleSessionName("<RoleSessionName>");
        // Optional. A more restrictive permission policy. Not required. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
        credentialConfig.setPolicy("<Policy>");
        // Optional. The session expiration time in seconds. Default value: 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();
        // If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // The code for initializing the cloud product client with the config object is omitted.
    }
}

Método 7: URI de Credenciais

Você pode encapsular o Security Token Service (STS) atrás de um URI de serviço, permitindo que serviços externos obtenham um token STS sem expor informações sensíveis como AKs. A ferramenta Credentials pode então usar esse URI para buscar um token STS e utilizá-lo como credencial de acesso. As credenciais obtidas dessa forma são compatíveis com atualização automática. Para mais informações, consulte Atualização automática de credenciais de sessão.

O URI deve atender às seguintes condições:

  • Ser compatível com requisições GET.

  • Retornar um código de status HTTP 2xx.

  • O corpo da resposta deve retornar um objeto JSON com a seguinte estrutura:

    {
      "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");
        // Required. The URI for retrieving external credentials. Format: http://local_or_remote_uri/. You can also set this by using the ALIBABA_CLOUD_CREDENTIALS_URI environment variable.
        credentialConfig.setCredentialsUri("<CredentialsUri>");
        Client credentialClient = new Client(credentialConfig);
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // The code for initializing the cloud product client with the config object is omitted.
    }
}

Método 8: Token Bearer

Atualmente, apenas o Alibaba Cloud Call Center (CCC) é compatível com autenticação via 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");
        // Required. Enter your bearer token.
        credentialConfig.setBearerToken("<BearerToken>");
        Client credentialClient = new Client(credentialConfig);
        CredentialModel credential = credentialClient.getCredential();
        String accessKeyId = credential.getAccessKeyId();
        String accessKeySecret = credential.getAccessKeySecret();
        String securityToken = credential.getSecurityToken();
        // If you are using the CCC V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.setCredential(credentialClient);
        config.setEndpoint("<Endpoint>");
        // The code for initializing the cloud product client with the config object is omitted.
    }
}

Cadeia de provedores de credenciais padrão

A cadeia de provedores de credenciais padrão é um mecanismo de fallback que busca uma credencial verificando uma sequência predefinida de locais. A busca continua até que uma credencial seja encontrada. Se nenhuma credencial for encontrada após verificar todos os locais, uma CredentialException será lançada. A ordem de busca é a seguinte:

1. Propriedades do sistema

A cadeia de provedores verifica primeiro se há uma credencial nas propriedades do sistema Java.

  • Se as propriedades de sistema alibabacloud.accessKeyId e alibabacloud.accessKeySecret estiverem definidas, a cadeia de provedores usará um AccessKey como credencial padrão.

  • Se as propriedades de sistema alibabacloud.accessKeyId, alibabacloud.accessKeySecret e alibabacloud.sessionToken estiverem definidas, a cadeia de provedores usará um token STS como credencial padrão.

Você pode especificar esses valores adicionando os seguintes parâmetros JVM ao executar seu programa Java:

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

2. Variáveis de ambiente

Se nenhuma credencial for encontrada nas propriedades do sistema, a cadeia de provedores verificará as variáveis de ambiente.

  • Se ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET estiverem presentes e não vazias, a cadeia de provedores as usará como credencial padrão.

  • Se ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET e ALIBABA_CLOUD_SECURITY_TOKEN também estiverem definidas, a cadeia de provedores usará um token STS como credencial padrão.

3. Função RAM OIDC

Se nenhuma credencial tiver sido encontrada, a cadeia de provedores verifica as seguintes variáveis de ambiente relacionadas a uma função RAM OIDC:

  • ALIBABA_CLOUD_ROLE_ARN: O ARN da função RAM.

  • ALIBABA_CLOUD_OIDC_PROVIDER_ARN: O ARN do provedor OIDC.

  • ALIBABA_CLOUD_OIDC_TOKEN_FILE: O caminho do arquivo do token OIDC.

Se todas as três variáveis de ambiente estiverem presentes e não vazias, a cadeia de provedores usa esses valores para chamar a API AssumeRoleWithOIDC do Security Token Service (STS) e obter um token STS.

4. Arquivo de credenciais compartilhado

Nota

Este recurso requer a versão 0.3.8 ou posterior do credentials-java.

Se nenhuma credencial tiver sido encontrada, a cadeia de provedores tenta carregar o arquivo de credenciais compartilhado, config.json, de seu local padrão e usa a credencial especificada no arquivo.

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

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

Para configurar uma credencial dessa maneira, você pode usar a Alibaba Cloud CLI ou criar manualmente um arquivo config.json no caminho apropriado. O exemplo a seguir mostra o formato do conteúdo:

{
  "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
    }
  ]
}

Parâmetro

Descrição

current

Especifique o nome da credencial para recuperar a configuração correspondente. O nome da credencial é o valor do parâmetro name em profiles. Por padrão, o sistema prioriza o nome da credencial especificado pela variável de ambiente ALIBABA_CLOUD_PROFILE. Se essa variável de ambiente não estiver configurada, o sistema usa o nome da credencial especificado por current.

profiles

Contém uma coleção de configurações de credenciais. O parâmetro mode especifica o tipo de credencial:

  • AK: Usa o AccessKey de um usuário RAM como credencial.

  • StsToken: Usa um token STS como credencial.

  • RamRoleArn: Assume uma função RAM usando as credenciais de um usuário RAM para obter uma credencial temporária.

  • EcsRamRole: Obtém uma credencial a partir dos metadados da instância.

  • OIDC: Obtém uma credencial usando um ARN de provedor OIDC, um token OIDC e um ARN de função RAM.

  • ChainableRamRoleArn: Usa encadeamento de funções para obter uma nova credencial, utilizando uma credencial inicial de profiles especificada pelo parâmetro source_profile.

5. Função RAM de instância

Se nenhuma credencial tiver sido encontrada, a cadeia de provedores tenta recuperar um token STS para a função RAM da instância a partir dos metadados da instância. Esse token é então usado como credencial padrão. Para isso, a cadeia primeiro recupera o nome da função RAM atribuída à instância e depois usa essa função para obter o token STS correspondente. Para reduzir o tempo de recuperação de credenciais e melhorar a eficiência, você pode especificar o nome da função RAM diretamente usando a variável de ambiente ALIBABA_CLOUD_ECS_METADATA.

Por padrão, a cadeia de provedores acessa os metadados da instância no modo de segurança reforçada (IMDSv2). Se ocorrer uma exceção no modo de segurança reforçada, você pode usar a variável de ambiente ALIBABA_CLOUD_IMDSV1_DISABLED para controlar o comportamento de fallback:

  • Quando o valor é false (padrão), o sistema tenta alternar para o modo legado para recuperar a credencial.

  • Quando o valor é true, o modo de segurança reforçada é imposto. Se o acesso falhar neste modo, uma exceção será lançada.

Além disso, você pode impedir que a cadeia de provedores acesse os metadados da instância em busca de credenciais definindo a variável de ambiente ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.

Nota

6. CredentialsURI

Se nenhuma credencial tiver sido encontrada, a cadeia de provedores verifica a variável de ambiente ALIBABA_CLOUD_CREDENTIALS_URI. Se esta variável estiver definida e apontar para um URI válido, a cadeia acessa o URI para recuperar um token STS.

Atualização automática de credenciais de sessão

Os tipos de credencial de sessão, como ram_role_arn, ecs_ram_role, oidc_role_arn e credentials_uri, são compatíveis com atualização automática por meio de um mecanismo integrado no provedor de credenciais. Quando um cliente de credenciais recupera uma credencial pela primeira vez, o provedor a armazena em um cache. Nas operações subsequentes, a mesma instância do cliente recupera automaticamente a credencial desse cache. Se a credencial em cache tiver expirado, a instância do cliente busca uma nova e atualiza o cache adequadamente.

Nota

Para credenciais do tipo ecs_ram_role, o provedor de credenciais as atualiza proativamente 15 minutos antes da expiração.

O exemplo a seguir usa o padrão singleton para criar um cliente de credenciais. Ele demonstra o mecanismo de atualização buscando uma credencial em intervalos de tempo diferentes e chamando uma operação OpenAPI para verificar se a credencial é utilizável.

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 {
    /**
     * The Credential class uses the singleton pattern to manage the Alibaba Cloud credential client instance.
     */
    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("Credential initialization failed: " + e.getMessage(), e);
                        }
                    }
                }
            }
            return instance;
        }
    }
    /**
     * The EcsClient class uses the singleton pattern to manage the ECS client.
     */
    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("ECS client initialization failed: " + e.getMessage(), e);
                        }
                    }
                }
            }
            return instance;
        }
    }
    public static void main(String[] args) {
        // Initializes a scheduled thread pool.
        ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(
                1,
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        scheduler.setKeepAliveTime(0L, TimeUnit.SECONDS);
        scheduler.allowCoreThreadTimeOut(false); // Do not allow core threads to time out.
        // Defines the execution logic as a Runnable task.
        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);
                // This example calls an ECS operation to verify that the credential is usable. You can adapt this for your use case.
                Client ecsClient = EcsClient.getInstance(credentialClient);
                DescribeRegionsRequest request = new DescribeRegionsRequest();
                RuntimeOptions runtime = new RuntimeOptions();
                DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(request, runtime);
                System.out.printf("Invoke result:%s%n", response.statusCode);
            } catch (Exception e) {
                throw new RuntimeException("ECS client execution failed: " + e.getMessage(), e);
            }
        };
        try {
            // Run the task for the first time (immediately).
            scheduler.execute(task);
            // Schedule the second task to run after a 600-second delay.
            scheduler.schedule(task, 600, TimeUnit.SECONDS);
            // Schedule the third task to run after 4,200 seconds.
            scheduler.schedule(task, 4200, TimeUnit.SECONDS);
            // Schedule the fourth task to run after 4,300 seconds.
            scheduler.schedule(task, 4300, TimeUnit.SECONDS);
        } finally {
            // Shut down the thread pool after all tasks complete.
            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

Análise baseada na saída do log:

  • Na primeira chamada, o cache está vazio. O sistema recupera uma credencial com base na sua configuração e a armazena no cache.

  • A segunda chamada usa a mesma credencial da primeira, indicando que ela foi recuperada do cache.

  • Na terceira chamada, a credencial em cache expirou. Seu tempo de expiração (RoleSessionExpiration) é de 3.600 segundos, mas esta chamada é feita 4.200 segundos após a primeira. Consequentemente, o mecanismo de atualização automática do SDK busca uma nova credencial e atualiza o cache.

  • A quarta chamada usa a mesma credencial da terceira, confirmando que o cache foi atualizado.

Documentos relacionados