

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

# SAML 签名和加密
<a name="cognito-user-pools-SAML-signing-encryption"></a>

SAML 2.0 登录围绕着应用程序的用户作为其身份验证流程中的请求和响应的持有者来进行。您可能需要确保用户不会在传输过程中读取或修改这些 SAML 文档。为此，请将 SAML 签名和加密添加到用户池中的 SAML 身份提供商 (IdPs)。借助 SAML 签名，您的用户池可向 SAML 登录和注销请求添加签名。使用您的用户池公钥，IdP 可以验证它接收的是未经修改的 SAML 请求。然后，当您的 IdP 响应并将 SAML 断言传递给用户的浏览器会话时，IdP 可以加密该响应，这样用户就无法查看自己的属性和权限。

使用 SAML 签名和加密，用户池 SAML 操作期间的所有加密操作都必须使用 user-pool-provided Amazon Cognito 生成的密钥生成签名和密文。目前，无法将用户池配置为使用外部密钥签署请求或接受加密断言。

**注意**  
用户池证书有效期为 10 年。Amazon Cognito 每年都会为用户池生成一次新的签名和加密证书。请求签名证书时，Amazon Cognito 会返回最新的证书，并使用最新的签名证书来签署请求。IdP 可以使用任何未过期的用户池加密证书来加密 SAML 断言。之前的证书在整个有效期内继续有效，并且不同证书之间的公钥不会发生变化。作为一项最佳实践，请每年更新提供者配置中的证书。

**Topics**
+ [接受来自 IdP 的加密 SAML 响应](#cognito-user-pools-SAML-encryption)
+ [签署 SAML 请求](#cognito-user-pools-SAML-signing)

## 接受来自 IdP 的加密 SAML 响应
<a name="cognito-user-pools-SAML-encryption"></a>

当用户登录和注销时，Amazon Cognito 和您的 IdP 可以在 SAML 响应中保持机密性。Amazon Cognito 会向您在用户池中配置的每个外部 SAML 提供者分配一个公有-私有 RSA 密钥对和一个证书。为用户池 SAML 提供者启用响应加密时，必须将证书上传到支持加密 SAML 响应的 IdP。在您的 IdP 开始使用提供的密钥加密所有 SAML 断言之前，您的用户池与 SAML IdP 的连接无法正常工作。

下文概述了加密 SAML 登录的流程。

1. 您的用户开始登录并选择他们的 SAML IdP。

1. 您的用户池 [对端点授权](authorization-endpoint.md) 通过 SAML 登录请求将您的用户重定向到他们的 SAML IdP。您的用户池可以选择在此请求中附上签名，从而让 IdP 可以进行完整性验证。当您想要签署 SAML 请求时，必须将您的 IdP 配置为接受您的用户池使用签名证书中的公钥签署的请求。

1. SAML IdP 让您的用户登录并生成 SAML 响应。IdP 使用公钥对响应进行加密，并将用户重定向到用户池 `/saml2/idpresponse` 端点。IdP 必须按照 SAML 2.0 规范的定义对响应进行加密。有关更多信息，请参阅 [OASIS 安全断言标记语言（SAML）V2.0 的断言和协议](https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf)中的 `Element <EncryptedAssertion>`。

1. 用户池使用私钥解密 SAML 响应中的加密文字并让您的用户登录。

**重要**  
当您为用户池中的 SAML IdP 启用响应加密时，您的 IdP 必须使用该提供者特有的公钥对所有响应进行加密。Amazon Cognito 不接受来自您配置为支持加密的 SAML 外部 IdP 的未加密 SAML 响应。

用户池中的任何外部 SAML IdP 都可以支持响应加密，并且每个 IdP 都会收到自己的密钥对。

------
#### [ AWS 管理控制台 ]

**配置 SAML 响应加密**

1. 创建[用户池](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)、[应用程序客户端](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html)和 SAML IdP。

1. 创建或编辑 SAML 身份提供者时，在**对请求进行签名并加密响应**下，选中名称为**需要此提供商的加密 SAML 断言**的复选框。

1. 从用户池的**社交和外部提供商**菜单中，选择您的 SAML IdP，然后选择**查看加密证书**。

1. 选择**以 .crt 格式下载证书**，然后将下载的文件提供给您的 SAML IdP。将您的 SAML IdP 配置为使用证书中的密钥加密 SAML 响应。

------
#### [ API/CLI ]

**配置 SAML 响应加密**

使用[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html)或 [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html)API 请求的`EncryptedResponses`参数配置响应加密。以下是支持请求签名的 IdP 的示例 `ProviderDetails`。

```
"ProviderDetails": { 
      "MetadataURL" : "https://myidp.example.com/saml/metadata",
      "IDPSignout" : "true",
      "RequestSigningAlgorithm" : "rsa-sha256",
      "EncryptedResponses" : "true",
      "IDPInit" : "true"
}
```

要从您的用户池中获取加密证书，请发出 [DescribeIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeIdentityProvider.html)API 请求并在响应参数`ActiveEncryptionCertificate`中检索的值`ProviderDetails`。保存此证书，并将其作为加密证书提供给您的 IdP，用于接收来自用户池的登录请求。

------

## 签署 SAML 请求
<a name="cognito-user-pools-SAML-signing"></a>

能够向您的 IdP 证明 SAML 2.0 请求的完整性是 Amazon Cognito SP 发起的 SAML 登录的一项安全优势。每个拥有域的用户池都会收到一个用户池 X.509 签名证书。使用此证书中的公钥，用户池将加密签名应用于在用户选择 SAML IdP 时用户池生成的*注销请求*。您可以选择将应用程序客户端配置为签署 SAML *登录请求*。当您签署 SAML 请求时，您的 IdP 会核实请求的 XML 元数据中的签名是否与您提供的用户池证书中的公钥相匹配。

------
#### [ AWS 管理控制台 ]

**配置 SAML 请求签名**

1. 创建[用户池](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)、[应用程序客户端](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-configuring-app-integration.html)和 SAML IdP。

1. 创建或编辑 SAML 身份提供者时，在**对请求进行签名并加密响应**下，选中名称为**对此提供商的 SAML 请求进行签名**的复选框。

1. 从用户池的**社交和外部提供商**菜单中，选择**查看签名证书**。

1. 选择**以 .crt 格式下载证书**，然后将下载的文件提供给您的 SAML IdP。配置 SAML IdP 以验证传入 SAML 请求的签名。

------
#### [ API/CLI ]

**配置 SAML 请求签名**

使用[CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html)或 [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html)API 请求的`RequestSigningAlgorithm`参数配置请求签名。以下是支持请求签名的 IdP 的示例 `ProviderDetails`。

```
"ProviderDetails": { 
      "MetadataURL" : "https://myidp.example.com/saml/metadata",
      "IDPSignout" : "true",
      "RequestSigningAlgorithm" : "rsa-sha256",
      "EncryptedResponses" : "true",
      "IDPInit" : "true"
}
```

------