안녕, 세상!

2-6 AWS에 Let's Encrypt로 HTTPS 적용하기 본문

It공부/Server

2-6 AWS에 Let's Encrypt로 HTTPS 적용하기

dev_Lumin 2021. 2. 2. 20:34

현재 AWS의 서버 환경은 다음 같습니다.

운영체제 : Ubuntu 18.04 (LTS)

웹서버 : Nginx

BL : PHP

DBMS : MySQL

 

 

웹 서버에 기본적인 부분을 구축했으니 이제 보안 부분을 신경 써보겠습니다.

HTTP(Hypertext Transfer Protocol)

클라이언트와 서버 양쪽에서 통신할 수 있도록 하는 기본 통신 프로토콜입니다.

앞서 웹서버 HTTP 프로토콜의 포트인 80번 포트로 접속하도록 설정을 하였습니다.

HTTP는 브라우저와 서버 사이에서 정보를 평문으로 전송하므로 정보가 전달되는 네트워크에서 

전송되는 정보를 엿볼 수 있습니다.

 

HTTPS(HTTP Secure)

이를 예방하기 위해 클라이언트와 서버가 먼저 암호화 통신 채널을 설정한 다음

평문 HTTP 메시지를 전송함으로써 정보 유출을 막는 HTTPS가 소개되었습니다.

암호화 채널은 SSL(TLS) 프로토콜을 사용해서 만듭니다.

( 참조 : webactually.com/2018/11/16/http%EC%97%90%EC%84%9C-https%EB%A1%9C-%EC%A0%84%ED%99%98%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/ )

 

 

앞서 서버를 구축하였고,

도메인을 가지고 있으며 DNS 레코드 설정은 A레코드로 설정을 해주었습니다.

HTTPS를 구축할 조건을 만족하므로 Let's Encrypt로 구축을 해보겠습니다.

 

Let's Encrypt

Let's Encrypt는 무료의 TLS/SSL 인증서를 쉽게 가져오고 설치할 수 있는 방법을 제공하는 

CA(인증 기관)으로, 웹 서버에서 암호화된 HTTPS를 사용할 수 있습니다.

이러한 방법은 사용자에게 Certbot라는 소프트웨어를 제공함으로써 구현할 수 있게 합니다.

(1) Certbot 설치

Certbot 패키지는 Ubuntu내에 존재하지만

Certbot 개발자들이 최신 버전의 Ubuntu 소프트웨어 저장소를 기준으로 꾸준히 제공해주기 때문에

최신 버전의 저장소를 사용할 것입니다. 

우선 Certbot를 위한 repository(저장소)를 추가합니다.

$ sudo apt update
$ sudo apt upgrade
$ sudo add-apt-repository ppa:certbot/certbot

 

Certbot의 Nginx 패키지를 설치합니다.

$ sudo apt install python-certbot-nginx

 

 

 

(2) Nginx Configuration 설정

Nginx 기본 설정 파일에 들어가서 인증서를 적용할 도메인 이름을 설정합니다.

$ sudo vim /etc/nginx/sites-available/default

변경을 하고 잘 되는지 확인하기 위해서 테스트를 진행합니다.

$ sudo nginx -t

 

테스트가 별문제 없이 잘 되었다면 설정 파일을 적용하기 위해 Nginx를 다시 로드해줍니다.

sudo systemctl reload nginx

 

 

(3) 방화벽의 HTTPS 허용

Ubuntu는 기본적으로 ufw라는 기본적인 방화벽을 가지고 있습니다.

HTTPS에 대한 방화벽 허용 설정이 필요한데, AWS EC2 인스턴스의 경우는 기본으로 방화벽이

비활성화되어 있습니다.

$ sudo ufw status

비활성화되어있다고 나옵니다.

비활성되어 있으므로 넘어갑니다.

 

 

(4) SSL 인증서 받기

Certbot은 다양한 플러그인을 통해 SSL 인증서를 획득하는 다양한 방법을 제공합니다.

Nginx플러그인은 필요할 때마다 Nginx를 재구성하고 구성을 다시 로드합니다.

 

이제 원하는 도메인을 지정해서 Nginx플러그인을 통해 인증서를 획득합니다.

$ sudo certbot --nginx -d lumin-server.shop -d www.lumin-server.shop

(-d 옵션으로 도메인 지정)

이메일을 입력하라고 요구하며 입력하지 않으면 반드시 필요하다고 나오므로 이메일을 입력합니다.

그리고 A를 눌러서 Agree를 해줍니다.

이후 이메일 관련 알림 설정이 나오는데 필자는 N으로 설정하지 않았습니다.

그러면 필자의 경우 다음과 같은 오류가 발생합니다.

lumin-server.shop이라는 도메인에 대해서 오류가 났는데

이는 해당 도메인에 대해서 DNS 레코드를 설정하지 않았기 때문입니다.

 

앞서 도메인을 구입한 가비아 설정을 가서 다음과 같이 해당 도메인에 대해서 DNS 레코드를 추가해줍니다.

host를 @로 함

이제 다시 인증서 설치 명령어를 입력합니다.

그럼 다음과 같이 두 가지 선택사항이 나옵니다.

1 : HTTP 연결을 HTTPS로 리다이렉트 하지 않음

2 : HTTP연결을 HTTPS로 리다이렉트함

 

필자는 2번을 선택했습니다.

선택을 하면 구성이 업데이트되고 다음과 같이 결과가 잘 나옵니다.

결과를 보면 You should test your configuration at: 이라고 나와있고 그 이후 url이 나와있습니다.

이 url은 해당 도메인에 대한 서버를 테스트를 할 수 있는 url입니다.

SSL Lab Server Test로 이동하여 테스트를 해보겠습니다.

www.ssllabs.com/ssltest/

 

SSL Server Test (Powered by Qualys SSL Labs)

SSL Server Test This free online service performs a deep analysis of the configuration of any SSL web server on the public Internet. Please note that the information you submit here is used only to provide you the service. We don't use the domain names or

www.ssllabs.com

이 url로 이동하여 도메인을 입력해주면 (www.lumin-server.shop)

다음과 같이 오류가 뜹니다.

그 이유는 SSL이 사용하는 HTTPS에 대한 포트 포워딩을 안 해주었기 때문입니다.

HTTPS의 포트번호는 443번입니다.

 

AWS 보안 설정으로 들어가서 다음과 같이 443에 대한 포트를 열어줍니다.

(인바운드 규칙을 추가해줍니다.)

 

 

그리고 다시 ssllab에 가서 도메인 주소를 입력하면 다음과 같이 잘 나옵니다.

(만약 www.lumin-server.shop 을 입력했음에도 불구하고 안된다면,

       lumin-server.shop을 입력해보면 될 것임)

 

 

(5) Certbot 자동 갱신 확인

Let's Encrypt의 인증서는 90일 동안만 유효하므로, 90일마다 갱신시켜줘야 합니다.

하지만 설치하는 과정에서 /etc/cron.d에 자동으로 갱신시켜주는 커맨드가 추가되어 있습니다.

다만, 갱신 프로세스가 잘 동작하는지 테스트를 해보고 싶다면 다음과 같은 명령어를 입력해서

테스트를 진행할 수 있습니다.

$ sudo certbot renew --dry-run

오류가 나오지 않았으므로 모든 설정이 잘 완료된 것입니다.

인증서가 필요한 경우 Certbot은 인증서를 갱신하고 Nginx를 다시 로드하여 변경 사항을 적용할 것입니다.

만약 자동 갱신 프로세스가 실패할 경우 Let's Encrypt는 앞서 지정한 이메일로

인증서 만료 경고 메시지를 보내줍니다.

 

 

이제 HTTPS에 대한 설정이 모두 완료가 되었기 때문에 Nginx의 서버를 restart 시켜줍니다.

$ sudo service nginx restart

주소창에 서버의 도메인 주소를 입력하면 다음과 같이 자물쇠 모양으로 https가 잘 적용된 것을 확인할 수 있습니다.

 

 

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

       :  velog.io/@banjjoknim/Lets-encrypt%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-Nginx%EC%97%90-HTTPS-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0#%EB%93%A4%EC%96%B4%EA%B0%80%EA%B8%B0-%EC%95%9E%EC%84%9C   

 

 

'It공부 > Server' 카테고리의 다른 글

3. AWS RDS 구축 (MySQL)  (0) 2021.02.08
2-7 Ubuntu Nginx 서브 도메인 및 Domain Redirection 적용  (0) 2021.02.03
2-5 도메인 구입 및 설정  (0) 2021.02.02
2-4 AWS에 PHPMyAdmin 설치  (1) 2021.02.02
2-3 MySQL 외부에서 접속  (1) 2021.02.01
Comments