

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 API Gateway 中產生和設定後端驗證的 SSL 憑證
<a name="getting-started-client-side-ssl-authentication"></a>

 您可以使用 API Gateway 產生 SSL 憑證，並在後端系統中使用其公開金鑰確認對後端系統的 HTTP 請求來自 API Gateway。這可讓 HTTP 後端系統僅接受 Amazon API Gateway 所發出的請求並加以控管，即使後端系統可公開存取也一樣。

**注意**  
 有些後端伺服器可能不支援 SSL 用戶端身分驗證，因為 API Gateway 可以確實傳回 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 會顯示所選擇的 SSL 憑證，讓 HTTP 後端系統對 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)。

 在設定後端 HTTPS 伺服器以驗證 API Gateway 的用戶端 SSL 憑證之前，請務必取得 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);
```



針對節點-[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) 或 [get-client-certificate](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-client-certificate.html) 的 AWS CLI 命令，並檢查傳回的 [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) 或 [generate-client-certificate](https://docs.aws.amazon.com/cli/latest/reference/apigateway/generate-client-certificate.html) 的 AWS CLI 命令。在本教學中，我們將假設新的用戶端憑證 ID 為 `ndiqef`。

1.  更新後端伺服器以納入新的用戶端憑證。請先不要移除現有的用戶端憑證。

   有些伺服器可能需要重新啟動以完成更新。請參閱伺服器文件，確認更新期間是否需要重新啟動伺服器。

1.  更新 API 階段以使用新的用戶端憑證，方法是以新的用戶端憑證 ID (`ndiqef`) 呼叫 API Gateway REST API 的 [stage:update](https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateStage.html)，如下所示：

   ```
   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 刪除舊憑證，方法是呼叫 API Gateway REST API 的 [clientcertificate:delete](https://docs.aws.amazon.com/apigateway/latest/api/API_DeleteClientCertificate.html)，並指定舊憑證的 clientCertificateId (`a1b2c3`)，如下所示：

   ```
   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
   ```