

# API Gateway のバックエンド認証用 SSL 証明書の生成と設定
<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)
+ [SSL 証明書を使用するように API を設定する](#configure-api)
+ [クライアント証明書の設定を確認するテスト呼び出し](#test-invoke)
+ [クライアント証明書を検証するようにバックエンド HTTPS サーバーを設定する](#certificate-validation)
+ [失効するクライアント証明書の更新](#certificate-rotation)
+ [API Gateway での HTTP および HTTP プロキシ統合のための API Gateway 対応の証明機関](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 API または WebSocket API を選択します。

1. メインナビゲーションペインで、**[クライアント証明書]** を選択します。

1. **[クライアント証明書]** ペインから、**[証明書の生成]** を選択します。

1.  (オプション) **[説明]** に説明を入力します。

1. **[証明書を生成]** を選択して証明書を生成します。API Gateway は新しい証明書を生成し、PEM エンコードされた公開鍵とともに新しい証明書 GUID を返します。

これで API で証明書を使用するように設定する準備が整いました。

## SSL 証明書を使用するように API を設定する
<a name="configure-api"></a>

これらの手順は、「[API Gateway コンソールを使用してクライアント証明書を生成する](#generate-client-certificate)」をすでに完了していることを前提としています。

1.  API Gateway コンソールで、クライアント証明書を使用する REST API または WebSocket API を作成するか開きます。API がステージにデプロイされていることを確認します。

1. メインナビゲーションペインで、**[ステージ]** を選択します。

1. **[ステージの詳細]** セクションで、**[編集]** を選択します。

1. **[クライアント証明書]** で、証明書を選択します。

1. **[Save changes]** (変更の保存) をクリックします。

API に対して証明書が選択され保存されると、API Gateway は API での HTTP 統合へのすべての呼び出しにこの証明書を使用します。

## クライアント証明書の設定を確認するテスト呼び出し
<a name="test-invoke"></a>

1. REST API メソッドを選択します。**[テスト]** タブを選択します。**[テスト]** タブを表示するには、右矢印ボタンを選択する必要がある場合があります。

1. **[クライアント証明書]** で、証明書を選択します。

1. **[テスト]** を選択します。

 API Gateway は、API を認証するために、選択された SSL 証明書を HTTP バックエンドに提示します。

## クライアント証明書を検証するようにバックエンド 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 での HTTP および HTTP プロキシ統合のための API Gateway 対応の証明機関](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 で [**ステージ**] を選択し、ステージを選択します。

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 Gateway REST API の [stage:update](https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateStage.html) を呼び出し、新しいクライアント証明書 ID (`ndiqef`) 使用して新しいクライアント証明書を使用するように 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.  古い証明書の clientCertificateId (`a1b2c3`) を指定して API Gateway REST API の [clientcertificate:delete](https://docs.aws.amazon.com/apigateway/latest/api/API_DeleteClientCertificate.html) を呼び出し、古い証明書を 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
   ```