무료 SSL 인증서 발급 (Let’s Encrypt)

HTTPS (SSL)통신을 위해서는 WebServer에 적용할 인증서가 필요하다. Let’s Encrypt는 CA(Certificate Authority)기관으로 무료로 인증서를 제공해주고 있다. 인증만료일은 3개월(90일)이지만 자동으로 재갱신을 설정할 수 있어서 오히려 보안적으로 더 좋다고 할 수 있다.

실제 여기 블로그에 사용하는 인증서도 blog.hapinus.com 도메인으로 받은 Let’s Encrypt인증서이다. 현재는 Wildcard(*)인증서 발급도 가능하고 훨씬 간편해진 방법을 제공하고 있어 홈페이지를 운영하고 있다면 적용해볼만 하다.

blog.hapinus.com 인증서 내용

CertBot 설치

Let’s Encrypt에서는 ACME프로토콜을 이용하여 Domain 이름을 확인하고 인증서를 발급 할 수 있도록 지원하고 있다. 따라서 ACME프로토콜을 지원하는 다양한 클라이언트에서 인증서를 발급받을 수는 있지만 CertBot을 이용하여 발급받는 것을 권장하고 있어 CertBot을 설치했다.

[URL: https://certbot.eff.org]
사이트에 접속해보면 자신이 실행하고 있는 Software와 System에 따라 최적의 설치 방법을 보여준다.

여기 블로그에 적용한 환경은
OS: Ubuntu 18.04.3 LTS
Web server: Nginx

# Certbot PPA(저장소) 추가
apt-get update
apt-get install software-properties-common
apt-add-repository universe
apt-add-repository ppa:certbot/certbot
apt-get update
apt-get upgrade

# Certbot 설치
apt-get install certbot python3-certbot-nginx

SSL 인증서 발급

아래와 같은 명령어를 통해서 인증서를 발급 받을 수 있으며, 인증서 발급 중에 실제 도메인 주인이 맞는지 확인하는 절차를 거치게 된다. 크게 Webroot방식, Standalone방식, DNS방식이 있다.

Webroot 방식

실제 사용중인 웹 서버에 특정 파일을 쓰는(접근) 작업을 할 수 있는지로 인증하는 방식으로 단 한번에 하나의 도메인만 발급 가능하다.
certbot 명령어에 –webroot 옵션을 붙이면 적용된다.

[인증 미션]
http://요청도메인/.well-known/acme-challenge/GUID 로 접근하면 요청하는 값을 출력하도록 WebServer에 가상디렉토리를 만들고 파일을 올려야 함

[배포 확인]
해당 URL로 접근했을 때, 요청한 값이 출력되면 정상적으로 등록된 것


Standalone

Certbot에서 80port의 Standalone webserver 를 별도로 띄워 인증서를 발급받는 방식으로 일시적으로 nginx서비스를 내렸다 올려야한다.
certbot 명령에 certonly –standalone 옵션을 붙이면 적용된다.


DNS

Domain에 TXT레코드를 추가하여 해당 도메인의 정상 인가자임을 확인하여 인증서를 발급하는 방식으로 wildcard인증서를 발급받을 수 있다.
certbot 명령에 ceronly –manual –preferred-challenges dns 옵션을 붙이면 적용된다.

[인증 미션]
요청도메인의 TXT레코드에 내용을 추가하고 배포되면 인증받는 형태임
_acme-challenge IN TXT “GUID

[배포 확인]
nslookup
set q=txt
_acme-challenge.요청도메인 실행 시, GUID가 나오면 배포된 것

# 받고자 하는 Sub Domain 명을 -d 인수를 이용하여 추가하여 발급
certbot --nginx -d hapinus.com -d www.hapinus.com -d blog.hapinus.com

# Wildcard 인증서를 받고자 한다면 아래와 같이 발급
certbot --nginx -d *.hapinus.com

# 서버에 적용하지 않고 인증서만 받고자하면 certonly옵션을 사용하여 발급
# Nginx서버 설정을 수동으로 할 경우 적용
certbot certonly -d [domain명]

SSL 인증서는 /etc/letsencrypt/live/도메인명에서 확인할 수 있는데, ls -al로 보면 심볼릭 링크임을 확인할 수 있고 원본은 /etc/letsencrypt/archive/도메인명에 있음을 알 수 있다. 이는 자동 갱신을 하게되면 archive에는 새로운 파일1그래서 원본 파일 뒤에 숫자를 통해 몇번 재갱신됬는지 알 수 있다.이 생기고 심볼릭 링크로 live디렉토리에 유지함으로써 nginx Site환경설정을 변경할 필요없이 유지 하지 위함이다.

--nignx 옵션을 사용하는 경우, 자동으로 nignx설정을 변경하므로 사전에 nignx환경을 백업해두기를 권장한다. (certbot --nginx rollback을 사용하여 환경구성을 되돌릴 수 있다고는 하지만…)

Nginx에 SSL적용

자동으로 배포햇으면 정상적으로 Nginx 설정이 바뀌어 있겠지만, 확인하는 차원에서 정리해보고자한다. 일단 위에서 발급받은 SSL은 /etc/nginx/site-enabled/적용한사이트명 설정을 바꾸어 놓았을 것이다. 해당 파일을 VIM등으로 열어서 보면 managed by Certbot이라는 주석이 달려서 자동 추가된 것을 확인할 수 있다.

listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/blog.hapinus.com/fullchain.pem;
ssl_certificate_key /etc/ketsencrypt/live/blog.hapinus.com/privkey.pem;
include /etc/letsencrypt/iptions-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

server {
    if ($host = blog.hapinus.com) {
        return 301 https://$host$request_uri;
    }

    listen 80 default_server;
    listen [::]:80 default_server;
  
    server_name blog.hapinus.com;
    return 404;
}

자동 갱신 설정

Ubuntu에서는 crontab을 통해서 스케줄링을 걸어 원하는 script나 작업 프로그램을 실행시켜줄 수 있다. 그렇기 때문에 crontab을 이용하면 certbot을 등록하여 주기적으로 자동 갱신을 할 수 있도록 하면 신경쓰지 않고 SSL인증서를 무료로 사용하게 된다. 2갱신명령을 자주돌려도 인증서 유효기간이 1달이상 남으면 갱신되지 않으니 너무 자주 갱신될까 고민하지 않아도 된다.

/etc/crontab 파일을 열어보면 기본적으로 cron.hourly, cron.daily, cron.weekly, cron.monthly라 등록되어 있음을 알 수 있다. 일단 crontab에 추가하기 전에 /etc/cron.d/certbot파일이 이미 있는지 확인하자.

cron.d는 deamon파일명으로 추가되며, certbot파일이 있다면 cerbot을 위한 스케쥴러가 이미 등록되어있다고 보면되여 crontab에 추가할 필요가 없다.

# blog.hapinus.com의 /etc/corn.d/certbot에 등록된 내용
# 매 12시간 정각마다 실행
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

말이 나온 김에 Crontab을 조금 정리해 보면

# 분(0-59)  시간(0-23)  일(1-31)  월(1-12)  요일(0-7)

# 특정 Date에 {user}권한으로 {script}실행 (30분 4시 매일 매월 일요일 = 매주 일요일 4:30에 실행)
30 4 * * 7 {user} {script}

# 반복 {user}권한으로 {script} 실행 (0,20,40분 매시 매일 매월 매요일 = 20분마다 실행) 
0,20,40 * * * * {user} {script}

# 범위 {user}권한으로 {script} 실행 (0분 1시~5시 매일 매월 매요일 = 1시부터 5시 정각마다 실행)
0 1-5 * * * {user} {script}

# 간격 {user}권한으로 {script} 실행 (0분 12시간마다 매일 매월 매요일 = 12시간 정각마다 실행)
0 */12 * * * {user} {script}
Certbot certonly로 SSL인증서를 생성하면 기본적으로 /etc/letsencrypt/archive/도메인명 위치에 개인키, 인증서, 체인인증서 등 모두 PEM파일로 되어 있는 것을 알 수 있다. Windows IIS에서는 PFX가 사용되며 각 Application마다 요구하는 인증서 형태가 틀리기 때문에 그런 경우에는 인증서 변환을 통해서 서비스 가능하다. 
[인증서 변환 방법 보러가기]

Leave a Comment

Your email address will not be published. Required fields are marked *