中的默认凭证提供者链 Amazon SDK for Java 2.x - Amazon SDK for Java 2.x
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

中的默认凭证提供者链 Amazon SDK for Java 2.x

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

默认凭证提供程序链由该DefaultCredentialsProvider类实现。它按顺序委托给其他凭证提供程序实现,这些实现检查不同位置的配置。第一个可以找到所有必要配置元素的凭证提供程序会导致链结束。

要使用默认凭证提供程序链来提供临时证书,请创建服务客户端生成器,但不要指定凭证提供程序。以下代码段创建了一个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();

凭证设置检索顺序

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

  1. Java 系统属性

    • 软件开发工具包使用SystemPropertyCredentialsProvider类从aws.accessKeyIdaws.secretAccessKey、和 aws.sessionToken Java 系统属性加载临时证书。

      注意

      有关如何设置 Java 系统属性的信息,请参阅官方 Java Tutorials 网站中的 System Properties 教程。

  2. 环境变量

  3. 网络身份令牌和 IAM 角色 ARN

    • SDK 使用该WebIdentityTokenFileCredentialsProvider类通过使用 Web 身份令牌扮演角色来加载凭证。

    • 凭据提供程序会查找以下环境变量或 JVM 系统属性:

      • AWS_WEB_IDENTITY_TOKEN_FILE or aws.webIdentityTokenFile

      • AWS_ROLE_ARNaws.roleArn

      • AWS_ROLE_SESSION_NAMEaws.roleSessionName(可选)

    • SDK 获取值后,它会调用 Amazon Security Token Service (STS) 并使用返回的临时证书对请求进行签名。

    • 诸如 Amazon Elastic Kubernetes Service (EKS) 之类的运行环境会自动 Amazon SDKs向其提供网络身份令牌,从而使应用程序能够获得临时证书。 Amazon

  4. 共享的 credentialsconfig 文件

    • 软件开发工具包使用从共享credentials和文件中的[default]配置config文件中加载 IAM Identity Center 单点登录设置或临时证书。ProfileCredentialsProvider

      《 Amazon SDKs 和工具参考指南》详细介绍了适用于 Java 的 SDK 如何与 IAM Identity Center 单点登录令牌配合使用,以获取开发工具包用来调用的 Amazon Web Services 服务临时证书。

      注意

      credentialsconfig文件由各种 Amazon SDKs 和工具共享。有关更多信息,请参阅。 aws/credentials and .aws/config Amazon SDKs 和《工具参考指南》中的文件

    • 由于共享credentialsconfig文件中的配置文件可能包含许多不同的设置集,因此ProfileCredentialsProvider委托给一系列其他提供商在[default]配置文件下查找设置:

      • 基本凭证(类别StaticCredentialsProvider):当配置文件包含aws_access_key_id和时aws_secret_access_key

      • 会话凭证(类别StaticSessionCredentialsProvider):当配置文件包含aws_access_key_idaws_secret_access_key、和时aws_session_token

      • 流程凭证(类别ProcessCredentialsProvider):当配置文件包含时credential_process

      • SSO 凭证(类别SsoCredentialsProvider):当配置文件包含与 SSO 相关的属性时,例如。sso_role_name sso_account_id

      • Web 身份令牌凭证(类别WebIdentityTokenCredentialsProvider):当配置文件包含role_arn和时web_identity_token_file

      • 带有来源配置文件(类别StsAssumeRoleCredentialsProvider)的基于角色的凭证:当配置文件包含role_arnsource_profile时。

      • 带有凭据来源的基于角色的凭证(类别StsAssumeRoleWithSourceCredentialsProvider):当配置文件包含role_arn和时。credential_source

        • 时间credential_source = Environment:它使用的是SystemPropertyCredentialsProvider和链 EnvironmentVariableCredentialsProvider

        • 什么时候credential_source = Ec2InstanceMetadata:它使用 InstanceProfileCredentialsProvider

        • 什么时候credential_source = EcsContainer:它使用 ContainerCredentialsProvider

  5. Amazon ECS 容器凭证

    • SDK 使用ContainerCredentialsProvider类通过以下环境变量加载临时证书:

      1. AWS_CONTAINER_CREDENTIALS_RELATIVE_URIAWS_CONTAINER_CREDENTIALS_FULL_URI

      2. AWS_CONTAINER_AUTHORIZATION_TOKEN_FILEAWS_CONTAINER_AUTHORIZATION_TOKEN

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

  6. Amazon EC2 实例 IAM 角色提供的证书

  7. 如果 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代码

你可以在代码中明确使用默认的凭证提供程序链。这在功能上等同于您根本不指定凭证提供商,因为 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();

这种方法为您提供了更多的控制权,同时还提供了默认凭证链的便利。