본문 바로가기

Storage&CDN/CloudFront

Amazon CloudFront SSL 인증서 설정하기

HTTPS 통신은 이제 필수다.

 

간단한 SSL 관소개 웹툰: 

 

[웹툰03] SSL이란 무엇인가? 1/2

이 웹툰은 원래 통신사 비판으로 기획되었습니다. 프롤로그 격으로 한국의 보안 현실을 간단히 훑고 가려고 했으나..... 보안 관계자 여러분들의 열화와 같은 성원에 힘입어 본격 보안 만화로 탈바꿈하게 되었습니..

minix.tistory.com

 

 

[웹툰04] SSL이란 무엇인가? 2/2

이 페이지에 있던 보안 웹툰은 사정에 의해서 가리게 되었습니다. 그 이유가 궁금하신 분은 <여기>에서 확인하실 수 있습니다. 김인성.

minix.tistory.com

 

경험상 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에 잘 나와 있다.

 

Using HTTPS with CloudFront - Amazon CloudFront

The AWS Documentation website is getting a new look! Try it now and let us know what you think. Switch to the new look >> You can return to the original look by selecting English in the language selector above. Using HTTPS with CloudFront For web distribut

docs.aws.amazon.com

 

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

 

AWS 명령줄 인터페이스

aws-shell은 명령줄 셸 프로그램으로서, AWS 명령줄 인터페이스를 사용하는 새로운 사용자와 고급 사용자 모두에게 도움이 되는 편의 기능 및 생산성 기능을 제공합니다. 주요 기능은 다음과 같습니다. 다음 항목에 대한 퍼지 자동 완료 명령(예: ec2, describe-instances, sqs, create-queue) 옵션(예: --instance-ids, --queue-url) 리소스 식별자(예: Amazon EC2 인스턴스 ID, Amazon

aws.amazon.com

 

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를 확인하자.

 

CloudFront에서 HTTPS 사용 - Amazon CloudFront

CloudFront에서 HTTPS 사용 웹 배포에 대해, 최종 사용자가 객체를 요청할 때 HTTPS를 사용할 것을 요구하도록 CloudFront를 구성할 수 있습니다. 이렇게 하면 CloudFront가 최종 사용자와 통신할 때 연결이 암호화됩니다. 또한 CloudFront가 오리진의 객체를 받을 때 HTTPS를 사용하도록 구성할 수 있습니다. 이렇게 하면 CloudFront가 오리진과 통신할 때 연결이 암호화됩니다. CloudFront가 최종 사용자와 통

docs.aws.amazon.com

 

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

 

 

ㅋㅋㅋ....

추가! 이제 AWS Certificate Manager를 통해서 SSL 인증서를 쉽게 관리할 수 있음. CLI 사용할 필요 없음ㅜㅜ

 

comodo 기준 SSL 파일 import 방법

도메인.crt -> Certificate body

도메인_SHA256~.key -> Certificate private key

ChainCA(ValidationCA, TrustCA, AddCA) -> Cerfificate chain 

 

중국 서비스의 경우 Alicloud를 사용하기도 하는데, Alicloud CDN SSL Import는 nginx 포맷을 사용함.

(https://www.comodossl.co.kr/certificate/ssl-installation-guides/Nginx.aspx)