生成和配置 SSL 证书以用于 API Gateway 中的后端身份验证 - Amazon API Gateway

生成和配置 SSL 证书以用于 API Gateway 中的后端身份验证

您可以使用 API Gateway 生成一个 SSL 证书,然后在后端使用其公有密钥来验证发往后端系统的 HTTP 请求是否来自 API Gateway。这样,您的 HTTP 后端便可控制且仅接受来自 Amazon API Gateway 的请求(即使该后端可公开访问)。

注意

某些后端服务器可能不像 API Gateway 那样支持 SSL 客户端身份验证,并且可能返回 SSL 证书错误。有关不兼容后端服务器的列表,请参阅 Amazon API Gateway 重要说明

API Gateway 生成的 SSL 证书为自签名证书,只有证书的公有密钥在 API Gateway 控制台中可见或通过 API 显示。

使用 API Gateway 控制台生成客户端证书

  1. 通过以下网址打开 API Gateway 控制台:https://console.aws.amazon.com/apigateway/

  2. 选择一个 REST API。

  3. 在主导航窗格中,选择客户端证书

  4. 客户端证书页面中,选择生成证书

  5. (可选)对于描述,输入描述。

  6. 选择生成证书以生成证书。API Gateway 会生成新证书,并返回新证书的 GUID 以及 PEM 编码的公有密钥。

您现在可以配置 API 以使用该证书。

配置 API 以使用 SSL 证书

这些说明假设您已完成使用 API Gateway 控制台生成客户端证书

  1. 在 API Gateway 控制台中,创建或打开一个您要对其使用客户端证书的 API。确保 API 已部署到某个阶段。

  2. 在主导航窗格中,选择阶段

  3. 阶段详细信息部分中,选择编辑

  4. 对于客户端证书,选择一个证书。

  5. 选择 Save changes(保存更改)

    如果已在 API Gateway 控制台中部署了 API,则需要重新进行部署,以使更改生效。有关更多信息,请参阅 为 API Gateway 中的 REST API 创建部署

为 API 选择证书并保存后,API Gateway 会将该证书用于对您 API 中的 HTTP 集成的所有调用。

测试调用,以验证客户端证书配置

  1. 选择 API 方法。选择测试选项卡。您可能需要选择右箭头按钮以显示测试选项卡。

  2. 对于客户端证书,选择一个证书。

  3. 选择测试

API Gateway 将为 HTTP 后端呈现所选的 SSL 证书以对 API 进行身份验证。

配置后端 HTTPS 服务器以验证客户端证书

这些说明假设您已完成使用 API Gateway 控制台生成客户端证书,并已下载客户端证书的副本。您可以通过调用 API Gateway REST API 的 clientcertificate:by-id 或 AWS CLI 的 get-client-certificate 来下载客户端证书。

在配置用于验证 API Gateway 的客户端 SSL 证书的后端 HTTPS 服务器之前,您必须获得 PEM 编码的私有密钥,以及可信证书颁发机构提供的服务器端证书。

如果服务器域名是 myserver.mydomain.com,则服务器证书的 CNAME 值必须是 myserver.mydomain.com*.mydomain.com

支持的证书颁发机构包含 Let's Encrypt (进行加密)API Gateway 中的 API Gateway 支持的 HTTP 和 HTTP 代理集成证书的颁发机构 之一。

例如,假设客户端证书文件为 apig-cert.pem,服务器私有密钥和证书文件分别为 server-key.pemserver-cert.pem。对于后端中的 Node.js 服务器,您可以配置类似于以下的服务器:

var fs = require('fs'); var https = require('https'); var options = { key: fs.readFileSync('server-key.pem'), cert: fs.readFileSync('server-cert.pem'), ca: fs.readFileSync('apig-cert.pem'), requestCert: true, rejectUnauthorized: true }; https.createServer(options, function (req, res) { res.writeHead(200); res.end("hello world\n"); }).listen(443);

对于 node-express 应用程序,您可以使用 client-certificate-auth 模块,利用 PEM 编码证书对客户端请求进行身份验证。

对于其他 HTTPS 服务器,请参阅服务器文档。

轮换即将过期的客户端证书

API Gateway 生成的客户端证书有效期为 365 天。您必须在 API 阶段的客户端证书过期之前轮换证书,以避免该 API 停止工作。您可以通过调用 API Gateway REST API 的 clientCertificate:by-id,或 AWS CLI 命令 get-client-certificate 并检查返回的 expirationDate 属性,来查看证书的到期日期。

要轮换客户端证书,请执行以下操作:

  1. 调用 API Gateway REST API 的 clientcertificate:generate 或 AWS CLI 命令 generate-client-certificate 生成新的客户端证书。在本教程中,我们将假设新的客户端证书 ID 是 ndiqef

  2. 更新后端服务器,以包括新的客户端证书。目前请不要删除现有客户端证书。

    有些服务器可能需要重启以完成更新。请参考服务器文档,了解在更新期间是否必须重启服务器。

  3. 用新的客户端证书 ID (ndiqef) 调用 API Gateway REST API 的 stage:update,使用新客户端证书更新 API 阶段:

    PATCH /restapis/{restapi-id}/stages/stage1 HTTP/1.1 Content-Type: application/json Host: apigateway.us-east-1.amazonaws.com X-Amz-Date: 20170603T200400Z Authorization: AWS4-HMAC-SHA256 Credential=... { "patchOperations" : [ { "op" : "replace", "path" : "/clientCertificateId", "value" : "ndiqef" } ] }

    或通过调用 CLI 命令 update-stage

  4. 更新后端服务器,以删除旧证书。

  5. 通过调用 API Gateway REST API 的 clientcertificate:delete,同时指定旧证书的 clientCertificateId (a1b2c3),从 API Gateway 删除旧证书:

    DELETE /clientcertificates/a1b2c3

    或通过调用 CLI 命令 delete-client-certificate

    aws apigateway delete-client-certificate --client-certificate-id a1b2c3

要在控制台中为之前部署的 API 轮换客户端证书,请执行以下操作:

  1. 在主导航窗格中,选择客户端证书

  2. 客户端证书窗格中,选择生成证书

  3. 打开您要对其使用客户端证书的 API。

  4. 在选定 API 下选择 Stages (阶段),然后选择一个阶段。

  5. 阶段详细信息部分中,选择编辑

  6. 对于客户端证书,请选择新证书。

  7. 要保存设置,请选择保存更改

    您将需要重新部署 API 才能使更改生效。有关更多信息,请参阅 为 API Gateway 中的 REST API 创建部署