El SDK de Alibaba Cloud utiliza la herramienta Credentials para gestionar de forma centralizada las credenciales, como su AccessKey y su STS Token. Este tema describe los tipos de credenciales compatibles y sus métodos de configuración.
Requisitos previos
La herramienta Credentials requiere Java 8 o una versión posterior. Para más información, consulte Alibaba Cloud SDK Maintenance Policy.
Para el SDK V2.0 de Alibaba Cloud, consulte V2.0 SDK and V1.0 SDK.
Instalar Credentials
Utilice el paquete de dependencia más reciente de Credentials para acceder a todas las funciones.
<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 conocer la versión más reciente del paquete de dependencia de Credentials, consulte GitHub o Maven Repository. Para la versión más reciente del paquete de dependencia de Tea, consulte GitHub o Maven Repository.
Tipos de credenciales y parámetros
La clase com.aliyun.credentials.models.Config define los tipos de credenciales y los parámetros de configuración que admite la herramienta Credentials. El parámetro type especifica el tipo de credencial, y cada tipo requiere distintos parámetros de configuración. La siguiente tabla describe los valores válidos para type y sus parámetros compatibles. En la tabla, indica un parámetro obligatorio, - indica un parámetro opcional y indica que el parámetro no es compatible.
Los tipos de credenciales y los parámetros que no aparecen en esta tabla están obsoletos.
|
Parámetro |
|||||||
|
accessKeyId: el ID de la clave de acceso. |
|
|
|
|
|
|
|
|
accessKeySecret: la clave de acceso secreta. |
|
|
|
|
|
|
|
|
securityToken: el token de seguridad. |
|
|
- |
|
|
|
|
|
roleArn: el ARN del rol de RAM. |
|
|
|
|
|
|
|
|
roleSessionName: un nombre de sesión personalizado. El formato predeterminado es |
|
|
- |
|
- |
|
|
|
roleName: el nombre del rol de RAM. |
|
|
|
- |
|
|
|
|
disableIMDSv1: especifica si se usa el modo de seguridad mejorada. El valor predeterminado es |
|
|
|
- |
|
|
|
|
bearerToken: el token de portador. |
|
|
|
|
|
|
|
|
policy: la directiva de permisos personalizada. |
|
|
- |
|
- |
|
|
|
roleSessionExpiration: el tiempo de expiración de la sesión en segundos. El valor predeterminado es 3600. El valor debe estar entre 900 y la duración máxima de sesión del rol de RAM. |
|
|
- |
|
- |
|
|
|
oidcProviderArn: el ARN del proveedor de identidades OIDC. |
|
|
|
|
|
|
|
|
oidcTokenFilePath: la ruta del archivo al token OIDC. |
|
|
|
|
|
|
|
|
externalId: el ID externo del rol de RAM. Este parámetro ayuda a prevenir el problema de delegado confuso. Para más información, consulte Use an external ID to prevent the confused deputy problem. |
|
|
- |
|
|
|
|
|
credentialsURI: el URI de la credencial externa. |
|
|
|
|
|
|
|
|
STSEndpoint: el endpoint del servicio Security Token Service (STS). Este parámetro es compatible con endpoints de VPC y endpoints públicos. Para ver la lista de valores posibles, consulte Service endpoints. El valor predeterminado es |
|
|
- |
|
- |
|
|
|
timeout: el tiempo de espera de lectura en milisegundos. El valor predeterminado es 5000. |
|
|
- |
- |
- |
- |
|
|
connectTimeout: el tiempo de espera de conexión en milisegundos. El valor predeterminado es 10000. |
|
|
- |
- |
- |
- |
|
Uso de la herramienta Credentials
La sección anterior describe los tipos de credenciales y los parámetros de configuración que admite la herramienta Credentials. A continuación se presentan ejemplos de código que muestran cómo usar la herramienta. Seleccione el método que mejor se adapte a su escenario.
Incluir un AccessKey directamente en el código de su proyecto genera riesgos de seguridad. Si los permisos del repositorio no se gestionan correctamente, todos los recursos de su cuenta podrían quedar expuestos. Se recomienda almacenar el AccessKey en variables de entorno o archivos de configuración.
Utilice el patrón singleton con la herramienta Credentials. Este patrón habilita el almacenamiento en caché de credenciales integrado de la herramienta. De este modo, se evita el límite de velocidad por llamadas frecuentes a la API y se previene el desperdicio de recursos al crear varias instancias. Para más información, consulte Automatic refresh of session credentials.
Método 1: Cadena de credenciales predeterminada
Este es el método predeterminado que se utiliza en el código de ejemplo del portal de OpenAPI.
Si no pasa ningún parámetro de configuración al inicializar la herramienta Credentials, esta obtiene las credenciales de default credential chain. Para usar este método, asegúrese de que el entorno de ejecución de su aplicación esté configurado con como mínimo uno de los métodos de obtención de credenciales que admite default credential chain.
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
La herramienta Credentials utiliza AccessKey que usted proporciona como credencial de acceso.
Una cuenta de Alibaba Cloud (cuenta raíz) tiene permisos completos sobre todos sus recursos, por lo que exponer un AK representa un riesgo de seguridad significativo. No utilice el AK de una cuenta raíz.
Utilice el AK de un usuario de RAM con permisos de privilegio 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 de STS
La herramienta Credentials utiliza STS token estático que usted proporciona como credencial de acceso.
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 y ARN de rol de RAM
La herramienta Credentials utiliza su AK y el ARN del rol de RAM para llamar a la API de AssumeRole y obtener un token de STS, el cual sirve como credencial de acceso. Las credenciales obtenidas de esta manera admiten la actualización automática. Para más información, consulte Automatic refresh of session credentials.
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: Rol de RAM de instancia de ECS
Si su aplicación se ejecuta en una instancia de Elastic Compute Service (ECS) o de Elastic Container Instance (ECI) con un rol de RAM asignado, la herramienta Credentials obtiene un token de STS de los metadatos de la instancia para usarlo como credencial de acceso. Al acceder a los metadatos de la instancia, la herramienta primero recupera el nombre del rol de RAM asignado a dicha instancia. Para reducir el tiempo de recuperación y mejorar la eficiencia, especifique el nombre del rol de RAM mediante el parámetro roleName o la variable de entorno ALIBABA_CLOUD_ECS_METADATA. Las credenciales obtenidas de esta manera admiten la actualización automática. Para más información, consulte Automatic refresh of session credentials.
De forma predeterminada, la herramienta Credentials accede a los metadatos de la instancia en modo seguro (IMDSv2). Si este acceso falla, utilice el parámetro disableIMDSv1 o la variable de entorno ALIBABA_CLOUD_IMDSV1_DISABLED para controlar el comportamiento alternativo:
Si se establece en
false(valor predeterminado), la herramienta recurre al modo normal para obtener la credencial.Si se establece en
true, la herramienta solo utiliza el modo seguro y lanza una excepción si el acceso falla.
Que su servidor sea compatible con IMDSv2 depende de su configuración.
Para deshabilitar el acceso a las credenciales desde los metadatos de la instancia, establezca la variable de entorno ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
Para más información sobre los metadatos de la instancia, consulte Instance metadata.
Para aprender a otorgar un rol de RAM a una instancia de ECS o ECI, consulte Step 1: Create a RAM role y Grant an instance RAM role to an ECI instance.
Se requiere la versión 0.3.10 o posterior de credentials-java para obtener credenciales temporales en modo seguro.
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 rol OIDC
Si utiliza OIDC para la autenticación y cuenta con created a RAM role for an OIDC identity provider, proporcione a la herramienta Credentials el ARN del proveedor OIDC, la ruta del archivo del token OIDC y el ARN del rol de RAM. Luego, la herramienta llama automáticamente a la API de AssumeRoleWithOIDC para obtener un token de STS para el rol de RAM, el cual se utiliza como credencial de acceso. Las credenciales obtenidas de esta manera admiten la actualización automática. Para más información, consulte Automatic refresh of session credentials. Por ejemplo, si su aplicación se ejecuta en un clúster de Container Service for Kubernetes (ACK) con RRSA habilitado, la herramienta Credentials lee la configuración de OIDC desde las variables de entorno del pod y llama a la API AssumeRoleWithOIDC para obtener un token de STS. Después, utilice este token de STS para acceder a los servicios de 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 credenciales
Encapsule Security Token Service (STS) detrás de un URI de servicio para permitir que los servicios externos obtengan un token de STS sin exponer información confidencial como los AK. La herramienta Credentials utiliza este URI para recuperar un token de STS y emplearlo como credencial de acceso. Las credenciales obtenidas de esta manera admiten la actualización automática. Para más información, consulte Automatic refresh of session credentials.
El URI debe cumplir las siguientes condiciones:
Ser compatible con solicitudes GET.
Devolver un código de estado HTTP 2xx.
-
El cuerpo de la respuesta debe devolver un objeto JSON con la siguiente estructura:
{ "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 de portador
Actualmente, solo Alibaba Cloud Call Center (CCC) es compatible con la autenticación mediante token de portador.
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.
}
}
Cadena de proveedores de credenciales predeterminada
La cadena de proveedores de credenciales predeterminada es un mecanismo alternativo que busca una credencial al revisar una secuencia predefinida de ubicaciones. La búsqueda continúa hasta encontrar una credencial. Si no se encuentra ninguna después de revisar todas las ubicaciones, se lanza una CredentialException. El orden de búsqueda es el siguiente:
1. Propiedades del sistema
La cadena de proveedores primero busca una credencial en las propiedades del sistema de Java.
Si las propiedades del sistema alibabacloud.accessKeyId y alibabacloud.accessKeySecret están definidas, la cadena de proveedores utiliza un AccessKey como credencial predeterminada.
Si las propiedades del sistema alibabacloud.accessKeyId, alibabacloud.accessKeySecret y alibabacloud.sessionToken están definidas, la cadena de proveedores utiliza un token de STS como credencial predeterminada.
Especifique estos valores al agregar los siguientes parámetros de JVM cuando ejecute su programa de Java:
-Dalibabacloud.accessKeyId=your-access-key-id -Dalibabacloud.accessKeySecret=your-access-key-secret
2. Variables de entorno
Si no se encuentra ninguna credencial en las propiedades del sistema, la cadena de proveedores revisa las variables de entorno.
Si ALIBABA_CLOUD_ACCESS_KEY_ID y ALIBABA_CLOUD_ACCESS_KEY_SECRET están presentes y no están vacías, la cadena de proveedores las utiliza como credencial predeterminada.
Si también se configuran ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET y ALIBABA_CLOUD_SECURITY_TOKEN, la cadena de proveedores utiliza un token de STS como credencial predeterminada.
3. Rol de RAM de OIDC
Si no se ha encontrado ninguna credencial, la cadena de proveedores comprueba las siguientes variables de entorno relacionadas con un rol de RAM de OIDC:
ALIBABA_CLOUD_ROLE_ARN: el ARN del rol de RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: el ARN del proveedor OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE: la ruta del archivo del token OIDC.
Si las tres variables de entorno están presentes y no están vacías, la cadena de proveedores utiliza estos valores para llamar a la API de AssumeRoleWithOIDC de Security Token Service (STS) y obtener un token de STS.
4. Archivo de credenciales compartidas
Esta función requiere credentials-java versión 0.3.8 o posterior.
Si no se encuentra ninguna credencial, la cadena de proveedores intenta cargar el archivo de credenciales compartidas, config.json, desde su ubicación predeterminada y utiliza la credencial especificada en dicho archivo.
Linux/macOS:
~/.aliyun/config.jsonWindows:
C:\Users\USER_NAME\.aliyun\config.json
Para configurar una credencial de esta manera, utilice Alibaba Cloud CLI o cree manualmente un archivo config.json en la ruta correspondiente. A continuación se muestra el formato del contenido:
{
"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 |
Descripción |
|
current |
Especifique el nombre de la credencial para recuperar la configuración de credenciales correspondiente. El nombre de la credencial es el valor del parámetro |
|
profiles |
Contiene un conjunto de configuraciones de credenciales. El parámetro
|
5. Rol de RAM de la instancia
Si no se encuentra ninguna credencial, la cadena de proveedores intenta recuperar un token de STS del rol de RAM de la instancia desde los metadatos de dicha instancia. Este token se utiliza después como credencial predeterminada. Para lograrlo, la cadena primero recupera el nombre del rol de RAM asignado a la instancia y luego usa ese rol para obtener el token de STS correspondiente. Para reducir el tiempo de recuperación de credenciales y mejorar la eficiencia, especifique el nombre del rol de RAM directamente mediante la variable de entorno ALIBABA_CLOUD_ECS_METADATA.
De forma predeterminada, la cadena de proveedores accede a los metadatos de la instancia en modo de seguridad reforzada (IMDSv2). Si ocurre una excepción en este modo, controle el comportamiento de respaldo con la variable de entorno ALIBABA_CLOUD_IMDSV1_DISABLED:
Cuando el valor es
false(valor predeterminado), el sistema intenta cambiar al modo heredado para recuperar la credencial.Cuando el valor es
true, se aplica obligatoriamente el modo de seguridad reforzada. Si el acceso falla en este modo, se genera una excepción.
Además, evite que la cadena de proveedores acceda a los metadatos de la instancia para buscar credenciales si establece la variable de entorno ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
Para obtener más información sobre los metadatos de la instancia, consulte Instance metadata.
Para saber cómo otorgar un rol de RAM a una instancia ECS o ECI, consulte Step 1: Create a RAM role y Grant an instance RAM role to an ECI instance.
Para obtener una credencial temporal en el modo de seguridad reforzada, debe usar
credentials-javaversión 0.3.10 o posterior.
6. CredentialsURI
Si no se encuentra ninguna credencial, la cadena de proveedores comprueba la variable de entorno ALIBABA_CLOUD_CREDENTIALS_URI. Si esta variable está establecida y apunta a un URI válido, la cadena accede al URI para recuperar un token de STS.
Actualización automática de la credencial de sesión
Los tipos de credenciales de sesión, como ram_role_arn, ecs_ram_role, oidc_role_arn y credentials_uri, admiten la actualización automática mediante un mecanismo integrado en el proveedor de credenciales. Cuando un cliente de credenciales recupera una credencial por primera vez, el proveedor la almacena en una caché. En las operaciones posteriores, la misma instancia del cliente recupera automáticamente la credencial de esta caché. Si la credencial almacenada en la caché ha caducado, la instancia del cliente obtiene una nueva y actualiza la caché en consecuencia.
En el caso de las credenciales ecs_ram_role, el proveedor de credenciales las actualiza de forma proactiva 15 minutos antes de que caduquen.
El siguiente ejemplo utiliza el patrón singleton para crear un cliente de credenciales. Muestra el mecanismo de actualización al recuperar una credencial en distintos intervalos de tiempo y llamar a una operación de OpenAPI para comprobar que la credencial funciona correctamente.
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álisis basado en la salida del registro:
En la primera llamada, la caché está vacía. El sistema recupera una credencial según su configuración y luego la almacena en la caché.
La segunda llamada utiliza la misma credencial que la primera, lo que indica que se recuperó de la caché.
En la tercera llamada, la credencial almacenada en la caché ya caducó. Su tiempo de expiración (
RoleSessionExpiration) es de 3600 segundos, pero esta llamada se ejecuta 4200 segundos después de la primera. Por lo tanto, el mecanismo de actualización automática del SDK obtiene una nueva credencial y actualiza la caché.La cuarta llamada utiliza la misma credencial que la tercera, lo que confirma que la caché se actualizó.
Documentos relacionados
Para consultar la descripción general de los conceptos básicos de RAM, consulte Basic concepts.
Para crear una AccessKey, consulte Create an AccessKey.
Para crear usuarios de RAM, AccessKeys y roles de RAM mediante programación, definir directivas de permisos y otorgar permisos, consulte RAM SDK overview.
Para asumir un rol mediante programación, consulte STS SDK overview.
Para obtener detalles sobre las API de RAM y STS, consulte API reference.
Best practices for using access credentials to call Alibaba Cloud OpenAPI