이두잉의 AWS 세상

AWS CloudFront SSL 인증서 설정하기

2016.08.17 11:46 - leedoing leedoing

안녕하세요. 

아래 그림과 같이 Application 서비스에서 로그인, 결제 등 보안이 필요한 페이지는 HTTPS 통신이 필요합니다. 

간단한 SSL 관소개 웹툰: http://minix.tistory.com/395http://minix.tistory.com/397


경험상 HTTPS는 HTTP 대비 약 1/3~1/5 수준의 성능을 보입니다. 가령 1Gbps HTTP 통신이 가능한 인프라가 HTTPS를 사용할 경우 200Mbps~500Mbps 정도로 성능에 제약이 발생됩니다. 서버 성능에 따라 결과는 달라질 수 있지만, 기본적으로 성능 저하가 발생됩니다. -> HTTP2


AWS을 사용할 경우 QoS, 비용, 글로벌 서비스를 위해 CDN 서비스인 CloudFront를 필수적으로 사용합니다.

AWS에서 HTTPS 통신의 Best practice는 다음과 같습니다.

맨 앞단 CloudFront에서만 HTTPS 통신을 사용하고 뒷단은 HTTP 통신을 통해 Network 및 VM의 과부하를 감소 시킵니다.


CloudFront 인증서 설정 방법은 아래 Document에 잘 나와 있습니다.

(http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html#CNAMEsAndHTTPS)


1. CloudFront 인증서 설정은 현재 Web Console에서 불가합니다. 따라서 IAM CLI를 사용할 수 있는 EC2 한 대를 준비합니다.

(https://aws.amazon.com/ko/cli/)


2. Private, Public, Chain Key를 준비합니다.

2-1. Private Key 형태

-----BEGIN RSA PRIVATE KEY-----

-----END RSA PRIVATE KEY-----

Private Key의 경우 RSA 암호화 방식을 사용해서 Private Key를 컨버팅해야 합니다.

2-2. Public Key 형태

-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----

3-2. Chain 형태

-----BEGIN CERTIFICATE-----

Intermediate certificate 2

-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----

Intermediate certificate 1

-----END CERTIFICATE-----


3. CLI 명령어

aws iam upload-server-certificate --server-certificate-name '인증서태그이름' --certificate-body file://'public.key' --private-key file://'private.key' --certificate-chain file://'chain.key' --path /'cloudfront/경로'


인증서가 정상적으로 등록되면 CloudFront Distribution Settings 항목 Custom SSL Certificate에 등록한 인증서를 확인할 수 있습니다. 

주의하실 내용은 인증서가 만약 *.leedoing.com과 같은 와일드카드 형태라면 CloudFront CNAMEs 설정도 *.leedoing.com 으로 동일하게 설정해줘야 합니다. 

또한 HTTPS 통신이 필요한 Path 경로를 Behavior에서 Redirect 해줘야 합니다. 


추가로 ELB SSL 설정은 Web Console에서 가능합니다.


만약 pfx 인증서 파일을 사용하고 있다면, AWS에서 사용하기 위해서 아래 명령어로 컨버팅이 필요합니다.

Private Key: openssl pkcs12 -in leedoing.com.pfx -nocerts -nodes -passin pass:'패스워드' | openssl rsa -out private.key

Public Key: openssl pkcs12 –in leedoing.com.pfx -clcerts -nokeys -passin pass:'패스워드' | openssl x509 -out public.key

Chain Key: openssl pkcs7 -print_certs -in leedoing-sha2.p7b -out chain.key


설정 후에 CloudFront에서 HTTP Status 502 code를 반환한다면 CloudFront 인증서 문제일 확률이 큽니다. 502 code가 나타나면 아래 내용 Document를 확인해보시기 바랍니다. 

(http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html)


만약 HTTPS 통신에 대해 Application 수정이 불가한 경우 동적 페이지는 HTTP/S 설정, All Cookie, All Query를 CF에 추가하고, 정적 페이지의 경우는 HTTPS 통신을 위해 Host Header만 추가해주시면 됩니다. Host Header를 추가하지 않았을 경우 CloudFront에서는 502 Code를 Response 해줍니다.



감사합니다.