우분투 18.04에 Let’s Encrypt 설정하여 SSL 인증서 발급 받기

우분투 18.04에 Let’s Encrypt 설정하여 SSL 인증서 발급 받기

서문

Let’s Encrypt는 TLS/SSL 인증서를 발급 받고 설치하는 방법을 제공하는 인증 기관 (Certificate Authority)이다. 대부분의 필수적인 절차를 자동으로 해주는 Certbot이라는 소프트웨어를 제공해서 설치 과정을 간편하게 해준다. 현재, 아파치나 Nginx 서버에서 발급 받고 설치하는 모든 과정은 완벽하게 자동화 되어 있다.

이 튜토리얼에서는, 우분투 18.05에 설치된 아파치 웹 서버에 무료 SSL 인증서를 발급 받고 설치하고 자동으로 갱신하는 것까지 Certbot을 사용할 것이다.

그리고 디폴트 설정 파일을 사용하는게 아니라 버츄얼 호스트 설정을 사용할 것이다. 항상 각각의 도메인에 대해서 버츄얼 호스트를 사용하는 것을 추천한다. 그게 일반적인 실수도 줄일 수 있고, 디폴트 파일로 설정을 되돌려야만 할 때 사용할 수도 있다.

꼭 필요한 것

  • 아파치 웹 서버가 설치된 우분투 18.04 서버, 그리고 sudo 권한을 가진 일반 유저 계정
  • 모든 등록을 마친 도메인 네임. 이 튜토리얼에서는 test_domain.com을 예시로 사용할 것이다.
  • 아래와 같이 설정된 DNS 레코드.
    • 웹 서버의 퍼블릭 IP주소를 가리키고 있는 test_domain.com 값의 A레코드
    • 웹 서버의 퍼블릭 IP주소를 가리키고 있는 www.test_domain.com 값의 A레코드
  • 이전 게시물 아파치 웹 서버 설치하기로 버츄얼 호스트가 잘 설정되어 있는 웹 서버. 이 튜토리얼에서는
    /etc/apache2/sites-available/test_domain.com.conf를 예시로 사용할 것이다.

스텝 1 – Certbot 설치하기

SSL 인증서를 설치하기 위한 첫번째 과정은 Certbot 프로그램을 웹 서버에 설치하는 것이다.

Certbot은 개발이 매우 활발해서, 우분투 기본 패키지 저장소의 버전은 옛날 버전일 수 있다. 그래서 Certbot 개발자들이 제공하는 저장소를 이용해서 최신 버전을 설치하도록 하겠다.

우선, 저장소를 추가한다.

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

apt로 Certbot의 아파치 패키지를 설치한다.

$ sudo apt install python-certbot-apache

Certbot을 사용할 준비는 되었다. 하지만 아파치 웹 서버에 SSL를 설정하기 위해선, 몇개의 아파치 웹서버 설정을 확인해야 한다.

스텝 2 – SSL 인증서 설정하기

자동으로 SSL을 설정하기 위해서 Certbot은 아파치 웹 서버에 설정된 정확한 버츄얼 호스트를 찾을 수 있어야 한다. 특히 요청한 도메인 네임이 아파치 웹 서버 설정에서 ServerName 항목과 일치하는 것이 있어야 한다.

이전 게시글을 통해서 아파치 웹 서버를 설치했다면, /etc/apache2/sites-available/test_domain.com.conf을 설정 파일로 가진 버츄얼 호스트를 가지고 있을 것이다.

위의 버츄얼 호스트 파일을 nano 에디터를 이용해서 열어 설정을 확인해 보자.

$ sudo nano /etc/apache2/sites-available/test_domain.com.conf

ServerName을 포함한 라인은 아래와 같이 설정되어 있어야 한다.

생략...
ServerName test_domain.com;
생략...

제대로 되어 있다면, 에디터를 종료하고, 그렇지 않다면 위와 같이 되도록 변경하라.

변경했다면 아래 명령어로 설정을 테스트 하자.

$ sudo apache2ctl configtest

만약 에러가 발생한다면, 파일을 다시 열어서 오타가 있지 않나 확인해보자. 다시 체크해 봐서 문제가 없다면 아파치 웹 서버에 새로운 설정을 로드하도록 명령하자.

$ sudo systemctl reload apache2

스텝 3 – 방화벽이 HTTPS 프로토콜을 허가하도록 만들기

ufw 방확벽이 설치되어 있다면, HTTPS 트래픽을 허가하도록 변경해야 한다. 아파치 웹 서버가 설치될 때, 프로파일들이 등록되었으므로 그냥 사용하면 된다.

우선 다음 명령어로 현재 상태를 확인하자.

$ sudo ufw status

결과는 아마 다음과 비슷할 것이다. 현재는 HTTP 트래픽만 접근이 허용된 상태다.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Apache                     ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Apache (v6)                ALLOW       Anywhere (v6)

HTTPS 트래픽도 허용하기 위해서 미리 설정된 “Apache Full” 프로파일을 활성화 시키면 된다. 그리고 Apache는 Apache Full에 포함되어 있기 때문에 비활성화 시키자.

$ sudo ufw allow 'Apache Full'
$ sudo ufw delete allow 'Apache'

다시 ufw의 상태를 확인하면 아래와 같을 것이다.

Status: active

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

이제 Certbot을 실행시켜서 인증서를 받아보자.

스텝 4 – SSL 인증서 받기

Certbot은 플러그인을 통해서 인증서를 받기 위한 다양한 방법을 제공한다. 아파치 플러그인은 인증서를 받고 아파치를 재설정한 후 재로딩하는 것까지 다 처리한다. 다음과 같은 명령어를 사용하자.

$ sudo certbot --apache -d test_domain.com -d www.test_domain.com

–apache로 아파치 플러그인임을 명시하고 “-d 도메인”으로 발급받기 원하는 도메인 네임을 명시하자.

만약 Certbot을 실행하는 것이 처음이라면, 이메일 주소와 서비스 약관을 동의하라는 것이 뜰 것이다. 그 다음, Certbot은 Let’s Encrypt 서버와 통신을 할 것이다, 그리고 우리가 인증서를 요구한 도메인이 제대로 설정된 것이 맞는지 확인을 시작할 것이다.

문제가 없다면, certbot은 http 리다이렉션을 어떻게 할 것인지 물어볼 것이다.

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
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.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

원하는 것을 선택하고 엔터를 누른다. 리다이렉션을 선택한다면 설정이 업데이트 되고 재로딩 될 것이다. 마지막으로, Certbot은 모든 것이 잘 되었다는 메시지와 함께 요청한 인증서가 어디에 저장되었는지 알려줄 것이다.

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/test_domain.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/test_domain.com/privkey.pem
   Your cert will expire on 2020-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"
 - 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.
 - If you like Certbot, please consider supporting our work by:

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

요청한 인증서는 성공적으로 발급되었고, 다운로드 된 후 성공적으로 설치되었다. 브라우저에 https://www.test_domain.com 도메인 주소를 입력해서 잘 작동되고 있는지 확인하자. 대부분의 브라우저의 경우 도메인 주소창 왼쪽편에 자물쇠 형태로 표시가 된다. 마지막으로 자동 갱신을 테스트하고 끝내도록 하자.

스텝 5 – Certbot 자동 갱신 테스트

Let’s Encrypt의 인증서는 오직 90동안 유효하다. 우리가 인스톨한 certbot 프로그램 패키지는 갱신 스크립트를 /etc/cron.d에 추가해서 자동 갱신을 처리한다. 이 스크립트는 하루에 두번 실행되며, 만료 30일 안에 있는 인증서는 자동으로 갱신할 것이다.

갱신 프로세스를 테스트하기 위해, certbot으로 테스트 실행을 할 수 있다.

$ sudo certbot renew --dry-run

어떤 에러도 보이지 않는다면, 제대로 되고 있다는 것이다. 필요할 때, Certbot은 인증서를 갱신하고 아파치를 재로딩 시킬 것이다. 만약 자동 인증 프로세스가 실패한다면, Let’s Encrypt는 위에서 설정한 이메일로 인증서가 만료할 것이다라는 경고 메시지를 보낼 것이다.

마무리

이 튜토리얼에선, Let’s Encrypt 클라이언트 certbot을 설치했고, 도메인을 위한 SSL 인증서를 받았고, 그 인증서를 사용하도록 아파치를 설정했다. 그리고 자동 인증서 갱신도 설정했다. 만약 Certbot에 대한 추가적인 정보나 학습을 원한다면, Certbot의 문서를 읽어볼 것을 추천한다.

댓글 남기기