Security

[SSL/HTTPS] Let's Encrypt 무료 SSL 인증서 발급/설치/관리 - certbot 사용법

Posted 2017. 06. 13 Updated 2021. 12. 28 Views 34304 Replies 0
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

이전 글에서는 제가 StartSSL에서 Let's Encrypt로 갈아타게 된 계기가 되었던 'StartSSL' 사태와, SSL(TLS) 인증서를 발급받을 때 도메인 소유자를 인증하는 방법에 대해 소개했습니다. 이번 글에서는 본격적으로 Let's Encrypt에서 TLS 인증서를 발급받아 서버에 설치하고 관리(갱신, 변경, 삭제)하는 방법에 대해 다루도록 하겠습니다.

※ 주의: 서버 관리자(sudoer) 권한이 없어서 서버에서 Certbot을 실행할 수 없는 경우, 이 글에서 소개하는 방법으로 인증서 발급이 불가능합니다. (예: 웹 호스팅을 사용하는 경우)
이 경우, 별도의 인증용 임시 서버를 구축해서 'manual' 방식으로 도메인 인증을 해야 합니다. 하지만, 이렇게 해서 한 번 인증서를 발급 받았더라도 3개월마다 같은 방식으로 재인증을 받아야 하기 때문에 상당히 귀찮아지게 됩니다. 따라서, 서버 관리자 권한이 없는 경우 Let's Encrypt 서비스를 사용할 지 여부를 잘 생각해 봐야 합니다.
(도메인이 연결된 DNS 레코드가 인증용 임시 서버를 가리키도록 잠시 변경했다가 인증 완료 후 다시 되돌리는 방식으로 자동 갱신 스크립트를 작성하는 방법도 생각해 볼 수는 있긴 합니다.. 다만, 이런 방식으로 자동 인증을 할 수 있을 정도의 환경(+실력)이라면, 차라리 웹 서버를 직접 구축하는 편이 속편할것이라는게 저의 판단입니다.)

 

Certbot 설치하기

Let's Encrypt 서비스를 이용하기 위해서는 우선 인증서 관리 프로그램인 Certbot을 설치해야 합니다. Certbot은 OS 환경별로 패키지 관리 도구(apt-get, yum, etc)를 이용하여 자동 설치를 하거나, 수동으로 스크립트를 다운받아서 설치할 수 있습니다.

→ 다음 둘 중 한가지 방법을 선택해서 Certbot을 설치하도록 합니다.

ⅰ) 자동 설치

https://certbot.eff.org에 접속해서 사용중인 웹 서버와 운영체제를 선택하면 자세한 설치 절차를 안내받을 수 있습니다.

certbot-main.png
▲ Certbot 홈페이지

ⅱ) 수동 설치

이것저것 설치해야 하는 과정이 별로 마음에 안 든다면, 다음과 같이 Certbot-auto를 직접 다운받아서 사용해도 됩니다. (참고로, 제가 썼던 방법입니다.)

wget https://dl.eff.org/certbot-auto -o certbot
chmod +x ./certbot
./certbot --help

마지막 줄을 실행하는 이유는 시스템 환경에 맞도록 필요한 절차를 수행하기 위함입니다. 환경에 따라 필요한 패키지를 다운받아서 설치하고, 필요한 디렉토리들을 생성해 줍니다.

 

도메인 소유자 인증 절차를 위한 준비하기

이전 글에서 언급했듯이, 공인 발급 기관으로부터 TLS 인증서를 발급받기 위해서는 우선 자신이 도메인의 실소유주임을 인증하는 절차를 거쳐야 합니다. Certbot에서는 여러가지 도메인 인증 방법을 제공하지만, 결국 그 근본 원리는 모두 같습니다.

이게 대체 무슨 소리인지, 왜 꼴랑(?) 보안 서버 하나 구축하는데 이런 귀찮은 절차를 거쳐야 하는지 이해가 되지 않는다면, 여기를 먼저 읽고 와 주세요.ㅎㅎ

여기에서는 여러 인증 방법중 가장 많이 사용되는 StandaloneWebroot 방식 두 가지에 대해 다루도록 하겠습니다. 역시, 두 방법중 한가지를 선택해서 진행하면 되겠습니다. 이 두 방식의 동작 원리와 장단점에 대해 간략히 설명하면 다음과 같습니다.

ⅰ) Standalone 방식의 도메인 인증을 위한 준비

Certbot이 위한 간이 웹 서버를 돌려서 Let's Encrypt 서버로부터 오는 도메인 인증 요청을 직접 받아서 처리하는 방식입니다.

인증을 위해 별다른 설정이 필요 없어서 가장 간단하다는 장정이 있지만, 인증할 때마다 운영중인 웹 서버를 잠시 Shutdown해야 햐는 문제가 있습니다. 이는 인증용 간이 웹서버가 80 또는 443번 포트에 붙어서 동작하기 때문입니다. (다만, 운영중인 웹서버가 80, 443번 외에 다른 포트만 사용한다면, Shutdown 하지 않아도 됩니다.)

ⅱ) Webroot 방식의 도메인 인증을 위한 준비

인증을 위한 Challenge Seed를 외부에서 접근 가능한 미리 약속된 경로(/.well-known)에 위치시킨 뒤, Let's Encrypt 서버가 해당 경로로 접속해 인증에 필요한 정보를 읽어갑니다.

Standalone 방식에 비해, 웹 서버의 Shutdown 없이 운용중인 상태에서 인증을 진행할 수 있다는 장점이 있으며, 소켓 통신(ProxyPass)으로 동작하는 가상 호스트의 경우에도 적용 가능합니다. 이 방식으로 인증을 진행하려면 ① 서버의 파일시스템 내에 웹에서 접근 가능한 디렉토리(Web root)를 생성하고, ② 외부에서 HTTP(S)로 접근 가능하도록 웹 서버를 설정해야 합니다.

이렇게 하지 않고 가상 호스트의 실제 웹 문서가 위치하는 디렉토리를 Web root로 사용해도 되지만, 그러면 인증서를 발급받을 때 도메인별로 일일이 서로 다른 Web root를 지정해 줘야 하는 번거로움이 있습니다.

▶ 여기서는 /var/www/certbot 디렉토리를 WebRoot로 설정해 보도록 하겠습니다.

먼저, 디렉토리를 생성하고 웹 서버만 접근 가능하도록 소유자와 권한을 바꿔 줍니다.

mkdir /var/www/certbot
chown nginx:nginx /var/www/certbot
chmod 700 /var/www/certbot

SELinux가 돌고 있는 경우(esp. CentOS/RHEL), 웹 서버가 디렉토리의 내용을 읽을 수 있도록 보안 문맥을 변경해 주도록 합니다.

chcon -t httpd_sys_content_t /var/www/certbot

다음으로, 사용하고 있는 웹 서버 설정파일을 수정해서 가상 호스트의 /.well-known URI가 위의 WebRoot 디렉토리를 가리키도록 설정하면 됩니다. Nginx 웹 서버를 사용하고 있는 경우, Nginx 설정파일의 server {...} 블록에 다음 구문을 추가해 주도록 합니다.

location /.well-known {
    root /var/www/certbot-webroot/;
}

마지막으로 웹 서버를 재시작해서 인증서를 발급받기 위한 준비를 마치도록 합니다.

 

신규 인증서 발급받기

다음 둘 중 한가지 방법으로 신규 인증서를 발급받을 수 있습니다.

ⅰ) Standalone 방식

운용 중인 웹 서버를 잠시 Shutdown하고 다음 명령을 실행합니다.

certbot certonly --cert-name <인증서_이름> --standalone -d <도메인1>,<도메인2>,...,<도메인n>

예) 다음 명령은 Nginx 웹 서버를 사용하는 서버에서 tuwlab.com, www.tuwlab.com 두 개의 도메인에 대한 TLS 인증서를 Standalone 도메인 인증 방식으로 발급받아 tuwlab-cert라는 이름으로 저장합니다.

sudo service nginx stop
sudo certbot certonly --cert-name tuwlab-cert --standalone -d tuwlab.com,www.tuwlab.com
sudo service nginx start

ⅱ) Webroot 방식

웹 서버가 돌고 있는 상태에서 다음 명령을 실행합니다.

certbot certonly --cert-name <인증서_이름> --webroot -w <WebRoot_디렉토리> -d <도메인1>,<도메인2>,...,<도메인n>

예) 다음 명령은 /var/www/certbot 디렉토리를 Webroot로 활용하여 tuwlab.com, www.tuwlab.com 두 개의 도메인에 대한 TLS 인증서를 Webroot 도메인 인증 방식으로 발급받아 tuwlab-cert라는 이름으로 저장합니다.

certbot certonly --cert-name <인증서_이름> --webroot -w /var/www/certbot -d tuwlab.com,www.tuwlab.com

 

인증서 설치하기

Certbot으로 발급받은 인증서 목록은 다음 명령으로 확인할 수 있습니다.

certbot certificates

잠시 기다리면 다음과 같은 내용이 나타날 것입니다. 인증서 이름과 대상 도메인, 만료일, 그리고 가장 중요한 정보인 저장된 경로를 확인할 수 있습니다.

---------------------------------------------------------------
Found the following certs:
  Certificate Name: yourdomain.com
    Domains: yourdomain.com www.yourdomain.com
    Expiry Date: YYYY-MM-DD mm:ii:ss+00:00 (VALID: NN days)
    Certificate Path: /path/to/fullchain.pem
    Private Key Path: /path/to/privkey.pem
---------------------------------------------------------------

참고로, 인증서의 실제 파일은 다른 위치에 있고, 위 경로는 심볼릭 링크 파일입니다. 인증서를 갱신하더라도 링크 파일의 경로는 바뀌지 않으므로 매번 웹 서버 설정파일을 수정해주지 않아도 되므로 편리합니다.

Nginx 웹 서버에 인증서 설치하기

Nginx 설정 파일의 server {...} 블록에 다음 구문을 추가해 주도록 합니다.

ssl on;
ssl_certificate {Certificate Path};
ssl_certificate_key {Private Key Path};

Certbot을 설치할 때 별다른 설정을 하지 않았다면, 경로는 다음과 같을 것입니다. {인증서 이름}은 위의 인증서 목록 출력에서 Certificate Name에 해당합니다.

  • Certificate Path: /etc/letsencrypt/live/{인증서 이름}/fullchain.pem
  • Private Key Path: /etc/letsencrypt/live/{인증서 이름}/privkey.pem

Nginx에서 SSL이 올바르게 동작하도록 하려면 위 세 줄 외에 프로토콜이나 Cipher Suite 옵션도 함께 설정해 줘야 합니다. 더 자세한 설명은 이 글을 참조해 주세요.

Apache 웹 서버에 인증서 설치하기

Apache에 TLS 인증서를 설치하는 방법은 이 글을 참조해 주세요.

 

인증서 갱신하기

인증서의 유통기한(?)이 다가오면 인증서를 갱신(Renew)해야 합니다. 사이트에 찾아오는 방문객에게 보안경고창을 보여주기 싫다면 말이죠.ㅎㅎ

Certbot은 그간 발급된 인증서 목록과 사용했던 도메인 인증 방식을 별도 데이터로 보관하고 있으므로, 단순히 다음 명령으로 인증서를 갱신할 수 있습니다. 단, 유효기간이 20일 미만으로 남은 인증서에 대해서만 갱신이 이루어집니다. 또한, Standalone 방식으로 발급받은 인증서를 갱신하려면 역시 웹 서버를 먼저 Shutdown해야 합니다.

certbot renew

인증서의 잔여 유효기간에 관계 없이 갱신을 하려면 다음과 같이 --force-renewal 옵션을 추가해주면 됩니다.

certbot renew --force-renewal

Crontab에 등록해서 자동 갱신을 수행하려는 목적으로 스크립트를 작성하는 경우, 임의로 업데이트를 수행하지 않도록 다음과 같이 --no-self-upgrade 옵션을 추가해 줘야 합니다. 이 옵션이 없으면 Linux Repository(apt-get, yum 등)로부터 업데이트 패키지를 설치하려고 시도하는데, 이 때 사용자 입력을 받을 수 없으므로 스크립트 실행이 중단됩니다.

certbot renew --no-self-upgrade

 

인증서에 포함된 도메인 변경하기

다음 명령으로 인증서가 커버하는 도메인을 첨삭할 수 있습니다.

certbot certonly --cert-name {인증서 이름} -d {도메인1},{도메인2},....{도메인n}

 

인증서 삭제하기

인증서가 더 이상 필요 없어서 삭제하려는 경우, 다음 명령으로 삭제할 수 있습니다.

certbot delete --cert-name {인증서 이름}

※ 주의: 보안 사고 등으로 인해 비밀키가 유출되어 인증서를 교체하려는 경우, 기존 인증서를 삭제하기 전에 Revoke를 먼저 수행해 줘야 안전합니다. Revoke 방법은 공식 매뉴얼의 'Revoking certificates' 항목을 참조해 주세요.

 

※ Webroot 방식을 썼더라도 인증서 갱신이나 도메인 변경 등의 작업을 수행한 후에는 웹 서버를 재시작(nginx restart) 해 줘야만 변경사항이 반영됩니다. 자동화 스크립트를 만들 때 빠뜨리기 쉬운 절차이므로 유의하세요!

 


Articles

1 2 3 4 5 6 7