연습 - 클라이언트 인증서를 사용하여 API에 액세스 보호
인바운드 정책을 사용하여 클라이언트 인증서를 허용하도록 API Management를 구성합니다.
날씨 정보 회사가 이미 다른 시스템에서 인증 인증서를 사용하는 특정 클라이언트에 대해 인증 인증서를 통해 해당 API를 보호하기로 결정했다고 가정해 보겠습니다. 이 설정을 통해 해당 클라이언트는 자신의 기존 인증서를 사용하여 API Management 게이트웨이에 대해 스스로를 인증할 수 있습니다.
이 단원에서는 다음을 수행합니다.
- 자체 서명된 인증서 만들기
- 클라이언트 인증서를 요청하도록 게이트웨이 구성
- 인증서의 지문 가져오기
- 요청에 지정된 인증서가 있는 클라이언트 만 허용하도록 인바운드 정책 편집
- API Management 게이트웨이를 호출하고
curl
을 사용하여 인증서 전달
참고
이 연습에서는 이전 연습에서 설정한 리소스를 사용합니다.
자체 서명된 인증서 생성
먼저 Cloud Shell을 사용하여 클라이언트와 API Management 게이트웨이 간의 인증에 사용할 자체 서명된 인증서를 만듭니다.
프라이빗 키와 인증서를 만들려면 Cloud Shell에서 다음 명령을 실행합니다.
pwd='<Enter a secure password here>' pfxFilePath='selfsigncert.pfx' openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out selfsigncert.crt -subj /CN=localhost
이 예를 쉽게 따라 하도록 위의 명령에는 프라이빗 키를 보호하는 데 사용되는 암호가 포함됩니다. 자신이 사용할 프라이빗 키를 생성할 때마다 보안 암호를 생성하고 그에 대한 액세스를 적절히 제어해야 합니다.
이제 다음 명령을 실행하여 인증서를
curl
도구에서 사용할 수 있는 PEM 형식으로 변환합니다.openssl pkcs12 -export -out $pfxFilePath -inkey privateKey.key -in selfsigncert.crt -password pass:$pwd openssl pkcs12 -in selfsigncert.pfx -out selfsigncert.pem -nodes
보안 암호를 묻는 메시지가 표시되면 암호를 입력하고 Enter 키를 누릅니다.
클라이언트 인증서를 요청하도록 게이트웨이 구성
API Management를 위해 소비 계층을 사용하고 있으므로 클라이언트 인증서를 허용하도록 게이트웨이를 구성해야 합니다. 다음 단계를 수행합니다.
이미 열려 있는 Azure Portal에서 API Management 서비스(apim-WeatherDataNNNN)를 선택합니다.
왼쪽 메뉴 창의 배포 및 인프라에서 사용자 지정 도메인을 선택합니다. API Management 서비스에 대한 사용자 지정 도메인 창이 나타납니다.
*‘클라이언트 인증서 요청’에 대해 예를 선택하고 상단 메뉴 모음에서 저장을 선택합니다.
인증서의 지문 가져오기
이 섹션에서는 특정 지문이 있는 인증서가 있는 경우에만 요청을 수락하도록 API Management를 구성합니다. 인증서에서 지문을 가져오겠습니다.
참고
SSL 인증서 지문(thumbprint)을 SSL 인증서 지문(fingerprint)이라고도 합니다.
Cloud Shell에서 다음 코드를 실행합니다.
Fingerprint="$(openssl x509 -in selfsigncert.pem -noout -fingerprint)" Fingerprint="${Fingerprint//:}" echo ${Fingerprint#*=}
전체 출력(16 진수 문자열)을 복사하고 해당 지문 값을 텍스트 파일에 붙여 넣습니다.
유효한 인증서가 있는 요청만 허용하도록 인바운드 정책 편집
이제 API Management 게이트웨이에 인증 정책을 만듭니다.
Azure Portal에서 API Management 서비스를 선택합니다. 필요한 경우 Azure 리소스 메뉴 또는 홈 페이지에서 모든 리소스를 선택한 다음 API Management 서비스를 선택합니다.
왼쪽 메뉴 창의 API에서 API를 선택합니다. API Management 서비스에 대한 API 창이 나타납니다.
보조 메뉴에서 날씨 데이터를 선택합니다.
인바운드 처리 상자에서 </> 아이콘을 선택하여 정책 코드 편집기를 엽니다. 정책 노드의 HTML 코드가 표시됩니다.
정책 파일의
<inbound>
노드를 다음 XML로 바꾸고desired-fingerprint
자리 표시자를 앞서 복사한 지문으로 대체합니다.<inbound> <choose> <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-fingerprint")" > <return-response> <set-status code="403" reason="Invalid client certificate" /> </return-response> </when> </choose> <base /> </inbound>
저장을 선택합니다.
게이트웨이를 호출하고 클라이언트 인증서를 전달
이제 인증서를 사용하거나 사용하지 않고 새 인증 정책을 테스트할 수 있습니다.
인증서 없이 API를 테스트하려면 Cloud Shell에서 다음 명령을 실행하여 자리 표시자 값을 API 게이트웨이 이름 및 구독 키로 바꿉니다.
curl -X -v GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \ -H 'Ocp-Apim-Subscription-Key: [Subscription Key]'
이 명령은 403 클라이언트 인증서 오류를 반환하며, 데이터는 반환되지 않습니다.
Cloud Shell에서 인증서를 사용하여 API를 테스트하려면 첫 번째 연습에서 가져온 기본 구독 키(이 기본 키는 WeatherData API Management 서비스에 대한 구독 창에서 가져올 수도 있음)를 사용하여 다음 cURL 명령을 복사하고 붙여 넣습니다. API 게이트웨이 이름을 포함해야 합니다.
curl -X GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \ -H 'Ocp-Apim-Subscription-Key: [subscription-key]' \ --cert-type pem \ --cert selfsigncert.pem
이 명령을 실행하면 다음과 유사한 날씨 데이터를 표시하는 응답이 나타납니다.
{"mainOutlook":{"temperature":32,"humidity":34},"wind":{"speed":11,"direction":239.0},"date":"2019-05-16T00:00:00+00:00","latitude":53.0,"longitude":-1.0}