

# 生成和配置 SSL 证书以用于 API Gateway 中的后端身份验证
<a name="getting-started-client-side-ssl-authentication"></a>

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

**注意**  
 某些后端服务器可能不像 API Gateway 那样支持 SSL 客户端身份验证，并且可能返回 SSL 证书错误。有关不兼容后端服务器的列表，请参阅 [Amazon API Gateway 重要说明](api-gateway-known-issues.md)。

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

**Topics**
+ [使用 API Gateway 控制台生成客户端证书](#generate-client-certificate)
+ [配置 API 以使用 SSL 证书](#configure-api)
+ [测试调用，以验证客户端证书配置](#test-invoke)
+ [配置后端 HTTPS 服务器以验证客户端证书](#certificate-validation)
+ [轮换即将过期的客户端证书](#certificate-rotation)
+ [API Gateway 中的 API Gateway 支持的 HTTP 和 HTTP 代理集成证书的颁发机构](api-gateway-supported-certificate-authorities-for-http-endpoints.md)

## 使用 API Gateway 控制台生成客户端证书
<a name="generate-client-certificate"></a>

1. 通过以下网址打开 API Gateway 控制台：[https://console.aws.amazon.com/apigateway/](https://console.aws.amazon.com/apigateway/)。

1. 选择 REST 或 WebSocket API。

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

1. 从**客户端证书**页面中，选择**生成证书**。

1.  （可选）对于**描述**，输入描述。

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

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

## 配置 API 以使用 SSL 证书
<a name="configure-api"></a>

这些说明假设您已完成[使用 API Gateway 控制台生成客户端证书](#generate-client-certificate)。

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

1. 在主导航窗格中，选择**阶段**。

1. 在**阶段详细信息**部分中，选择**编辑**。

1. 对于**客户端证书**，选择一个证书。

1. 选择**保存更改**。

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

## 测试调用，以验证客户端证书配置
<a name="test-invoke"></a>

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

1. 对于**客户端证书**，选择一个证书。

1. 选择**测试**。

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

## 配置后端 HTTPS 服务器以验证客户端证书
<a name="certificate-validation"></a>

这些说明假设您已完成[使用 API Gateway 控制台生成客户端证书](#generate-client-certificate)，并已下载客户端证书的副本。您可以通过调用 API Gateway REST API 的 [https://docs.aws.amazon.com/apigateway/latest/api/API_GetClientCertificate.html](https://docs.aws.amazon.com/apigateway/latest/api/API_GetClientCertificate.html) 或 AWS CLI 的 [https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-client-certificate.html](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-client-certificate.html) 来下载客户端证书。

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

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

支持的证书颁发机构包含 [Let's Encrypt (进行加密)](https://letsencrypt.org/) 或 [API Gateway 中的 API Gateway 支持的 HTTP 和 HTTP 代理集成证书的颁发机构](api-gateway-supported-certificate-authorities-for-http-endpoints.md) 之一。

例如，假设客户端证书文件为 `apig-cert.pem`，服务器私有密钥和证书文件分别为 `server-key.pem` 和 `server-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](http://expressjs.com/) 应用程序，您可以使用 [client-certificate-auth](https://www.npmjs.com/package/client-certificate-auth) 模块，利用 PEM 编码证书对客户端请求进行身份验证。

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

## 轮换即将过期的客户端证书
<a name="certificate-rotation"></a>

API Gateway 生成的客户端证书有效期为 365 天。您必须在 API 阶段的客户端证书过期之前轮换证书，以避免该 API 停止工作。

### 使用 AWS 管理控制台轮换即将过期的客户端证书
<a name="certification-rotation-console"></a>

以下过程说明了如何在控制台中为之前部署的 API 轮换客户端证书。

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

1. 在**客户端证书**窗格中，选择**生成证书**。

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

1. 在选定 API 下选择 **Stages (阶段)**，然后选择一个阶段。

1. 在**阶段详细信息**部分中，选择**编辑**。

1. 对于**客户端证书**，请选择新证书。

1. 要保存设置，请选择**保存更改**。

### 使用 AWS CLI 轮换即将过期的客户端证书
<a name="certificate-rotation-cli"></a>

 您可以通过调用 API Gateway REST API 的 [clientCertificate:by-id](https://docs.aws.amazon.com/apigateway/latest/api/API_GetClientCertificate.html)，或 AWS CLI 命令 [get-client-certificate](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-client-certificate.html) 并检查返回的 [expirationDate](https://docs.aws.amazon.com/apigateway/latest/api/API_ClientCertificate.html#expirationDate) 属性，来查看证书的到期日期。

要轮换客户端证书，请执行以下操作：

1. 调用 API Gateway REST API 的 [clientcertificate:generate](https://docs.aws.amazon.com/apigateway/latest/api/API_GenerateClientCertificate.html) 或 AWS CLI 命令 [generate-client-certificate](https://docs.aws.amazon.com/cli/latest/reference/apigateway/generate-client-certificate.html) 生成新的客户端证书。在本教程中，我们将假设新的客户端证书 ID 是 `ndiqef`。

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

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

1.  用新的客户端证书 ID (`ndiqef`) 调用 API Gateway REST API 的 [stage:update](https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateStage.html)，使用新客户端证书更新 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"
       }
     ]
   }
   ```

   也可以使用 [update-stage](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-stage.html) 命令。

   如果您使用的是 WebSocket API，请使用 `apigatewayv2` [update-stage](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/update-stage.html) 命令。

1.  更新后端服务器，以删除旧证书。

1.  通过调用 API Gateway REST API 的 [clientcertificate:delete](https://docs.aws.amazon.com/apigateway/latest/api/API_DeleteClientCertificate.html)，同时指定旧证书的 clientCertificateId (`a1b2c3`)，从 API Gateway 删除旧证书：

   ```
   DELETE /clientcertificates/a1b2c3 
   ```

   还可以调用 [delete-client-certificate](https://docs.aws.amazon.com/cli/latest/reference/apigateway/delete-client-certificate.html) 命令：

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