Eat the ENAK

Let's Encrypt 으로 와일드카드 인증서 발급하기 본문

카테고리 없음

Let's Encrypt 으로 와일드카드 인증서 발급하기

으낙 2020. 7. 1. 03:04

준비물

  • 수신 가능한 이메일
  • 인증서를 발급하고자 하는 도메인 네임
  • 그리고 그 도메인의 DNS 레코드 변경 권한
  • 리눅스 혹은 Docker 가 실행 가능한 환경

발단

밤낮 가리지 않고 일하는 우리 운영팀 덕분에 업무사이트의 인증서가 만료되었음을 알았다. 메인 서비스 사이트에는 GoGetSSL 을 구매해 이용하고 있지만, 부수적으로 운영하는 도메인이 많아 인트라넷을 포함한 기타 도메인에는 Let's Encrypt를 이용하고 있다. 간단히 소개하자면 Let's Encrypt는 단기간(3개월)이지만 무료로 SSL 인증서를 제공해주는 서비스이다.

이번 글에서는 certbot을 이용해 Let's Encrypt free certificate를 발급받고 nginx에 적용까지 해보려고 한다.

커맨드

  1. certbot 설치

    • 리눅스 기준이다. 도커 사용자는 바로 3번까지 건너뛰어가자.

      $ sudo su -
      $ cd /path/to/somewhere/
      $ git clone https://github.com/certbot/certbot
    • certbotLet's Encrypt인증서를 cli 환경에서 발급받을 수 있는 패키지이다._

  1. 가상 작업환경 (python virtualenv) 설정

    $ cd certbot
    $ ./certbot-auto --os-packages-only
    $ ./tools/venv3.py
    $ source venv3/bin/activate
    • 자동으로 필요한 패키지를 설치한다. 파이썬 패키지들을 설치할 때 (세번째 커맨드) 시간이 많이 걸린다.
  2. 인증서 발급하기

    • 리눅스 사용자

      $ certbot certonly -d kkukowiki.kr -d kkutukorea.com -d *.kkukowiki.kr -d *.kkutukorea.com \
       --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory \
       --email foo@domain.com --agree-tos --expand --renew-by-default --manual-public-ip-logging-ok
    • 도커 사용자

      $ docker run -it --name certbot -v 'C:\Data\KKorea\cert\etc:/etc/letsencrypt' \
       -v 'C:\Data\KKorea\cert\var:/var/lib/letsencrypt' certbot/certbot certonly \
       -d kkutukorea.com -d *.kkukowiki.kr -d *.kkutukorea.com \
      --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory \
      --email foo@domain.com --agree-tos --expand --renew-by-default --manual-public-ip-logging-ok
    • 중간에 -d domain.com구문으로 도메인을 추가할 수 있다. 단, 와일드카드 도메인과 루트 도메인을 동시에 인증받기 위해서는 루트 도메인을 먼저 지정하고 후위에 와일드카드 도메인을 지정해주자. 안 그러면 도메인이 두 번 인식돼 인증 절차가 정상적으로 처리되지 않는다.

    • 도커 사용자는 필자가 지정한 C:\Data\KKorea\cert\etcC:\Data\KKorea\cert\var의 경로를 자신에 맞는 경로로 수정하자. 도메인의 인증서가 호스트의 디렉토리에 공유할 위치를 정하는 것이다.

  3. 도메인 인증하기
    Let's Encrypt에서 와일드카드 도메인에 대한 인증서를 발급받으려면 도메인의 DNS 레코드를 수정할 권한이 있어야 한다. 필자의 경우 [Cloudflare](https://cloudflare.com)을 이용하고 있다. 다른 DNS 관리 사이트들도 유사한 경로에서 DNS 레코드를 수정할 수 있을 것이다.

    인증 중간에 위와 같이 도메인의 TXT 레코드를 등록해달라는 문구를 마주하게 된다. 각자의 DNS 관리 페이지에서 해당 값을 설정해주자. 아, TTL 은 최대한 짧게 설정하자. 필자는 2분으로 설정했다.

    위와 같이 레코드를 설정해주고, 혹시 모르니 레코드가 제대로 적용됐는지 확인해보면 된다. 윈도우나 리눅스/유닉스 모두 `nslookup` 명령어가 있다. 아래 명령어로 제대로 적용됐는지 확인한 후 다시 인증 화면으로 넘어가 엔터를 눌러주자. 만약 도메인을 여러 개 등록하고 있다면 인증도 각각의 도메인별 코드가 발급된다.

    $ nslookup -q=txt _acme-challenge.yourdomain.com
    Server:  one.one.one.one
    Address:  1.1.1.1
    
    Non-authoritative answer:
    _acme-challenge.kkukowiki.kr    text =
    
        "fjmHbJCd8 .............. JEDnFg4sK8"
  4. 인증서 연결하기

    • 인증서는 /etc/letsencrypt/live/fist_domain_root_name.kr/에 있다. 앞으로 갱신해도 같은 위치에 있을 예정이니 이 경로로 심볼릭 링크를 설정해주자. 필자는 기존에 이용하던 /etc/nginx/ssl/kkukomisc/로 연결해야 했다.

      $ mv /etc/nginx/ssl/kkukomisc/ /etc/nginx/ssl/bak_kkukomisc_200630  // 백업해둔 것이다. 각자 잊지 말자
      $ ln -s /etc/letsencrypt/live/kkutukorea.com/ /etc/nginx/ssl/kkukomisc/
    • 이제 nginx 사이트 설정에서 아까 생성한 심볼릭 링크와, 인증서를 참조하는 경로가 같은지 확인하자

      $ vi /etc/nginx/conf.d/sitename.kr/
      ssl_certificate "/etc/ssl/kkukomisc/fullchain.pem";
      ssl_certificate "/etc/ssl/kkukomisc/privkey.pem";
    • 필자는 원래 설정이 privatekey.pem을 참고하게 되어있어서 privkey.pem -> privatekey.pem 으로 심볼링크를 하나 더 생성해주었다. 환경에 맞게 설정하자.

Comments