번역) Ubuntu 18.04에서 Let's Encrypt를 사용하여 Nginx에 SSL을 적용하는 방법

PINOT·2020년 2월 3일
3

개발 이야기

목록 보기
3/4

원문 보기

의역과 역자 해설이 조금 들어가 있습니다.

도입

Let's Encrypt는 무료 SSL / TLS 인증서를 얻고 설치할 수 있는 인증 기관으로, 웹 서버에서 암호화 된 HTTPS를 사용할 수 있게 해줍니다. 또한, Certbot 이라는 자동화 클라이언트를 제공하여 Apache 및 Nginx에서 인증서를 획득하고, 설치하는 전체 프로세스가 자동화 되어 있습니다.

이 도움말에서는 Certbot을 사용하여 Ubuntu 18.04 에서 Nginx용 무료 SSL 인증서를 받고, 자동으로 갱신하도록 설정할 수 있습니다.

또한, 이 도움말에서는 default 파일 대신, 별도의 Nginx 서버 블록 파일을 사용합니다. 일반적인 실수를 방지하고, default 파일을 예외 처리 파일로 유지할 수 있으므로, 도메인마다 새로운 Nginx 서버 블록 파일을 만드는 것을 추천합니다.

준비물

이 도움말을 따라하려면, 다음과 같은 준비물이 필요합니다.

  • Ubuntu 18.04, 이 서버는 sudo 명령어가 가능한 사용자와 기본적인 방화벽 설정이 되어 있어야 합니다.
  • 등록된 DNS 도메인, 이 도움말에서는 throughout 을 사용합니다. NameCheap에서 도메인을 구매하거나, Freenom에서 무료 도메인을 구할 수 있고, 당신의 개인적인 도메인 서비스를 이용할 수도 있습니다.
  • 다음 두 도메인이 다음과 같은 조건을 만족합니다. 추가 방법에 대한 자세한 내용은 이 문서를 참고하세요.
    • A레코드 example.com 이 해당 서버의 주소와 연결되어 있습니다.
    • A레코드 www.example.com 이 해당 서버의 주소와 연결되어 있습니다.
  • Ubuntu18.04에 Nginx를 설치하는 강좌를 따라서 Nginx가 설치 되어야 합니다. /etc/nginx/sites/available 에 도메인에 대한 서버 블록이 있는지 확인하세요. 본 도움말에서는 /etc/nginx/sites/available/example.com 를 사용할 예정입니다.

1단계 - Certbot 설치

Let's Encrypt를 사용하여 SSL 인증서를 얻기 위해서는 우분투 서버에 Certbot 클라이언트를 설치해야 합니다. Certbot의 개발은 빠르게 개발되고 있어서, 우분투 apt 에서 제공하는 Certbot 패키지는 조금 오래된 버젼입니다. 하지만, Certbot의 레포지토리는 항상 최신을 유지하고 있습니다. 우리는 레포지토리를 사용하여 설치할 예정입니다.

아래 명령어를 추가하여 레포지토리를 추가하세요.

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

엔터를 눌러 진행한 다음, apt 를 사용하여 Certbot의 Nginx 패키지를 설치하세요.

$ sudo apt install python-certbot-nginx

이제 Certbot을 사용할 수 있지만, Nginx의 SSL을 구성하기 위해서는, Nginx의 구성 중 일부를 확인해야 합니다.

2단계 - nginx 설정 확인하기

SSL을 자동으로 적용시키기 위해서는 Certbot이 서버 블록에서 확실한 정보를 찾을 수 있어야 합니다. 특히 SSL의 경우, server_name 에서 감지하여 요청하는 방식으로 이루어집니다.

Nginx 서버 블록 설정 튜토리얼을 끝냈다면, 도메인에 대한 서버 블록이 있어야 합니다. /etc/nginx/sites-available/example.com 에 대한 서버 블록의 server_name 구문이 적절하게 설정 되었는지 확인하세요.

적절하게 설정 되었는지 확인하려면, nano 또는 즐겨 찾는 텍스트 편집기를 사용하여 example.com 을 여세요.

$ sudo nano /etc/nginx/sites-available/example.com

기존 파일의 server_name 항목이 아래와 같이 표시되어 있다면, 편집기를 종료하고 다음 단계로 넘어가세요.

server_name example.com www.example.com;

만약, 일치하지 않다면, 위와 같이 변경한 후, 다음 단계로 넘어가세요.

아래 커맨드를 입력하여 파일의 구문이 정상적으로 작성 되었는지 확인하세요.

$ sudo nginx -t

만약, 오류가 발생했다면 서버블록을 다시 열고 잘못 입력된 문자가 있는지 확인하세요. 테스트를 통과한 경우, 아래 커맨드를 사용하여 새로운 구성을 로드시키세요.

$ sudo system reload nginx

이제 Certbot은 올바른 서버 블록을 탐지하고, 설정을 업데이트 할 것입니다.

다음으로, https 트래픽을 허용하도록 방화벽을 업데이트해야 합니다.

3단계 - 방화벽을 통해 https 허용하기

역자 주 : Amazon Web Service를 사용하는 경우 이 단계를 무시해도 좋습니다!

만약 여러분의 서버에 ufw 방화벽이 활성화 되어 있다면, https 연결이 허용 되도록 설정을 조정해야 합니다. 다행스럽게도, Nginx를 설치하는 과정에서 ufw 에 몇가지 설정을 등록했습니다.

다음 명령어를 입력하여 현재 설정을 확인할 수 있습니다.

$ sudo ufw status

다음과 같이 표시 된다면, 지금 현재 방화벽은 http 요청만 허용된다는 뜻입니다.

Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

https 트래픽을 추가적으로 허용하려면, Nginx Full 프로파일을 허용하고, 중복되는 Nginx HTTP 프로파일을 삭제해야 합니다.

$ sudo ufw allow 'Nginx Full' 
$ sudo ufw delete allow 'Nginx HTTP' 

이제 다음과 같이 표시되어야 합니다.

역자 주 : 9번째 줄의 Nginx HTTP 옵션이 Nginx Full로 변경되었습니다.

$ sudo ufw status
Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

다음 단계에서는 Certbot을 실행하여 인증서를 가져오는 방법을 알아보도록 하겠습니다.

4단계 - SSL 인증서 가져오기

Certbot은 다양한 웹 서버에 대하여 SSL 인증서를 얻을 수 있는 플러그인을 제공합니다. Nginx 플러그인은 필요할 때마다 자동적으로 Nginx를 재구성하고, 구성을 다시 로드하는 작업을 담당합니다. Nginx 플러그인을 사용하기 위해, 다음과 같이 입력해주세요.

$ sudo certbot --nginx -d example.com -d www.example.com

이 명령어는 nginx 플러그인이 적용된 certbot-d 인자 우측에 있는 도메인들을 유효하게 만드는 설정을 진행할 수 있습니다.

certbot을 처음 실행하게 된다면, 당신은 이메일 주소를 입력하고, 서비스 약관에 동의해야 하는 절차를 수행해야 합니다. 절차를 수행한 경우, certbot은 Let's Encrypt 서버와 통신한 이후 문제를 해결하여 당신이 인증서를 요청할 도메인을 제어하고 있는지 확인하게 됩니다.

위 절차가 성공적으로 이루어졌을 경우, certbot은 당신이 https를 어떻게 설정할 것인지 묻게 됩니다.

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
// http 트래픽을 https로 리다이렉트 하실건가요, 아니면 http 접근을 막으실 건가요?
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
// 리다이렉트 없음 - 웹서버 설정에 아무런 변화도 없습니다.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
// 리다이렉트 - 모든 http 연결을 https로 리다이렉트 합니다. 웹서버 설정을 변화시킬수 있습니다. 변화된 설정은 다시 복구가 가능합니다.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

선택을 하고 엔터를 누르게 된다면, 구성이 업데이트되고, Nginx가 자동으로 재시작 됩니다. certbot은 프로세스가 성공되었으며, 인증서가 저장된 위치를 알려주며 종료되게 됩니다.

Output
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   // 공개 키가 저장된 장소
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   // 비밀 키가 저장 된 장소
   Your cert will expire on 2018-07-23. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
   // 인증서는 설치가 완료된 이후 90일 까지만 유효합니다, 90일 전에 certbot을 다시 실행해 인증서를 갱신하세요. (역자 주 : 자세한 내용은 5단계 - Certbot 자동 갱신 시키기 를 참고하세요.)
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
   // 인증서가 /etc/letsencrypt 폴더에 저장되어 있습니다. 당신은 이 개인 키와 공개 키를 안전한 장소에 보관하는것을 추천합니다
 - If you like Certbot, please consider supporting our work by:
 	// 만약 Certbot에 만족하셨다면, 커피 한잔 사주세요 :)

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

인증서가 다운로드되고, 설치되었으며 서버에 적용되었습니다. https://를 사용하여 웹사이트를 다시 로딩해보세요. 일반적으로, 녹색 자물쇠 아이콘으로 사이트의 SSL이 적용 되었음을 나타냅니다. SSLLabServerTest를 사용하여 서버를 테스트 하는 경우 A 등급을 받을 수 있습니다.

5단계 - SSL 자동으로 갱신시키기

Let's Encrypt의 인증서는 90동안만 유효합니다. 인증서를 자주 갱신시키는 것이 권장되기 때문입니다. 우리는 certbot 패키지를 설치하여 이 문제를 자동화 시킬 수 있습니다. /etc/cron.d 내의 스크립트는 하루 두번씩 실행되어 만료일까지 30일 이내의 모든 인증서를 자동으로 갱신 시킬 수 있습니다.

갱신 절차를 테스트 해보려면, 다음 명령어를 입력하세요.

$ sudo certbot renew --dry-run

오류가 없다면, 당신은 모든 설정을 마친 것입니다. 이제 certbot이 자동적으로 인증서를 갱신하고, Nginx를 재시작 할것입니다. 만약 자동 갱신 프로세스가 실패할 경우, 인증서가 만료되기 이전에 사전에 지정된 이메일로 경고 메시지가 보내질 것입니다.

마무리

이 도움말에서는 Let's Encrypt 인증서를 설치했 습니다. certbot 클라이언트는 도메인에 대한 SSL을 인증서를 다운로드하고, 구성하며, 자동적으로 인증서 갱신을 설정시킵니다. 만약 Certbot 사용에 대하여 추가적인 질문이 있는 경우, 이 문서를 참고하세요.

하젤 비르도캐서린 주엘

첫 번역을 마치며

번역은 역시 어렵네요 ;ㅅ;

진짜로 전문적으로 번역하시는 분들 정말 굉장하신 것 같습니다 ㅠㅠ

오타 / 오역 제보 및 추가적인 질문은 (pinot.kim@kakao.com)이나, 이 글의 댓글로 달아주세요!

긴 글 읽어주셔서 감사합니다 :)

profile
프론트엔드 개발자

3개의 댓글

comment-user-thumbnail
2020년 11월 9일

요부분 코드에 오타가 있어요!

테스트를 통과한 경우, 아래 커맨드를 사용하여 새로운 구성을 로드시키세요.

$ sudo sysyem reload nginx => sudo systemctl reload nginx

1개의 답글
comment-user-thumbnail
2021년 6월 24일

와.. 정말 좋은 글입니다!! 참고하신 페이지도 정말 유익하네요 도움이 많이 되었습니다!!

답글 달기