Amazon API Gateway
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用客户端 SSL 证书执行后端身份验证

您可以使用 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. 在主导航窗格中,选择 Client Certificates (客户端证书)

  2. Client Certificates (客户端证书) 窗格中,选择 Generate Client Certificate (生成客户端证书)

  3. (可选)对于编辑,选择添加描述性名称生成的证书,然后选择保存以保存描述。API Gateway 将生成一个新证书并返回新证书 GUID 以及 PEM 编码公有密钥。

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

配置 API 以使用 SSL 证书

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

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

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

  3. Stage Editor (阶段编辑器) 面板中,在 Client Certificate (客户端证书) 部分下方选择证书。

  4. 要保存设置,请选择 Save Changes (保存更改)

    如果已在 API Gateway 控制台中部署了 API,则需要重新进行部署,以使更改生效。

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

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

  1. 选择 API 方法。在 Client (客户端) 中,选择 Test (测试)

  2. Client Certificate (客户端证书) 中,选择 Test (测试) 以调用方法请求。

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 支持的 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-idget-client-certificate 的 AWS CLI 命令,并检查返回的 expirationDate 属性,来查看证书的到期日期。

要轮换客户端证书,请遵循以下步骤:

  1. 调用 API Gateway REST API 的 clientcertificate:generategenerate-client-certificate 的 AWS CLI 命令生成新的客户端证书。在本教程中,我们将假设新的客户端证书 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. 在主导航窗格中,选择 Client Certificates (客户端证书)

  2. Client Certificates (客户端证书) 窗格中,选择 Generate Client Certificate (生成客户端证书)

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

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

  5. Stage Editor (阶段编辑器) 面板中,在 Client Certificate (客户端证书) 部分下方选择新证书。

  6. 要保存设置,请选择 Save Changes (保存更改)

    您将需要重新部署 API 才能使更改生效。