GOGUMA
Let's Encrypt 으로 와일드카드 인증서 발급하기 본문
준비물
- 수신 가능한 이메일
- 인증서를 발급하고자 하는 도메인 네임
- 그리고 그 도메인의 DNS 레코드 변경 권한
- 리눅스 혹은 Docker 가 실행 가능한 환경
발단
밤낮 가리지 않고 일하는 우리 운영팀 덕분에 업무사이트의 인증서가 만료되었음을 알았다. 메인 서비스 사이트에는 GoGetSSL 을 구매해 이용하고 있지만, 부수적으로 운영하는 도메인이 많아 인트라넷을 포함한 기타 도메인에는 Let's Encrypt
를 이용하고 있다. 간단히 소개하자면 Let's Encrypt
는 단기간(3개월)이지만 무료로 SSL 인증서를 제공해주는 서비스이다.
이번 글에서는 certbot
을 이용해 Let's Encrypt free certificate
를 발급받고 nginx
에 적용까지 해보려고 한다.
커맨드
-
certbot 설치
-
리눅스 기준이다. 도커 사용자는 바로 3번까지 건너뛰어가자.
$ sudo su - $ cd /path/to/somewhere/ $ git clone https://github.com/certbot/certbot
-
certbot
은Let's Encrypt
인증서를 cli 환경에서 발급받을 수 있는 패키지이다._
-
-
가상 작업환경 (
python virtualenv
) 설정$ cd certbot $ ./certbot-auto --os-packages-only $ ./tools/venv3.py $ source venv3/bin/activate
- 자동으로 필요한 패키지를 설치한다. 파이썬 패키지들을 설치할 때 (세번째 커맨드) 시간이 많이 걸린다.
-
인증서 발급하기
-
리눅스 사용자
$ 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\etc
와C:\Data\KKorea\cert\var
의 경로를 자신에 맞는 경로로 수정하자. 도메인의 인증서가 호스트의 디렉토리에 공유할 위치를 정하는 것이다.
-
-
도메인 인증하기
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"
-
인증서 연결하기
-
인증서는
/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
으로 심볼링크를 하나 더 생성해주었다. 환경에 맞게 설정하자.
-