jadehan

AWS - nginx + https 설정(2) - letsencrypt를 통한 SSL인증서 발급 본문

IT/Back-end

AWS - nginx + https 설정(2) - letsencrypt를 통한 SSL인증서 발급

PaPhoPu 2016. 4. 25. 22:21

이 글은 아마존 웹서비스에 대한 기본적인 지식이 있어야하는 글입니다.

질문사항은 댓글로 남겨주시면 친절히 답변드리도록 하겠습니다.


아래의 설명은 AWS를 통해서 개발자가 만든 웹 서비스를


nginx를 통해 배포하는 작업의 확장으로


기본적으로


nginx 설치, database설치가 되어있다는 가정하에 진행합니다.



##개발환경##


OS : ubuntu 14.04

WEB SERVICE : nginx


############


보안이란 참으로 중요하다고 생각됩니다.


client가 보낸 request는 WAN 또는 LAN을 타고 라우터를 돌고돌아


서버에 전달되어 되돌려 받은 response를 통해서


브라우저에 반응된 response를 노출시키는데요


이 과정에서


크래커(cracker)들은 wire shark와 같은 프로그램을 이용하여


WAN, LAN을 타고 전송되는 request, response 내용을


훔쳐볼 수가 있는데


이를 막기위해서는 request, response 내용들을 암호화해서 보낼 필요가 있습니다.



그걸 가능하게 해주는 통신은 바로 https(port 433번)프로토콜을 이용한


데이터 통신 방법인데


본래 http의 가장 큰 단점인 "보안 취약"에 대한 부분을


해결해준 고마운 통신 프로토콜이라고 볼수 있습니다.



이를 위해서 몇 가지 설정해줘야 할 것이 있는데


일단은 https가 가능하도록 SSL이라는 보안 인증서를 발급 받아야합니다.


돈을 내고 받던 공짜로 받던(사실 비싼 보안 인증서를 발급받으면 보안 면에서 훨씬 뛰어납니다.)


상관 없지만 그중에서 무료로 SSL인증서를 발급해주는 사이트인 


letsencrypt


에서 발급받도록 해보겠습니다.




[Getting Started] 를 클릭합니다.





$ git clone https://github.com/letsencrypt/letsencrypt

$ cd letsencrypt

$ $ ./letsencrypt-auto --help


SSL 통신으로 접속된


Ubuntu인스턴스 내부 터미널에서


위의 3개의 명령어를 차례대로 실행합니다.





$ ./letsencrypt-auto certonly --standalone -d production.amull.net

명령어를 실행합니다.



이러면 아래와 같은 창이 생길텐데(실수로 스샷을 까먹어서 몇단계 빼먹었습니다.)


처음 뜨게 되면 아마 Email을 입력하라고 나올겁니다.


그냥 본인이 쓰시는 이메일 넣어 주시고 Agree해주시면됩니다.

(xxx@naver.com, xxx@gmail.com등등)




간혹 위와 같은 창이 뜰수가 있는데


이는 nginx가 구동되고 있어서


SSL인증서를 발급해줄 수 없다라는 소리입니다.




$ sudo service nginx stop

nginx를 잠시 멈춰둡니다.



$ ./letsencrypt-auto certonly --standalone -d production.amull.net

다시 이 명령어를 수행하면






이건 또 뭐야




이 아저씨 말씀을 들어보니 EC2에서 내가 port 433를 열어놓지 않아서 생긴 문제라고 합니다. 출처




가서 허용해줍니다.



AWS -> EC2 -> 내가 사용하고 있는 instance



오른쪽 끝에 보면 [Security Groups]라고 나와있습니다.


저는 launch-wizard-5를 클릭하겠습니다.





그럼 이런 화면이 나오는데(화면 하단에 있습니다)


여기서 [Edit]버튼을 클릭하고


[Add]하셔서 HTTPS를 추가해줍니다.





$ ./letsencrypt-auto certonly --standalone -d production.amull.net

다시 한번 해봅니다.




성공했네요


이젠 되는게 신기합니다. 


여러분 저 처럼 Congratulations! 부분을 스샷찍어두세요


나중에 쓸껍니다.




$ sudo vim /usr/local/nginx/conf/nginx.conf

nginx.conf에서 https설정을 해주기 위해 명령어를 입력해줍니다.


명령어를 입력해주면


nginx.conf의 기본설정 을 보실 수 있는데


이 설정에 대한 자세한 내용을 다루진 않겠으나


간단히 살펴보면


https(80 port)를 listen하고 있다가


request가 올 경우 index.html을 reponse로 보내준다는 소리입니다.



하지만 https로 response를 보내주기 위해서는


http(80) -> redirect -> https(433)


로 redirect를 시켜줘야할 필요가 있습니다.



여기서 nignx.conf 파일 을 복사해서 기존에 있던


설정에 덮어쓰기 합니다.


여기서 몇 가지 수정해주어야 할 부분이 생기는데


덮어쓰기 해주신 nginx.conf파일에서


54, 112, 114, 115 번 라인을 수정해 주어야합니다.


 


[your domain] -> AWS - route53에서 설정해준 도메인

[your public key] -> /etc/letsencrypt/live/개인 도메인/fullchain.pem

[your privite key] -> /etc/letsencrypt/live/개인 도메인/privkey.pem

public key, privite key에 넣어주셔야 할 키는


아까전 제가 congratulation 부분 스샷 찍으라고 말씀드렸던 부분에서


찾으실 수 있습니다.


앞의 /etc/letsencrypt/live까지는 모두 같습니다.



자 이젠 https를 적용하기 위한 모든 준비가 완료 되었습니다.


변경된 nginx 설정을 적용하기 위해


nginx를 껏다 킵니다.


$ service nginx restart

명령어를 실행합니다.


그리고 도메인에서 


도메인으로 접속해 봅니다.





이렇게 녹색으로 https가 뜨면 성공하신 겁니다.



P.S - 아마 https가 뜨면 도메인 화면에는 Bad Gate 에러가 뜰 겁니다.



이것은 nginx.conf 설정 중에서



128번 라인에


proxy_pass http://127.0.0.1:8000;


라고 설정해 주셔서 발생한 문제입니다.


이는 ubuntu에 탑제한 웹 서비스를 찾아가도록 해놓은 설정인데


현재 웹 서비스를 작동시키지 않았기 때문에


Bad gate 에러가 뜬 것 입니다.



2 Comments
댓글쓰기 폼