

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 中的默认凭证提供者链 AWS SDK for Java 2.x
<a name="credentials-chain"></a>

中的默认凭证提供程序链 AWS SDK for Java 2.x 会自动在预定义的位置序列中搜索 AWS 凭据，从而允许应用程序在 AWS 服务 不明确指定凭据来源的情况下进行身份验证。

默认凭证提供程序链由该[DefaultCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html)类实现。它会按顺序将凭证获取任务委托给其他凭证提供程序实现，这些实现会依次检查不同位置的配置。出现第一个可以找到所有必要配置元素的凭证提供程序后，链就会终止。

要使用默认凭证提供程序链来提供临时凭证，请创建服务客户端生成器，但不要指定凭证提供程序。以下代码段创建一个 `DynamoDbClient`，使用默认凭证提供程序链来查找和检索配置设置。

```
// Any external Region configuration is overridden.
// The SDK uses the default credentials provider chain because no specific credentials provider is specified.
Region region = Region.US_WEST_2;
DynamoDbClient ddb = 
    DynamoDbClient.builder()
                  .region(region)
                  .build();
```

## 凭证设置检索顺序
<a name="credentials-default"></a>

适用于 Java 的 SDK 2.x 的默认凭证提供程序链使用预定义的顺序在您的环境中搜索配置。

1. Java 系统属性
   + 软件开发工具包使用[SystemPropertyCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/SystemPropertyCredentialsProvider.html)类从`aws.accessKeyId``aws.secretAccessKey`、和 `aws.sessionToken` Java 系统属性加载临时证书。
**注意**  
有关如何设置 Java 系统属性的信息，请参阅官方 *Java Tutorials* 网站中的 [System Properties](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html) 教程。

1. 环境变量
   + SDK 使用[EnvironmentVariableCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/EnvironmentVariableCredentialsProvider.html)类从`AWS_ACCESS_KEY_ID``AWS_SECRET_ACCESS_KEY`、和`AWS_SESSION_TOKEN`环境变量加载临时证书。

1. Web 身份令牌和 IAM 角色 ARN
   + SDK 使用该[WebIdentityTokenFileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/WebIdentityTokenFileCredentialsProvider.html)类通过使用 Web 身份令牌扮演角色来加载凭证。
   + 凭证提供程序会查找以下环境变量或 JVM 系统属性：
     + `AWS_WEB_IDENTITY_TOKEN_FILE or aws.webIdentityTokenFile`
     + `AWS_ROLE_ARN` 或 `aws.roleArn`
     + `AWS_ROLE_SESSION_NAME` 或 `aws.roleSessionName`（可选）
   + SDK 获取值后，它会调用 AWS Security Token Service (STS)，并使用返回的临时证书对请求进行签名。
   + 诸如 Amazon Elastic Kubernetes Service (EKS) 之类的运行环境会自动 AWS SDKs向其提供网络身份令牌，从而使应用程序能够获得临时证书。 AWS 

1. 共享 `credentials` 和 `config` 文件
   + 软件开发工具包使用从共享`credentials`和文件中的`[default]`配置`config`文件中加载 IAM Identity Center 单点登录设置或临时证书。[ProfileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ProfileCredentialsProvider.html)

     《 AWS SDKs 和工具参考指南》[详细介绍了](https://docs.aws.amazon.com/sdkref/latest/guide/understanding-sso.html#idccredres)适用于 Java 的 SDK 如何与 IAM Identity Center 单点登录令牌配合使用，以获取开发工具包用来调用的 AWS 服务临时证书。
**注意**  
`credentials`和`config`文件由各种 AWS SDKs 和工具共享。有关更多信息，请参阅[。 aws/credentials and .aws/config AWS SDKs 和《工具参考指南》中的文件](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html)。
   + 由于共享 `credentials` 和 `config` 文件中的配置文件包含许多不同的设置集，因此 `ProfileCredentialsProvider` 会委托给一系列其他提供程序，以便在 `[default]` 配置文件下查找设置：
     + **Web 身份令牌凭证**（类 `WebIdentityTokenCredentialsProvider`）：当配置文件包含 `role_arn` 和 `web_identity_token_file` 时。
     + **SSO 凭证**（类 `SsoCredentialsProvider`）：当配置文件包含与 SSO 相关的属性（例如 `sso_role_name`、`sso_account_id`）时。
     + **带有来源配置文件且基于角色的凭证**（类 `StsAssumeRoleCredentialsProvider`）：当配置文件包含 `role_arn` 和 `source_profile` 时。
     + **带有凭证来源且基于角色的凭证**（类 `StsAssumeRoleWithSourceCredentialsProvider`）：当配置文件包含 `role_arn` 和 `credential_source` 时。
       + 当 `credential_source = Environment` 时：使用 `SystemPropertyCredentialsProvider` 和 `EnvironmentVariableCredentialsProvider` 组成的链
       + 当 `credential_source = Ec2InstanceMetadata` 时：使用 `InstanceProfileCredentialsProvider`
       + 当 `credential_source = EcsContainer` 时：使用 `ContainerCredentialsProvider`
     + **控制台登录凭证**（类别`LoginCredentialsProvider`）：当配置文件包含时 `login_session` 
     + **进程凭证**（类 `ProcessCredentialsProvider`）：当配置文件包含 `credential_process` 时。
     + **会话凭证**（类 `StaticSessionCredentialsProvider`）：当配置文件包含 `aws_access_key_id`、`aws_secret_access_key` 和 `aws_session_token` 时。
     + **基本凭证**（类 `StaticCredentialsProvider`）：当配置文件包含 `aws_access_key_id` 和 `aws_secret_access_key` 时。

1.  Amazon ECS 容器凭证
   + SDK 使用[ContainerCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ContainerCredentialsProvider.html)类通过以下环境变量加载临时证书：

     1. `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 或 `AWS_CONTAINER_CREDENTIALS_FULL_URI`

     1. `AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE` 或 `AWS_CONTAINER_AUTHORIZATION_TOKEN`

   ECS 容器代理会自动设置指向 ECS 凭证端点的 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 环境变量。在不使用标准 ECS 凭证端点的特定场景中通常会设置其他环境变量。

1.  Amazon EC2 实例 IAM 角色提供的证书
   + SDK 使用[InstanceProfileCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/InstanceProfileCredentialsProvider.html)类从 Amazon EC2 元数据服务加载临时证书。

1. 如果 SDK 无法通过上面列出的所有步骤找到必要的配置设置，则会抛出异常，输出类似于以下内容：

   ```
   software.amazon.awssdk.core.exception.SdkClientException: Unable to load credentials from any of the providers 
   in the chain AwsCredentialsProviderChain(credentialsProviders=[SystemPropertyCredentialsProvider(), 
   EnvironmentVariableCredentialsProvider(), WebIdentityTokenCredentialsProvider(), ProfileCredentialsProvider(), 
   ContainerCredentialsProvider(), InstanceProfileCredentialsProvider()])
   ```

## 在代码中使用 `DefaultCredentialsProvider`
<a name="default-credentials-provider-in-code"></a>

您可以在代码中显式使用默认凭证提供程序链。因为 SDK 默认使用 `DefaultCredentialsProvider`，这在功能上等同于您根本不指定凭证提供程序。但显式使用默认凭证提供程序链可以使代码更具可读性，并且能够自我说明。这清楚地表明了您打算使用默认凭证链。

```
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;

public class ExplicitDefaultCredentialsExample {
    public static void main(String[] args) {
        // Explicitly create the DefaultCredentialsProvider.
        DefaultCredentialsProvider defaultCredentialsProvider = DefaultCredentialsProvider
                                                                    .builder().build();

        // Use it with any service client.
        S3Client s3Client = S3Client.builder()
            .region(Region.US_WEST_2)
            .credentialsProvider(defaultCredentialsProvider)
            .build();

        // Now you can use the client with the default credentials chain.
        s3Client.listBuckets();
    }
}
```

在构建默认凭证提供程序时，您可以提供更多配置：

```
DefaultCredentialsProvider customizedProvider = DefaultCredentialsProvider.builder()
    .profileName("custom-profile")  // Use a specific profile if the chain gets to the `ProfileCredentialsProvider` stage.
    .asyncCredentialUpdateEnabled(true)  // Enable async credential updates.
    .build();
```

这种方法为您提供了更多控制，同时仍然保留默认凭证链的便利性。