

Amazon Kendra 从 2026 年 7 月 30 日起，将不再向新客户开放。如果您想使用该服务，请在 7 月 30 日之前注册。有关类似的功能 Amazon Kendra，请浏览 Amazon Bedrock 知识库。[了解更多](https://docs.aws.amazon.com/kendra/latest/dg/kendra-availability-change.html)。

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

# 使用带有公有密钥的 JSON Web 令牌（JWT）
<a name="create-index-access-control-tokens-jwtpublic"></a>

以下示例说明在创建索引时如何使用带有公有密钥的 JSON Web Token（JWT）进行用户访问控制。有关 JWT 的更多信息，请参阅 [jwt.io](http://jwt.io)。

------
#### [ Console ]

1. 选择**创建索引**以开始创建新索引。

1. 在**指定索引详细信息**页面上，为您的索引指定名称和描述。

1. 对于 **IAM 角色**，选择一个角色或选择**创建新角色**，并指定角色名称来创建新角色。该 IAM 角色将带有前缀 “AmazonKendra-”。

1. 将所有其他字段保留为默认值。选择**下一步**。

1. 在**配置用户访问控制**页面上，在**访问控制设置**下，选择**是**以使用令牌进行访问控制。

1. 在**令牌配置**下，选择**带有公有密钥的 JWT** 作为**令牌类型**。

1. 在**用于签名公有密钥的参数**下，选择**密钥类型**。您可以使用现有的 AWS Secrets Manager 密钥或创建一个新密钥。

   要创建新密钥，请选择**新建**，然后按照下列步骤操作：

   1. 在 “**新 AWS Secrets Manager 密钥**” 下，指定**密钥名称**。保存公有密钥时，将添加前缀 `AmazonKendra-`。

   1. 指定**键 ID**。键 ID 是一个提示，指示哪些键用于保护令牌的 JSON Web 签名。

   1. 为令牌选择签名**算法**。这是用于保护 ID 令牌的加密算法。有关 RSA 的更多信息，请参阅 [RSA 密码术](https://tools.ietf.org/html/rfc3447)。

   1. 在**证书属性**下，指定*可选*的**证书链**。证书链由证书列表组成。它以服务器的证书开头，以根证书结尾。

   1. *可选* 指定**指纹**。它是证书的哈希值，可计算出所有证书数据及其签名。

   1. 指定**指数**。这是 RSA 公有密钥的指数值。它以 base64URL UInt 编码的值表示。

   1. 指定**模数**。这是 RSA 公有密钥的指数值。它以 base64URL UInt 编码的值表示。

   1. 选择**保存密钥**以保存新密钥。

1. （*可选*）在**高级配置**下：

   1. 指定要在 ACL 检查中使用的**用户名**。

   1. 指定要在 ACL 检查中使用的一个或多个**组**。

   1. 指定将验证颁发机构的**颁发机构**。

   1. 指定**客户端 ID**。您必须指定与 JWT 中的受众相匹配的正则表达式。

1. 在**配置详细信息**页面中，选择**开发者版本**。

1. 选择**创建**以创建索引。

1. 等待您的索引创建完成。 Amazon Kendra 为您的索引配置硬件。此操作可能需要一些时间。

------
#### [ CLI ]

您可以将 JWT 与 AWS Secrets Manager内部的公有密钥一起使用。你需要 Secrets Manager ARN，而且你的 Amazon Kendra 角色必须有权访问该`GetSecretValue`资源。 Secrets Manager 如果您使用加密 Secrets Manager 资源 AWS KMS，则该角色还必须有权访问解密操作。

要使用 JSON 输入文件创建索引，请先 AWS CLI 使用所需参数创建一个 JSON 文件：

```
{
    "Name": "{{user-context}}",
    "Edition": "{{ENTERPRISE_EDITION}}",
    "RoleArn": "arn:aws:iam::{{account id}}:role:/{{my-role}}",
    "UserTokenConfigurationList": [
        {
            "JwtTokenTypeConfiguration": {
                "KeyLocation": "SECRET_MANAGER",
                "Issuer": "{{optional: specify the issuer url}}",
                "ClaimRegex": "{{optional: regex to validate claims in the token}}",
                "UserNameAttributeField": "{{optional: user}}",
                "GroupAttributeField": "{{optional: group}}",
                "SecretManagerArn": "arn:aws:secretsmanager:{{us-west-2}}:{{account id}}:secret:/{{my-user-context-secret}}
            }
        }
    ],    "UserContextPolicy": "USER_TOKEN"
}
```

您可以覆盖默认的用户和组字段名称。`UserNameAttributeField` 的默认值为“user”。`GroupAttributeField` 的默认值为“groups”。

接下来，使用输入文件调用 `create-index`。例如，如果您的 JSON 文件名为 `create-index-openid.json`，则可以使用以下名称：

```
aws kendra create-index --cli-input-json file://create-index-openid.json
```

密钥必须采用以下格式 Secrets Manager：

```
{
  "keys": [
    {
      "alg": "RS256|RS384|RS512",
      "kty": "RSA", //this can be RSA only for now
      "use": "sig", //this value can be sig only for now
      "n": "{{modulus of standard pem}}",
      "e": "{{exponent of standard pem}}",
      "kid": "{{key_id}}",
      "x5t": "{{certificate thumprint for x.509 cert}}",
      "x5c": [
        "{{certificate chain}}"
      ]
    }
  ]
}
```

有关 JWT 的更多信息，请参阅 [jwt.io](http://jwt.io)。

------
#### [ Python ]

```
response = kendra.create_index(
    Name='{{user-context}}',
    Edition='{{ENTERPRISE_EDITION}}',
    RoleArn='arn:aws:iam::{{account id}}:role:/{{my-role}}',
    UserTokenConfigurationList=[
        {
            "JwtTokenTypeConfiguration": {
                "KeyLocation": "URL",
                "Issuer": "{{optional: specify the issuer url}}",
                "ClaimRegex": "{{optional: regex to validate claims in the token}}",
                "UserNameAttributeField": "{{optional: user}}",
                "GroupAttributeField": "{{optional: group}}",
                "SecretManagerArn": "arn:aws:secretsmanager:{{us-west-2}}:{{account id}}:secret:/{{my-user-context-secret}}"
            }
        }
    ],
    UserContextPolicy='USER_TOKEN'
)
```

------