

**本文档仅适用于 AWS CLI 版本 1。**

我们已宣布即将终止对 AWS CLI 版本 1 的支持。建议您迁移到 AWS CLI 版本 2。有关日期、其它详细信息以及如何迁移的信息，请参阅[公告](https://aws.amazon.com/blogs/developer/cli-v1-maintenance-mode-announcement/)。有关 AWS CLI 版本 2 的相关文档，请参阅[版本 2 用户指南](https://docs.aws.amazon.com/cli/latest/userguide/)。

# 在 AWS CLI 中使用外部进程获取凭证
<a name="cli-configure-sourcing-external"></a>

**警告**  
本主题讨论从外部进程获取凭证。如果生成凭证的命令可由未经批准的进程或用户访问，则可能存在安全风险。我们建议您使用 AWS CLI 和 AWS 提供的支持的安全替代方案，以降低泄露凭证的风险。请务必保管好 `config` 文件及任何支持文件和工具，以防泄露。  
确保您的自定义凭证工具不会将任何秘密信息写入 `StdErr`，因为开发工具包和 AWS CLI 可以捕获和记录此类信息，可能会将其向未经授权的用户公开。

如果您有 AWS CLI 不直接支持的生成或查找凭证的方法，则可以通过在 `config` 文件中配置 `credential_process` 设置来配置 AWS CLI 使用它。

例如，您可以在 `config` 文件中包含类似于以下内容的条目。

```
[profile developer]
credential_process = /opt/bin/awscreds-custom --username helen
```

**语法**  
要以与任何操作系统兼容的方式创建此字符串，请遵循以下规则：
+ 如果路径或文件名包含空格，请将完整路径和文件名用双引号 (" ") 括起来。该路径和文件名仅包含以下字符：A-Z a-z 0-9 - \$1 . 空格
+ 如果参数名称或参数值包含空格，则用双引号 (" ") 将该元素括起来。仅括起来名称或值，而不是名称值对。
+ 请勿在字符串中包含任何环境变量。例如，您不能包含 `$HOME` 或 `%USERPROFILE%`。
+ 不要将主文件夹指定为 `~`。您必须指定完整路径。

**Windows 示例**

```
credential_process = "C:\Path\To\credentials.cmd" parameterWithoutSpaces "parameter with spaces"
```

**Linux 或 macOS 示例**

```
credential_process = "/Users/Dave/path/to/credentials.sh" parameterWithoutSpaces "parameter with spaces"
```

**凭证计划的预期输出**

AWS CLI 按照配置文件中指定的方式运行该命令，然后从 `STDOUT` 读取数据。您指定的命令必须在 `STDOUT` 上生成符合以下语法的 JSON 输出。

```
{
  "Version": 1,
  "AccessKeyId": "an AWS access key",
  "SecretAccessKey": "your AWS secret access key",
  "SessionToken": "the AWS session token for temporary credentials", 
  "Expiration": "ISO8601 timestamp when the credentials expire"
}
```

**注意**  
截至撰写本文之时，`Version` 密钥必须设置为 `1`。随时间推移和该结构的发展，该值可能会增加。

`Expiration` 密钥是采用 [ISO8601](https://en.wikipedia.org/wiki/ISO_8601) 格式的时间戳。如果工具的输出中不存在 `Expiration` 键，则 CLI 假定凭证是不刷新的长期凭证。否则，将其视为临时凭证，并通过在其过期前重新运行 `credential_process` 命令来自动刷新凭证。

**注意**  
AWS CLI ***不*** 缓存外部进程凭据，这一点不同于代入角色凭证。如果需要缓存，则必须在外部进程中实现。

外部进程可以返回非零返回代码，以指示在检索凭证时发生错误。