

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

# 使用从外部进程加载凭证 AWS SDK for Java 2.x
<a name="credentials-process"></a>

**警告**  
以下内容描述从外部进程获取临时凭证的方法。这可能很危险，因此请谨慎行事。我们建议：只要有可能，就尽量使用其他凭证提供程序。如果使用此选项，我们建议您确保使用操作系统的安全最佳实践，尽可能锁定 `config` 文件。  
确保您的自定义凭证工具不会向中写入任何秘密信息`StdErr`。 SDKs 并且 AWS CLI 可以捕获和记录此类信息，从而有可能将其暴露给未经授权的用户。

使用适用于 Java 的 SDK 2.x，您可以从外部流程获取用于自定义用例的临时凭证。可通过两种方式配置此功能。

## 使用 `credential_process` 设置
<a name="credentials-credential_process"></a>

如果您有提供临时凭证的方法，则可以通过将 `credential_process` 设置作为配置文件定义的一部分添加到 `config` 文件中来进行集成。您指定的值必须使用命令文件的完整路径。如果文件路径包含任何空格，则必须用引号将其括起来。

SDK 将完全按照给定的形式调用命令，然后从 `stdout` 中读取 JSON 数据。

以下示例演示如何对不带空格的文件路径和带空格的文件路径使用此设置。

------
#### [ Linux/macOS ]

**文件路径中没有空格**  

```
[profile process-credential-profile]
credential_process = /path/to/credential/file/credential_file.sh --custom-command custom_parameter
```

**文件路径中有空格**  

```
[profile process-credential-profile]
credential_process = "/path/with/space to/credential/file/credential_file.sh" --custom-command custom_parameter
```

------
#### [ Windows ]

**文件路径中没有空格**  

```
[profile process-credential-profile]
credential_process = C:\Path\To\credentials.cmd --custom_command custom_parameter
```

**文件路径中有空格**  

```
[profile process-credential-profile]
credential_process = "C:\Path\With Space To\credentials.cmd" --custom_command custom_parameter
```

------

以下代码段演示如何生成一个使用名为 `process-credential-profile` 的配置文件中定义的临时凭证的服务客户端。

```
Region region = Region.US_WEST_2;
S3Client s3Client = S3Client.builder()
      .region(region)
      .credentialsProvider(ProfileCredentialsProvider.create("process-credential-profile"))
      .build();
```

有关使用外部进程作为临时证书来源的详细信息，请参阅《 AWS SDKs 和工具参考指南》中的 “[流程凭证” 部分](https://docs.aws.amazon.com/sdkref/latest/guide/feature-process-credentials.html)。

## 使用 `ProcessCredentialsProvider`
<a name="credentials-procredprovider"></a>

除了使用 `config` 文件中的设置之外，您还可以使用 SDK 的 `[ProcessCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/ProcessCredentialsProvider.html)` 通过 Java 加载临时凭证。

以下示例演示如何通过使用 `ProcessCredentialsProvider` 和配置使用临时凭证的服务客户端来指定外部流程的各种版本。

------
#### [ Linux/macOS ]

**文件路径中没有空格**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("/path/to/credentials.sh optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

**文件路径中有空格**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("/path\\ with\\ spaces\\ to/credentials.sh optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

------
#### [ Windows ]

**文件路径中没有空格**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("C:\\Path\\To\\credentials.exe optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

**文件路径中有空格**  

```
ProcessCredentialsProvider credentials = 
    ProcessCredentialsProvider
        .builder()
        .command("\"C:\\Path\\With Spaces To\\credentials.exe\" optional_param1 optional_param2")
        .build();

S3Client s3 = S3Client.builder()
                      .region(Region.US_WEST_2)
                      .credentialsProvider(credentials)
                      .build();
```

------

## 使用 IAM Roles Anywhere 进行身份验证
<a name="credentials-iam-roles-anywhere"></a>

[IAM Roles An AWS 服务 ywher](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/introduction.html) e 允许您获取在外部运行的工作负载的临时 AWS 证书 AWS。借助该服务，您可以从本地或其他云环境安全访问 AWS 资源。

在使用 IAM Roles Anywhere 对请求进行身份验证之前，您首先需要收集所需的信息并下载[凭证助手工具](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html)。按照《IAM Roles Anywhere 用户指南》中的[入门](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/getting-started.html)说明进行操作，您可以创建必要的构件。

适用于 Java 的 SDK 没有专门的凭证提供程序来从 IAM Roles Anywhere 检索临时凭证，但您可以使用凭证助手工具以及其中一个选项[从外部进程检索凭证](#credentials-process)。

### 在配置文件中使用 `credential_process` 设置
<a name="credentials-iam-roles-anywhere-config"></a>

共享 AWS 配置文件中的以下片段显示了使用该`credential_process`设置的名为`roles_anywhere`的配置文件：

```
[profile roles_anywhere]
credential_process = ./aws_signing_helper credential-process \
  --certificate /path/to/certificate \
  --private-key /path/to/private-key \
  --trust-anchor-arn arn:aws:rolesanywhere:region:account:trust-anchor/TA_ID \
  --profile-arn arn:aws:rolesanywhere:region:account:profile/PROFILE_ID \
  --role-arn arn:aws:iam::account:role/role-name-with-path
```

组装完所有构件后，您需要用您的值替换以红色显示的文本。设置中的第一个元素 `aws_signing_helper` 是凭证助手工具的可执行文件，`credential-process` 是命令。

当您将服务客户端配置为使用 `roles_anywhere` 配置文件时（如以下代码所示），SDK 会缓存临时凭证并在临时凭证到期之前更新凭证：

```
S3Client s3Client = S3Client.builder()
    .credentialsProvider(ProfileCredentialsProvider.builder()
        .profileName("roles_anywhere").build())
    .build();
```

### 配置 `ProcessCredentialsProvider`
<a name="credentials-iam-roles-anywhere-process"></a>

如下所示，您可以使用仅代码方法，使用 `ProcessCredentialsProvider`，而不是使用配置文件设置：

```
ProcessCredentialsProvider processCredentialsProvider = ProcessCredentialsProvider.builder()
    .command("""
            ./aws_signing_helper credential-process \
            --certificate /path/to/certificate \
            --private-key /path/to/private-key \
            --trust-anchor-arn arn:aws:rolesanywhere:region:account:trust-anchor/TA_ID \
            --profile-arn arn:aws:rolesanywhere:region:account:profile/PROFILE_ID \
            --role-arn arn:aws:iam::account:role/role-name-with-path
        """).build();

S3Client s3Client = S3Client.builder()
    .credentialsProvider(processCredentialsProvider)
    .build();
```

组装完所有构件后，用您的值替换以红色显示的文本。