

# 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. [https://console.aws.amazon.com/apigateway/](https://console.aws.amazon.com/apigateway/)에서 Amazon API Gateway 콘솔을 엽니다.

1. REST 또는 WebSocket API를 선택합니다.

1. 기본 탐색 창에서 **클라이언트 인증서**를 선택합니다.

1. **클라이언트 인증서** 페이지에서 **인증서 생성**을 선택합니다.

1.  (선택 사항) **설명**에 설명을 입력합니다.

1. **인증서 생성**을 선택하여 인증서를 생성합니다. API Gateway는 새로운 인증서를 생성하고 새 인증서 GUID를 PEM 인코딩된 퍼블릭 키와 함께 반환합니다.

이제 인증서를 사용하도록 API를 구성할 준비가 되었습니다.

## SSL 인증서를 사용하도록 API 구성
<a name="configure-api"></a>

이 지침에서는 [API Gateway 콘솔을 사용하여 클라이언트 인증서 생성](#generate-client-certificate)을 이미 완료한 것으로 가정합니다.

1.  클라이언트 인증서를 사용하고자 하는 API를 REST 또는 WebSocket API Gateway 콘솔에서 생성하거나 엽니다. 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)를 호출하여 클라이언트 인증서를 다운로드할 수 있습니다.

 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 Management Console을 사용하여 기존 클라이언트 인증서 교체
<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) 또는 AWS CLI [generate-client-certificate](https://docs.aws.amazon.com/cli/latest/reference/apigateway/generate-client-certificate.html) 명령을 호출하여 새 클라이언트 인증서를 생성합니다. 자습서에서는 새 클라이언트 인증서 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
   ```