

# OIDC 联合身份验证
<a name="id_roles_providers_oidc"></a>

假设您要创建一个访问 Amazon 资源的应用程序，例如使用工作流访问 Amazon S3 和 DynamoDB 的 GitHub Actions。

当您使用这些工作流时，将向必须使用 Amazon 访问密钥进行签名的 Amazon 服务提出请求。但是，我们**强烈**建议您**不要**将 Amazon 凭证长期存储在 Amazon 之外的应用程序中。相反，使用 *OIDC 联合身份验证*将应用程序配置为在需要时动态请求临时 Amazon 安全凭证。提供的临时凭证会映射到一个 Amazon 角色，该角色将只拥有执行该应用程序所需任务的必要权限。

借助 OIDC 联合身份验证，您不需要创建自定义登录代码或管理自己的用户身份。相反，您可以在应用程序（例如 GitHub Actions 或任何其他兼容 [OpenID Connect（OIDC）](http://openid.net/connect/)的 IdP）中使用 OIDC 进行 Amazon 身份验证。他们会接收身份验证令牌（称为 JSON Web 令牌，JWT），然后用该令牌交换 Amazon 中的临时安全凭证，这些凭证映射到有权使用您 Amazon Web Services 账户 中资源的 IAM 角色。使用 IdP 有助您确保 Amazon Web Services 账户的安全，因为您不必随应用程序嵌入和分配长期安全凭证。

OIDC 联合身份验证支持机器对机器身份验证（例如，CI/CD 管道、自动脚本和无服务器应用程序）和人工用户身份验证。对于需要管理用户注册、登录和用户个人资料的人工用户身份验证场景，可以考虑将 [Amazon Cognito](https://www.amazonaws.cn/cognito/) 用作身份凭证代理程序。有关将 Amazon Cognito 与 OIDC 结合使用的详细信息，请参阅 [用于移动应用程序的 Amazon Cognito](id_federation_common_scenarios.md#id_roles_providers_oidc_cognito)。

**注意**  
由 OpenID Connect (OIDC) 身份提供程序颁发的 JSON Web 令牌 (JWT) 在 `exp` 声明中包含指定令牌何时过期的过期时间。在 [OpenID Connect (OIDC) Core 1.0 标准](https://openid.net/specs/openid-connect-core-1_0.html)允许的情况下，IAM 在 JWT 中指定的到期时间之外提供五分钟的时段来解决时钟偏差。这意味着将接受 IAM 在到期时间后但在这五分钟内收到的 OIDC JWT 以进行进一步的评估和处理。

**Topics**
+ [

## 有关 OIDC 联合身份验证的其他资源
](#id_roles_providers_oidc_resources)
+ [

# 在 IAM 中创建 OpenID Connect（OIDC）身份提供者
](id_roles_providers_create_oidc.md)
+ [

# 获取 OpenID Connect 身份提供者的指纹
](id_roles_providers_create_oidc_verify-thumbprint.md)
+ [

# 适用于共享 OIDC 提供者的身份提供者控制
](id_roles_providers_oidc_secure-by-default.md)

## 有关 OIDC 联合身份验证的其他资源
<a name="id_roles_providers_oidc_resources"></a>

以下资源可帮助您详细了解 OIDC 联合身份验证：
+ 通过[在 Amazon Web Services 中配置 OpenID Connect](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)，从而在 GitHub 工作流中使用 OpenID Connect
+ 《适用于 Android 的 Amplify 库指南》**中的 [Amazon Cognito 身份](https://docs.amplify.aws/lib/auth/advanced/q/platform/android/)和《适用于 Swift 的 Amplify 库指南》**中的 [Amazon Cognito 身份](https://docs.amplify.aws/lib/auth/advanced/q/platform/ios/)。
+ *Amazon 安全博客*上的[授予 Amazon 资源访问权限时如何使用外部 ID](https://www.amazonaws.cn/blogs/security/how-to-use-external-id-when-granting-access-to-your-aws-resources/)提供了安全配置跨账户访问和外部身份联合验证的指导。

# 在 IAM 中创建 OpenID Connect（OIDC）身份提供者
<a name="id_roles_providers_create_oidc"></a>

*IAM OIDC 身份提供程序*是 IAM 中的实体，这些实体描述支持 [OpenID Connect](http://openid.net/connect/) (OIDC) 标准的身份提供程序 (IdP) 服务，如 Google 或 Salesforce）。当您要在与 OIDC 兼容的 IdP 和您的 Amazon Web Services 账户 之间建立信任时，请使用 IAM OIDC 身份提供程序。如果您正在创建需要访问 Amazon 资源的移动应用或 Web 应用程序，但又不想创建自定义登录代码或管理您自己的用户身份，这会很有用。有关此方案的更多信息，请参阅[OIDC 联合身份验证](id_roles_providers_oidc.md)。

您可以使用 Amazon Web Services 管理控制台、Amazon Command Line Interface、Tools for Windows PowerShell 或 IAM API 创建和管理 IAM OIDC 身份提供程序。

创建 IAM OIDC 身份提供程序后，必须创建一个或多个 IAM 角色。角色是 Amazon 中的一个实体，它没有自己的凭证（与用户一样）。但在此上下文中，角色将动态分配给由组织的 IdP 验证的 OIDC 联合主体。该角色允许组织的 IdP 请求临时安全凭证以便访问 Amazon。分配给该角色的策略决定了用户可在 Amazon 中执行的操作。要为第三方身份提供程序创建角色，请参阅 [为第三方身份提供者创建角色](id_roles_create_for-idp.md)。

**重要**  
为支持 `oidc-provider` 资源的操作配置基于身份的策略时，IAM 会评估完整的 OIDC 身份提供者 URL，包括任何指定的路径。如果 OIDC 身份提供者 URL 包含路径，则必须将该路径作为 `Resource` 元素值包含在 `oidc-provider` ARN 中。您还可以选择将正斜杠和通配符（`/*`）附加到 URL 域，或者在 URL 路径中的任何位置使用通配符（`*` 和 `?`）。如果请求中的 OIDC 身份提供者 URL 与策略中 `Resource` 元素设置的值不匹配，请求将会失败。

要解决有关 IAM OIDC 联合身份验证的常见问题，请参阅 Amazon re:Post 上的[解决与 OIDC 相关的错误](https://repost.aws/knowledge-center/iam-oidc-idp-federation)。

**Topics**
+ [

## 先决条件：验证身份提供商的配置
](#manage-oidc-provider-prerequisites)
+ [

## 创建和管理 OIDC 提供商（控制台）
](#manage-oidc-provider-console)
+ [

## 创建和管理 IAM OIDC 身份提供程序 (Amazon CLI)
](#manage-oidc-provider-cli)
+ [

## 创建和管理 OIDC 身份提供程序 (Amazon API)
](#manage-oidc-provider-api)

## 先决条件：验证身份提供商的配置
<a name="manage-oidc-provider-prerequisites"></a>

在创建 IAM OIDC 身份提供商之前，您必须从 IdP 处获得以下信息。有关获取 OIDC 提供商配置信息的更多信息，请参阅 IdP 的文档。

1. 确定您的 OIDC 身份提供商的公开可用 URL。该 URL 必须以 https:// 开头。根据 OIDC 标准，允许使用路径组件，但不允许使用查询参数。通常，该 URL 只包含一个主机名，如 https://server.example.org 或 https://example.com。URL 不应包含端口号。

1. 在 OIDC 身份提供商的 URL 末尾添加 **/.well-known/openid-configuration**，以查看该提供商的公开可用配置文档和元数据。您必须有一个 JSON 格式的发现文档，其中包含提供商的配置文档和元数据，这些文档和元数据可以从 [OpenID Connect 提供商发现端点 URL](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig) 中检索。

1. 确认以下值包含在提供商的配置信息中。如果 openid 配置缺少这些字段中的任何一个，则必须更新发现文档。此过程可能因身份提供商而异，因此请按照 IdP 文档完成此任务。
   + issuer：域的 URL。
   + jwks\$1uri：IAM 获取公钥的 JSON Web 密钥集 (JWKS) 端点。您的身份提供商必须在 openid 配置中包含一个 JSON Web 密钥集 (JWKS) 端点。此 URI 定义了从何处获取用于验证来自身份提供商的签名令牌的公钥。
**注意**  
JSON Web 密钥集 (JWKS) 必须至少包含一个密钥，最多可以有 100 个 RSA 密钥和 100 个 EC 密钥。如果 OIDC 身份提供商的 JWKS 中包含超过 100 个 RSA 密钥或 100 个 EC 密钥，则在搭配使用 [AssumeRolewithEbidentity](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 操作以及由超过 100 个密钥限制的密钥类型签名的 JWT 时，将返回 `InvalidIdentityToken` 异常。例如，如果 JWT 使用 RSA 算法进行签名，而提供商的 JWKS 中含有超过 100 个 RSA 密钥，则会返回 `InvalidIdentityToken` 异常。
   + claims\$1supported：有关用户的信息，可帮助确保来自 IdP 的 OIDC 身份验证响应包含 IAM 策略中 Amazon 用于检查 OIDC 联合主体的必需属性。有关可用于声明的 IAM 条件键的列表，请参阅 [Amazon OIDC 联合身份验证的可用键](reference_policies_iam-condition-keys.md#condition-keys-wif)。
     + aud：必须在 JSON Web 令牌 (JWT) 中确定 IdP 发布的受众声明值。受众 (aud) 声明是特定于应用程序的，用于标识令牌的预期接收者。当您向 OpenID Connect 提供商注册移动或 Web 应用时，他们会建立一个客户端 ID 来标识该应用程序。客户端 ID 是应用的唯一标识符，在 aud 声明中传递用于进行身份验证。在创建 IAM OIDC 身份提供商时，aud 声明必须与“受众”值匹配。
     + iat：声明必须包含 `iat` 的值，该值表示 ID 令牌的发布时间。
     + iss：身份提供商的 URL。URL 必须以 https:// 开头，并且应与提供给 IAM 的提供商 URL 相对应。根据 OIDC 标准，允许使用路径组件，但不允许使用查询参数。通常，该 URL 只包含一个主机名，如 https://server.example.org 或 https://example.com。URL 不应包含端口号。
   + response\$1types\$1supported：id\$1token
   + subject\$1types\$1supported：public
   + id\$1tokeninging\$1alg\$1values\$1suirted：RS256、RS384、RS512、ES256、ES384、ES512
**注意**  
可以在下面的示例中包括其他声明，如 `my_custom_claim`；但是，Amazon STS 将忽略该声明。  

   ```
   {
     "issuer": "https://example-domain.com",
     "jwks_uri": "https://example-domain.com/jwks/keys",
     "claims_supported": [
       "aud",
       "iat",
       "iss",
       "name",
       "sub",
       "my_custom_claim"
     ],
     "response_types_supported": [
       "id_token"
     ],
     "id_token_signing_alg_values_supported": [
       "RS256",
       "RS384",
       "RS512",
       "ES256",
       "ES384",
       "ES512"
     ],
     "subject_types_supported": [
       "public"
     ]
   }
   ```

## 创建和管理 OIDC 提供商（控制台）
<a name="manage-oidc-provider-console"></a>

按照以下说明在 Amazon Web Services 管理控制台 中创建和管理 IAM OIDC 身份提供程序。

**重要**  
如果您使用的是 Google、Facebook 或 Amazon Cognito 的 OIDC 身份提供程序，请勿使用此过程创建单独的 IAM 身份提供程序。这些 OIDC 身份提供程序已经内置到 Amazon，并可供您使用。相反，请按照以下步骤为身份提供程序创建新角色，请参阅 [创建用于 OpenID Connect 联合身份验证（控制台）的角色](id_roles_create_for-idp_oidc.md)。

**创建 IAM OIDC 身份提供程序（控制台）**

1. <a name="idpoidcstep1"></a>在创建 IAM OIDC 身份提供程序之前，您必须向 IdP 注册您的应用程序以便接收*客户端 ID*。客户端 ID（也称为*受众*）是您的应用的唯一标识符，在您向 IdP 注册您的应用时颁发给您。有关如何获取客户端 ID 的更多信息，请参阅您的 IdP 的文档。
**注意**  
Amazon 使用我们的受信任根证书颁发机构（CA）库来保护与 OIDC 身份提供者（IdP）之间的通信，从而验证JSON Web 密钥集（JWKS）端点的 TLS 证书。如果您的 OIDC IdP 依赖的证书不是由其中某个受信任的 CA 签名，则仅在此时我们会使用 IdP 配置中设置的指纹来保护通信。如果我们无法检索 TLS 证书或需要 TLS v1.3，则 Amazon 将回退到指纹验证。

1. 通过 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择 **Identity providers**（身份提供程序），然后选择 **Add provider**（添加提供商）。

1. 对于 **Configure provider**（配置提供商），选择 **OpenID Connect**。

1. 对于 **Provider URL**，键入 IdP 的 URL。该 URL 必须遵从以下限制：
   + 该 URL 区分大小写。
   + URL 必须以 **https://** 开头。
   + URL 不应包含端口号。
   + 在您的 Amazon Web Services 账户 中，每个 IAM OIDC 身份提供程序都必须有唯一的 URL。如果尝试提交的 URL 已用于 Amazon Web Services 账户 中的 OpenID Connect 提供商，则会出现错误。

1. 对于 **Audience**，键入您向 IdP 注册的、在[Step 1](#idpoidcstep1) 中接收的并且将向 Amazon 发出请求的应用程序的客户端 ID。如果您对于此 IdP 有其他客户端 ID（也称为*受众*），稍后可以在提供商详细信息页面上添加它们。
**注意**  
如果 IdP JWT 令牌包含 `azp` 声明，请输入此值作为“受众”值。  
如果您的 OIDC 身份提供商在令牌中同时设置 `aud` 和 `azp` 声明，则 Amazon STS 将使用 `azp` 声明中的值作为 `aud` 声明。

1. （可选）对于 **Add tags** (添加标签)，您可以添加键值对来帮助识别和组织您的 IdP。您还可以使用标签来控制对 Amazon 资源的访问。要了解有关标记 IAM OIDC 身份提供程序的更多信息，请参阅 [标记 OpenID Connect（OIDC）身份提供者](id_tags_oidc.md)。选择 **Add tag（添加标签）**。为每个标签键值对输入值。

1. 验证您提供的信息。完成此操作后，选择 **Add provider**（添加提供商）。IAM 将尝试检索并使用 OIDC IdP 服务器证书的顶级中间 CA 指纹来创建 IAM OIDC 身份提供者。
**注意**  
OIDC 身份提供者的证书链必须以域或颁发者 URL 开始，然后是中间证书，最后是根证书。如果证书链顺序不同或者包含重复证书或其他证书，则您会收到签名不匹配错误，并且 STS 无法验证 JSON Web 令牌 (JWT)。更正服务器返回的链中证书的顺序以解决错误。有关证书链标准的更多信息，请参阅 RFC Series 网站上的 [RFC 5246 中的 certificate\$1list](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.2)。

1. 将 IAM 角色分配至身份提供程序，以向身份提供程序管理的外部用户身份授予访问账户中的 Amazon 资源的权限。要了解有关为联合身份创建角色的更多信息，请参阅 [为第三方身份提供者创建角色](id_roles_create_for-idp.md)
**注意**  
角色信任策略中使用的 OIDC IdP 必须与信任它的角色位于同一账户中。

**为 IAM OIDC 身份提供程序添加或删除指纹（控制台）**
**注意**  
Amazon 使用我们的受信任根证书颁发机构（CA）库来保护与 OIDC 身份提供者（IdP）之间的通信，从而验证JSON Web 密钥集（JWKS）端点的 TLS 证书。如果您的 OIDC IdP 依赖的证书不是由其中某个受信任的 CA 签名，则仅在此时我们会使用 IdP 配置中设置的指纹来保护通信。如果我们无法检索 TLS 证书或需要 TLS v1.3，则 Amazon 将回退到指纹验证。

1. 通过 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择 **Identity providers**（身份提供程序）。然后选择要更新的 IAM 身份提供程序的名称。

1. 选择**端点验证**选项卡，然后在**指纹**部分中选择**管理**。要输入新的指纹值，请选择 **Add thumbprint**（添加指纹）。要删除指纹，请选择您要删除的指纹旁边的 **Remove**（删除）。
**注意**  
IAM OIDC 身份提供程序必须具有至少 1 个、最多 5 个指纹。

    完成后，选择 **Save changes**（保存更改）。

**为 IAM OIDC 身份提供程序添加受众（控制台）**

1. 在导航窗格中，选择 **Identity providers**（身份提供程序），然后选择要更新的 IAM 身份提供程序的名称。

1. 在 **Audiences**（受众）部分，选择 **Actions**（操作），然后选择 **Add audience**（添加受众）。

1. 键入您向 IdP 注册的、在 [Step 1](#idpoidcstep1) 中接收的并且将向 Amazon 发出请求的应用程序的客户端 ID。然后选择 **Add audiences**（添加受众）。
**注意**  
IAM OIDC 身份提供程序必须具有至少 1 个且最多 100 个受众。

**为 IAM OIDC 身份提供程序删除受众（控制台）**

1. 在导航窗格中，选择 **Identity providers**（身份提供程序），然后选择要更新的 IAM 身份提供程序的名称。

1. 在 **Audiences**（受众）部分，选择要删除的受众旁边的单选按钮，然后选择 **Actions**（操作）。

1.  选择 **Remove audience**（删除受众）。此时会打开一个新窗口。

1. 如果删除受众，受众的联合身份将无法代入与受众关联的角色。在窗口中，阅读警告并通过在字段中键入 `remove` 一词以确认删除受众。

1. 选择 **Remove**（删除）以删除受众。

**删除 IAM OIDC 身份提供程序（控制台）**

1. 通过 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择 **Identity providers**（身份提供程序）。

1. 选中要删除的 IAM 身份提供者旁边的复选框。此时会打开一个新窗口。

1. 通过在字段中键入 `delete` 一词以确认您要删除此提供商。然后选择 **Delete**(删除)。

## 创建和管理 IAM OIDC 身份提供程序 (Amazon CLI)
<a name="manage-oidc-provider-cli"></a>

可以使用以下 Amazon CLI 命令来创建和管理 IAM OIDC 身份提供程序。

**创建 IAM OIDC 身份提供程序 (Amazon CLI)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html](https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html)

1. 要创建新的 IAM OIDC 身份提供程序，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/create-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/create-open-id-connect-provider.html)

**更新现有 IAM OIDC 身份提供程序的服务器证书指纹列表 (Amazon CLI)**
+ 要更新 IAM OIDC 身份提供程序的服务器证书指纹列表，请运行以下命令：
  + [https://docs.amazonaws.cn/cli/latest/reference/iam/update-open-id-connect-provider-thumbprint.html](https://docs.amazonaws.cn/cli/latest/reference/iam/update-open-id-connect-provider-thumbprint.html)

**要标记现有 IAM OIDC 身份提供程序 (Amazon CLI)**
+ 要标记现有 IAM OIDC 身份提供程序，请运行以下命令：
  + [https://docs.amazonaws.cn/cli/latest/reference/iam/tag-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/tag-open-id-connect-provider.html)

**要列出现有 IAM OIDC 身份提供程序 (Amazon CLI) 的标签**
+ 要列出现有 IAM OIDC 身份提供程序的标签，请运行以下命令：
  + [https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-provider-tags.html](https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-provider-tags.html)

**要删除 IAM OIDC 身份提供程序 (Amazon CLI) 的标签**
+ 要删除现有 IAM OIDC 身份提供程序的标签，请运行以下命令：
  + [https://docs.amazonaws.cn/cli/latest/reference/iam/untag-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/untag-open-id-connect-provider.html)

**在现有 IAM OIDC 提供商中添加或删除客户端 ID (Amazon CLI)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html](https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html)

1. （可选）要获取有关 IAM OIDC 身份提供程序的详细信息，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/get-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/get-open-id-connect-provider.html)

1. 要向现有 IAM OIDC 身份提供程序中添加新的客户端 ID，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/add-client-id-to-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/add-client-id-to-open-id-connect-provider.html)

1. 要从现有 IAM OIDC 身份提供程序中删除客户端，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/remove-client-id-from-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/remove-client-id-from-open-id-connect-provider.html)

**删除 IAM OIDC 身份提供程序 (Amazon CLI)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html](https://docs.amazonaws.cn/cli/latest/reference/iam/list-open-id-connect-providers.html)

1. （可选）要获取有关 IAM OIDC 身份提供程序的详细信息，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/get-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/get-open-id-connect-provider.html)

1. 要删除 IAM OIDC 身份提供程序，请运行以下命令：
   + [https://docs.amazonaws.cn/cli/latest/reference/iam/delete-open-id-connect-provider.html](https://docs.amazonaws.cn/cli/latest/reference/iam/delete-open-id-connect-provider.html)

## 创建和管理 OIDC 身份提供程序 (Amazon API)
<a name="manage-oidc-provider-api"></a>

可以使用以下 IAM API 命令来创建和管理 OIDC 提供商。

**创建 IAM OIDC 身份提供程序 (Amazon API)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html)

1. 要创建新的 IAM OIDC 身份提供程序，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html)

**更新现有 IAM OIDC 身份提供程序的服务器证书指纹列表 (Amazon API)**
+ 要更新 IAM OIDC 身份提供程序的服务器证书指纹列表，请调用以下操作：
  + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_UpdateOpenIDConnectProviderThumbprint.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_UpdateOpenIDConnectProviderThumbprint.html)

**要标记现有 IAM OIDC 身份提供程序 (Amazon API)**
+ 要标记现有 IAM OIDC 身份提供程序，请调用以下操作：
  + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_TagOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_TagOpenIDConnectProvider.html)

**要列出现有 IAM OIDC 身份提供程序 (Amazon API) 的标签**
+ 要列出现有 IAM OIDC 身份提供程序的标签，请调用以下操作：
  + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviderTags.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviderTags.html)

**要删除现有 IAM OIDC 身份提供程序 (Amazon API) 的标签**
+ 要删除现有 IAM OIDC 身份提供程序的标签，请调用以下操作：
  + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_UntagOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_UntagOpenIDConnectProvider.html)

**在现有 IAM OIDC 提供商中添加或删除客户端 ID (Amazon API)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html)

1. （可选）要获取有关 IAM OIDC 身份提供程序的详细信息，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html)

1. 要向现有 IAM OIDC 身份提供程序中添加新的客户端 ID，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_AddClientIDToOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_AddClientIDToOpenIDConnectProvider.html)

1. 要从现有 IAM OIDC 身份提供程序中删除客户端 ID，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_RemoveClientIDFromOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_RemoveClientIDFromOpenIDConnectProvider.html)

**删除 IAM OIDC 身份提供程序 (Amazon API)**

1. （可选）要获取您 Amazon 账户中所有 IAM OIDC 身份提供程序的列表，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html)

1. （可选）要获取有关 IAM OIDC 身份提供程序的详细信息，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html)

1. 要删除 IAM OIDC 身份提供程序，请调用以下操作：
   + [https://docs.amazonaws.cn/IAM/latest/APIReference/API_DeleteOpenIDConnectProvider.html](https://docs.amazonaws.cn/IAM/latest/APIReference/API_DeleteOpenIDConnectProvider.html)

# 获取 OpenID Connect 身份提供者的指纹
<a name="id_roles_providers_create_oidc_verify-thumbprint"></a>

在 IAM 中[创建 OpenID Connect（OIDC）身份提供商](id_roles_providers_create_oidc.md)时，IAM 需要对外部身份提供者（IdP）使用的证书进行签名的顶级中间证书颁发机构（CA）的指纹。该指纹是用于为 OIDC 兼容 IdP 颁发证书的 CA 证书的签名。在创建 IAM OIDC 身份提供程序时，您信任该 IdP 验证的身份有权访问您的 Amazon Web Services 账户。通过使用 CA 的证书指纹，您信任该 CA 颁发的任何证书，并且其 DNS 名称与注册的名称相同。这样，在续订 IdP 的签名证书时，无需在每个账户中更新信任关系。

**重要**  
在大多数情况下，联合身份验证服务器使用两个不同的证书：  
第一个证书将在 Amazon 与您的 IdP 之间建立 HTTPS 连接。这应由已知公有根 CA（如 Amazon Certificate Manager）发布。这使客户端能够检查证书的可靠性和状态。
第二个证书将用于加密令牌，且应由私有或公有*根* CA 签署。

您可以使用 [Amazon Command Line Interface、Tools for Windows PowerShell 或 IAM API](id_roles_providers_create_oidc.md#manage-oidc-provider-cli) 创建一个 IAM OIDC 身份提供程序。使用这些方法时，您可以选择手动提供指纹。如果您选择不包含指纹，IAM 将检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。如果您选择包含指纹，则必须手动获取指纹并将它提供给 Amazon。

当您使用 [IAM 控制台](id_roles_providers_create_oidc.md)创建 OIDC 身份提供者时，IAM 会尝试为您检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。

此外，建议您手动获取 OIDC IdP 的指纹，并验证 IAM 是否检索了正确的指纹。有关获取证书指纹的更多信息，请参阅以下部分：

**注意**  
Amazon 使用我们的受信任根证书颁发机构（CA）库来保护与 OIDC 身份提供者（IdP）之间的通信，从而验证JSON Web 密钥集（JWKS）端点的 TLS 证书。如果您的 OIDC IdP 依赖的证书不是由其中某个受信任的 CA 签名，则仅在此时我们会使用 IdP 配置中设置的指纹来保护通信。如果我们无法检索 TLS 证书或需要 TLS v1.3，则 Amazon 将回退到指纹验证。

## 获取证书指纹
<a name="oidc-obtain-thumbprint"></a>

您可以使用 Web 浏览器和 OpenSSL 命令行工具获取 OIDC 提供者的证书指纹。但是，您无需手动获取证书指纹即可创建 IAM OIDC 身份提供者。您可以使用以下过程获取 OIDC 提供者。

**获取 OIDC IdP 的指纹**

1. 您需要先获取 OpenSSL 命令行工具，然后才能获取 OIDC IdP 的指纹。您可使用此工具下载 OIDC IdP 的证书链并生成证书链中最终证书的指纹。如果需要安装和配置 OpenSSL，请遵循[安装 OpenSSL](#oidc-install-openssl) 和[配置 OpenSSL](#oidc-configure-openssl) 中的说明。

1. 从 OIDC IdP 的 URL 开始（例如，`https://server.example.com`），然后添加 `/.well-known/openid-configuration` 以构成该 IdP 的配置文档的 URL，如下所示：

   **https://*server.example.com*/.well-known/openid-configuration**

   在 Web 浏览器中打开此 URL，将 *server.example.com* 替换为 IdP 的服务器名称。

1. <a name="thumbstep2"></a>在显示的文档中，使用 Web 浏览器 **Find**（查找）功能来定位文本 `"jwks_uri"`。`"jwks_uri"` 文本后面会跟有一个冒号 (:)，然后是一个 URL。复制 URL 的完全限定域名。不包括 `https://` 或在顶级域后的任何路径。

   ```
   {
    "issuer": "https://accounts.example.com",
    "authorization_endpoint": "https://accounts.example.com/o/oauth2/v2/auth",
    "device_authorization_endpoint": "https://oauth2.exampleapis.com/device/code",
    "token_endpoint": "https://oauth2.exampleapis.com/token",
    "userinfo_endpoint": "https://openidconnect.exampleapis.com/v1/userinfo",
    "revocation_endpoint": "https://oauth2.exampleapis.com/revoke",
    "jwks_uri": "https://www.exampleapis.com/oauth2/v3/certs",
   ...
   ```

1. 使用 OpenSSL 命令行工具可运行以下命令。将 *keys.example.com* 替换为您在[Step 3](#thumbstep2) 中获取的域名。

   ```
   openssl s_client -servername keys.example.com -showcerts -connect keys.example.com:443
   ```

1. 在命令窗口中向上滚动，直至看到类似于以下示例的证书。如果您查看多个证书，请找到显示的最后一个证书（在命令输出底部）。这包含证书颁发机构链中的顶级中间的 CA 的证书。

   ```
   -----BEGIN CERTIFICATE-----
    MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
    VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
    b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
    BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
    MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
    VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
    b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
    YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
    21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
    rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
    Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
    nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
    FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
    NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=
    -----END CERTIFICATE-----
   ```

   复制证书（包括 `-----BEGIN CERTIFICATE-----` 和 `-----END CERTIFICATE-----` 行）并将其粘贴到文本文件中。然后使用文件名 **certificate.crt** 保存该文件。
**注意**  
OIDC 身份提供者的证书链必须以域或颁发者 URL 开始，包含任何中间证书（如果有），然后以根证书结尾。如果证书链顺序不同或者包含重复证书或其他证书，您将收到签名不匹配错误，并且 STS 无法验证 JSON Web 令牌（JWT）。更正服务器返回的链中证书的顺序以解决错误。有关证书链标准的更多信息，请参阅 RFC Series 网站上的 [RFC 5246 中的 certificate\$1list](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.2)。

1. 使用 OpenSSL 命令行工具可运行以下命令。

   ```
   openssl x509 -in certificate.crt -fingerprint -sha1 -noout
   ```

   您的命令窗口将显示类似于以下示例的证书指纹：

   ```
   SHA1 Fingerprint=99:0F:41:93:97:2F:2B:EC:F1:2D:DE:DA:52:37:F9:C9:52:F2:0D:9E
   ```

   请从此字符串中去掉冒号 (:) 字符以生成最终指纹，如：

   ```
   990F4193972F2BECF12DDEDA5237F9C952F20D9E
   ```

1. 如果要使用 Amazon CLI、Tools for Windows PowerShell 或 IAM API 创建 IAM OIDC 身份提供者，则提供指纹是可选的。如果您选择在创建过程中不包含指纹，IAM 将检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。创建 IAM OIDC 身份提供者后，您可以将此指纹与 IAM 检索到的指纹进行比较。

   如果您在 IAM 控制台中创建 IAM OIDC 身份提供者，则控制台会尝试为您检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。您可以将此指纹与 IAM 检索到的指纹进行比较。创建 IAM OIDC 身份提供者后，您可以在 OIDC 提供者**摘要**控制台页面的**端点验证**选项卡中查看IAM OIDC 身份提供者的指纹。
**重要**  
如果您获得的指纹与您在 IAM OIDC 身份提供者指纹详细信息中看到的指纹不匹配，则不应使用 OIDC 提供者。相反，您应该删除已创建的 OIDC 提供者，然后在一段时间后再次尝试创建 OIDC 提供者。在使用提供者之前，请验证指纹是否匹配。如果第二次尝试后指纹仍然不匹配，请使用 [IAM 论坛](https://forums.aws.csdn.net/forum.jspa?forumID=76)联系 Amazon。

## 安装 OpenSSL
<a name="oidc-install-openssl"></a>

如果您没有安装 OpenSSL，请按照本部分中的说明执行操作。

**在 Linux 或 Unix 系统上安装 OpenSSL**

1. 转到 [OpenSSL：源、Tarball](https://openssl.org/source/) (https://openssl.org/source/)。

1. 下载最新源并构建包。

**如要在 Windows 系统上安装 OpenSSL**

1. 转到 [OpenSSL：二进制分布](https://wiki.openssl.org/index.php/Binaries) (https://wiki.openssl.org/index.php/Binaries)，了解您可以从中安装 Windows 版本的站点列表。

1. 按照所选站点上的说明开始安装。

1. 如果系统要求您安装 **Microsoft Visual C\$1\$1 2008 Redistributables** 并且该程序尚未安装在您的系统上，请选择适合您环境的下载链接。按照 **Microsoft Visual C\$1\$1 2008 Redistributable 安装向导**中的说明操作。
**注意**  
如果您不确定您的系统上是否已安装 Microsoft Visual C\$1\$1 2008 Redistributables，则可以尝试先安装 OpenSSL。如果尚未安装 Microsoft Visual C\$1\$1 2008 Redistributables，OpenSSL 安装程序将显示提示。请确保安装与您安装的 OpenSSL 版本匹配的体系架构（32 位或 64 位）。

1. 在安装 Microsoft Visual C\$1\$1 2008 Redistributables 后，为您的环境选择适当的 OpenSSL 二进制版本，然后在本地保存该文件。启动 **OpenSSL 设置向导**。

1. 按照 **OpenSSL 设置向导**中的说明进行操作。

## 配置 OpenSSL
<a name="oidc-configure-openssl"></a>

在使用 OpenSSL 命令之前，您必须配置操作系统，使其具有有关 OpenSSL 安装位置的信息。

**要在 Linux 或 Unix 上配置 OpenSSL**

1. 在命令行中，将 `OpenSSL_HOME` 变量设置为 OpenSSL 安装的位置：

   ```
   $ export OpenSSL_HOME=path_to_your_OpenSSL_installation
   ```

1. 设置包含 OpenSSL 安装的路径：

   ```
   $ export PATH=$PATH:$OpenSSL_HOME/bin
   ```
**注意**  
通过使用 `export` 命令行对环境变量所做的任何更改只对当前的会话有效。通过在 shell 配置文件中设置环境变量，可对环境变量进行持续更改。有关更多信息，请参阅您的操作系统文档。

**要在 Windows 上配置 OpenSSL**

1. 打开 **Command Prompt**（命令提示符窗口）。

1. 将 `OpenSSL_HOME` 变量设置为 OpenSSL 安装的位置：

   ```
   C:\> set OpenSSL_HOME=path_to_your_OpenSSL_installation
   ```

1. 将 `OpenSSL_CONF` 变量设置为 OpenSSL 安装中配置文件的位置：

   ```
   C:\> set OpenSSL_CONF=path_to_your_OpenSSL_installation\bin\openssl.cfg
   ```

1. 设置包含 OpenSSL 安装的路径：

   ```
   C:\> set Path=%Path%;%OpenSSL_HOME%\bin
   ```
**注意**  
通过 **Command Prompt**（命令提示符）对 Windows 环境变量所做的任何更改只对当前的命令行会话有效。您可以通过将环境变量设置为系统属性来对其进行持久性更改。确切的流程取决于您使用的 Windows 版本。（例如，在 Windows 7 中，打开 **Control Panel**（控制面板）、**System and Security**（系统和安全性）、**System**（系统）。然后选择 **Advanced system settings**（高级系统设置）、**Advanced**（高级）选项卡，**Environment Variables**（环境变量）。） 有关更多信息，请参阅 Windows 文档。

# 适用于共享 OIDC 提供者的身份提供者控制
<a name="id_roles_providers_oidc_secure-by-default"></a>

对于公认的共享 OpenID Connect（OIDC）身份提供者（IdP），IAM 要求对角色信任策略中的特定声明进行明确评估。这些必需的声明名为*身份提供者控制*，由 IAM 在角色创建和信任策略更新期间进行评估。如果角色信任策略未对共享 OIDC IdP 所需的控制进行评估，则角色创建或更新将失败。这样可以确保，只有预期组织的授权身份才能代入角色和访问 Amazon 资源。这种安全控制在多个 Amazon 客户共享 OIDC 提供者时至关重要。



IAM 不会针对现有 OIDC 角色信任策略对身份提供者控制进行评估。对于针对现有 OIDC 角色的角色信任策略所进行的任何修改，IAM 将要求在角色信任策略中包含身份提供者控制。

## OIDC 提供者类型
<a name="id_roles_providers_oidc_idp_types"></a>

IAM 将 OIDC 身份提供者分为两种不同的类型：**私有**和**共享**。私有 OIDC IdP 可以由单个组织拥有和管理，也可以是 SaaS 提供商的租户，其 OIDC 颁发者 URL 是该组织特有的唯一标识符。相比之下，多个组织使用共享的 OIDC IdP，其中使用该共享身份提供者的所有组织的 OIDC 颁发者 URL 可能相同。

下表概述了私有和共享 OIDC 提供者之间的主要区别：


| 特征 | 私有 OIDC 提供者 | 共有 OIDC 提供者 | 
| --- | --- | --- | 
|  Issuer  |  归组织独有  |  在多个组织之间共享  | 
|  租赁信息  |  通过唯一的颁发者进行沟通  |  通过 JWT 中的声明进行沟通  | 
|  信任策略要求  |  无需进行特定的声明评估  |  需要对特定声明进行评估  | 

## 具有身份提供者控制的共享 OIDC 身份提供者
<a name="id_roles_providers_oidc_idp_shared_oidc_secure_support"></a>

当您在 IAM 中创建或修改 OIDC 提供者时，系统会自动识别和评估公认的共享 OIDC 提供者所需的声明。如果未在角色信任策略中配置身份提供者控制，则角色创建或更新将失败，并出现 MalformedPolicyDocument 错误。

下表列出了在角色信任策略中需要身份提供者控制的共享 OIDC 提供者以及可帮助您配置身份提供者控制的其他信息。


| OIDC IdP | OIDC URL | 租赁声明 | 所需声明 | 
| --- | --- | --- | --- | 
| [Amazon Cognito](https://docs.amazonaws.cn/cognito/latest/developerguide/iam-roles.html) |  `cognito-identity.cn-north-1.amazonaws.com.cn`  | aud |  `cognito-identity.cn-north-1.amazonaws.com.cn:aud`  | 
| [Azure Sentinel](https://learn.microsoft.com/en-us/azure/defender-for-cloud/sentinel-connected-aws) |  https://sts.windows.net/33e01921-4d64-4f8c-a055-5bdaffd5e33d  |  sts:RoleSessionName  |  sts:RoleSessionName  | 
| [Buildkite](https://buildkite.com/docs/pipelines/security/oidc/aws) |  https://agent.buildkite.com  |  sub  |  agent.buildkite.com:sub  | 
| [Codefresh SaaS](https://codefresh.io/docs/docs/integrations/oidc-pipelines/) | https://oidc.codefresh.io | sub |  oidc.codefresh.io:sub  | 
| [DVC Studio](https://dvc.org/doc/studio/user-guide/openid-connect) | https://studio.datachain.ai/api | sub |  studio.datachain.ai/api:sub  | 
| [GitHub 操作](https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services) | https://token.actions.githubusercontent.com | sub |  token.actions.githubusercontent.com:sub  | 
| [GitHub 审核日志流式传输](https://docs.github.com/en/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise) | https://oidc-configuration.audit-log.githubusercontent.com | sub |  oidc-configuration.audit-log.githubusercontent.com:sub  | 
| [GitHub vstoken](https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services) | https://vstoken.actions.githubusercontent.com | sub |  vstoken.actions.githubusercontent.com:sub  | 
| [GitLab](https://docs.gitlab.com/ci/cloud_services/aws/) | https://gitlab.com | sub |  gitlab.com:sub  | 
| [IBM Turbonomic SaaS\$1](https://www.ibm.com/docs/en/tarm/8.16.x?topic=turbonomic-setting-up-aws-iam-role-saas-deployments) |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers_oidc_secure-by-default.html)  | sub |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers_oidc_secure-by-default.html)  | 
| [Pulumi Cloud](https://www.pulumi.com/docs/pulumi-cloud/deployments/oidc/aws/) | https://api.pulumi.com/oidc | aud |  api.pulumi.com/oidc:aud  | 
| [sandboxes.cloud](https://docs.sandboxes.cloud/docs/cloud-resources-setup) | https://sandboxes.cloud | aud |  sandboxes.cloud:aud  | 
| [Scalr](https://docs.scalr.io/docs/aws) | https://scalr.io | sub |  scalr.io:sub  | 
| [Shisho Cloud](https://shisho.dev/docs/g/getting-started/integrate-apps/aws/) | https://tokens.cloud.shisho.dev | sub |  tokens.cloud.shisho.dev:sub  | 
| [Terraform Cloud](https://developer.hashicorp.com/terraform/cloud-docs/workspaces/dynamic-provider-credentials/aws-configuration) | https://app.terraform.io | sub |  app.terraform.io:sub  | 
| [Upbound](https://docs.upbound.io/providers/provider-aws/authentication/) | https://proidc.upbound.io | sub |  proidc.upbound.io:sub  | 
| [Vercel 全局端点](https://vercel.com/docs/oidc/reference) | https://oidc.vercel.com | aud |  oidc.vercel.com:aud  | 

\$1 IBM Turbonomic 定期使用该平台的新版本更新其 OIDC 颁发者 URL。我们将根据需要在范围内增加其他 Turbonomic OIDC 颁发者作为共享提供商。

对于 IAM 确定为共享的任何新的 OIDC IdP，将以类似的方式记录和执行角色信任策略所需的身份提供者控制。

## 其他资源
<a name="concept_additional_resources"></a>

其他资源
+ 有关如何为 OIDC 联合身份验证创建 IAM 角色的更多信息，请参阅 [创建用于 OpenID Connect 联合身份验证（控制台）的角色](id_roles_create_for-idp_oidc.md)。
+ 有关可用于声明的 IAM 条件键的列表，请参阅 [Amazon OIDC 联合身份验证的可用键](reference_policies_iam-condition-keys.md#condition-keys-wif)。