영운's 블로그

AWS 서버 구축하기(5) - HTTPS 적용하기(Let's encrypt) 본문

서버 & 데이터베이스

AWS 서버 구축하기(5) - HTTPS 적용하기(Let's encrypt)

오영운(you88) 2022. 4. 22. 20:21

1) HTTP vs HTTPS

 

AWS서버에 도메인까지 적용하였으나 크롬으로 접속하면 url창 옆에 '주의요함' 이라는 경고가 있고

이를 누르면 https가 적용되지 않았다는 내용이 나타난다.

 

http https 모두 OSI 7 layer 7계층인 apllication layer 해당하는 프로토콜이다.

http 정말 전송만을 목적으로 하는 프로토콜로 데이터를 별도로 암호화하지 않기에 보안상 취약하다.

예를 들어 비밀번호 등을 입력하는 것도 해당 텍스트가 암호화 되지 않고 그대로 들어난다.

 

이러한 http 단점을 보완 것이 https 프로토콜이다.

https 별도로 ssl이라는 암호화 방식 이용하여 데이터를 암호화 합니다.

ssl은 공개키와 대칭키를 융합한 암호화 방식이다.

이러한 보안상 이점으로 인해 검색엔진은 SEO(search engine optimization)에서 http보다 https에 우선순위를 부여한다.

 

결국 https를 이용하는 것이 보안상, 검색 우선순위상 이점이 있기에 사실상 https가 필수가 되었다.

 

2) Certbot 설치

 

https는 ssl 암호화 방식을 사용하는데 중간에 CA(Certificate Authority)가 별도의 인증서를 만들어

보다 원활하게 암호화와 복호화를 하게 도와준다. CA는 무료와 유료가 있는데 Let's Encrypt라는 

CA는 이를 무료로 제공한다. Let's Encrypt에서 제공하는 패기지가 바로 Cerbot이다.

 

 

root@ip-172-31-37-33:/home/ubuntu# snap install --classic certbot

root@ip-172-31-37-33:/home/ubuntu# ln -s /snap/bin/cerbot /usr/bin/certbot

Certbot은 snap명령어를 이용하여 다운받는다. snap을 이용하는 경우 apt와 달리

프로그램에 필요한 라이브러리등을 모두 포함하고 있어 설치가 간편하다는 장점이 있다.

 

certbot을 설치 후 심볼릭 링크로 cerbot의 기본디렉토리를 /usr/bin/디렉토리와 연결하여

별도로 경로를 지정하지 않고도 단순히 certbot 명령어를 쓸 수 있게 한다.

 

3) Nginx 설정

 

 

root@ip-172-31-37-33:/home/ubuntu# apt install python3-certbot-nginx
root@ip-172-31-37-33:/home/ubuntu# vim /etc/nginx/sites-available/default

root@ip-172-31-37-33:/home/ubuntu# systemctl reload nginx

이후 vim으로 들어가 nginx 설정파일로 들어가

자신의 서버 도메인(나의 경우 www.ohyougeun.shop ohyouneun.shop)을 추가한다.

 

이후 nginx에 reload명령어로 해당 설정을 적용한다.

 

3)  방화벽 ufw에 https 허용하기

 

내가 구축한 AWS서버는 Ubuntu 운영체제이기에 ufw라는 방화벽을 가지고 있다.

 

ufw status 명렁어로 확인해보니 ufw가 비활성화 되어있었다.

ufw enable 명렁어를 통해 방화벽을 활성화 시킨 후

ufw status 명령어를 통해 허용된 통신을 확인한다.

 

 

ufw allow 'Nginx Full'
ufw delete allow 'Nginx HTTP'

nginx http만이 허용되었기에 'Nginx Full'(http + https)를 추가하고 기존의 'Nginx http'는 제거한다. 

 

 

방화벽을 설정했다 ssh가 막혀서 다시 접속이 불가능했다.

방화벽을 해제하려면 ssh로 접속해야 하는데 접속이 불가능했다..

방화벽을 설정시 ssh도 허용했어야 하는 데 그걸 하지 않은 것이다...

 

https://intellipaat.com/community/8740/locked-myself-out-of-ssh-with-ufw-in-ec2-aws

 

Locked myself out of SSH with UFW in EC2 AWS - Intellipaat Community

I have an EC2 Instance with Ubuntu. I used sudo ufw enable and after only allow the mongodb port sudo ufw allow 27017 When the ssh connection broke, I can´t reconnect

intellipaat.com

다행이 나처럼 바보같은 행동을 한 사람이 많았다.

구글링을 열심히 해 AWS인스턴스를 새로 만들고 볼륨을 서로 바꾸고..

다행이 다시 접속은 됐지만 기존 인스턴스의 공공ip주소가 바뀌었다.

도메인 이름과 ip주소 매칭을 다시 했어야 했다.

 

이후 그냥 ufw를 활성화하지 않고 진행하였다.

 

4) SSL 인증서 받아오기

 

root@ip-172-31-37-33:/home/ubuntu# certbot --nginx -d www.ohyoungeun.shop -d ohyoungeun.shop

certbot의 Nginx플로그인을 통해 Nginx로 만든 서버에 SSL인증서를 부여한다.

 

--nginx는 nginx플러그인을 사용하겠다는 의미이며 -d는 정확히 어떤 도메인 이름들에

인증을 줄 것인지 정하는 것이다. 앞서 우리가 구매한 도메인 이름을 적으면 된다.

 

이후 이메일을 적고

약관에 동의하는지

이메일로 관련 홍보 메일들 보내도 되는지 등을 물어본다.

 

원하는 옵션에 따라 선택을 하면 된다.

 

설정이 완료되고 나의 서버로 접속하면 url창 옆에 자물쇠가 나타나며

클릭시 https가 잘 적용되고 있음을 확인할 수 있다.

 

 

 

 

Let's Encrypt의 인증서는 90일의 유효기간이 있기에 이를 주기적으로 갱신해주어야 https를 계속 적용할 수 있다.

다행히 certbot자체가 주기적으로 검사하여 유효기간이 30일 이하인 경우 이를 갱신시켜준다.

직접 수동으로 certbot renew --dry-run 명령어를 입력했을 때 인증서 갱신에 성공했다고 나오면

갱신 과정에 문제가 없는 것이기에 성공적으로 설치가 완료된 것이다.

 

 

 

참고: https://luminitworld.tistory.com/85?category=975147

https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04

 

Comments