[acme.sh]acme.sh를 사용하여 와일드 카드 인증서 발급받기 & nginx SSL 설정 & 자동 갱신 & Synology에 인증서 등록하기

0

개발지식공부

목록 보기
4/6

와일드 카드 인증서 발급

acme.sh

acme.sh 설치

일반 계정 말고 root 계정으로 설치를 권장한다. 나중에 권한 문제로 귀찮아질 수 있다.

먼저 acme.sh를 설치하는 방법은 총 3가지가 있다고 공식 사이트에서 알려주고 있다. 그 중 우리는 깃을 클론하여 설치해보도록 한다. 이와 관련한 내용은 https://github.com/acmesh-official/acme.sh 에서 확인할 수 있다.

$ git clone https://github.com/acmesh-official/acme.sh.git
$ cd ./acme.sh
$ ./acme.sh --install -m my@email.com

설치할 때 뜰 수 있는 오류로 crontab이 미리 설치되어 있어야 한다고 하거나, 소켓 설치가 권장된다고 하는데 이 중 crontab의 경우 자동 갱신을 등록할 때 사용되기 때문에 설치해야한다.

※ 설치 후, acme.sh [명령어] 이런식으로 작동하는데 만약 acme.sh 명령어를 찾을 수 없다고 뜬다면

$ source ~/.bashrc

하여 환경변수를 reload 해주어야 한다.

와일드 카드 인증서 발급

※ 현재 acme.sh가 기본 인증서를 zerossl로 두고 있는데 이러면 zerossl에 account가 존재해야지 와일드 카드 인증서를 발급받을 수 있다.

그러므로 미리 기본 인증서를 letsencrypt로 설정해두자

$ acme.sh --set-default-ca --server letsencrypt

이제 우리는 DNS 설정을 통해 인증받은 형식으로 인증서를 발급받을 예정이다.

$ acme.sh --issue --dns --force -d '도메인주소' -d '*.도메인주소' --yes-I-know-dns-manual-mode-enough-go-ahead-please --server letsencrypt

이러면 DNS 레코드에서 TXT 설정을 하라는 알림이 뜬다. 아래와 같이 도메인 관리 사이트로 가서 DNS 설정을 해준다.

발급받을 도메인이 현재 두개이므로 TXT 값을 두개를 설정해주어야 한다. 위의 그림과 같이
이름은 _acme-challenge이고 value에는 cli에서 가르쳐주는 값으로 설정해주면 된다.

설정이 완료되면

$ acme.sh --renew --dns --force -d 'shbox.kr' -d '*.shbox.kr' --yes-I-know-dns-manual-mode-enough-go-ahead-please --server letsencrypt

위의 명령어를 입력하고 인증서를 검증하는 시간을 가진다. TXT 값이 전부 설정이 완료되어 있다면 인증서가 발급된다. 해당 인증서는 ~/.acme.sh/도메인_ecc 폴더 안에 들어가 있다.

nginx에 인증서 등록

먼저 nginx 폴더 내에 ssl 폴더를 만들어준다.

$ mkdir /etc/nginx/ssl

그리고 나서 발급받은 인증서를 해당 폴더에 설치한다.

$ acme.sh --installcert -d 'shbox.kr' \
	--key-file /etc/nginx/ssl/shbox.kr.key \
	--fullchain-file /etc/nginx/ssl/shbox.kr-fullchain.cer \
	--reloadcmd "service nginx force-reload"

최종적으로 nginx에서 ssl 인증서를 등록해준다.

server {
    ...

    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/도메인-fullchain.cer;
    ssl_certificate_key /etc/nginx/ssl/도메인.key;
    include /etc/nginx/ssl/options-ssl-nginx.conf;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    ...
}

이상으로 nginx에 등록이 완료된다. 하지만 우리는 와일드카드 인증서이므로 manual하게 갱신을 할 수 밖에 없다. 그래서 자동화 과정이 필요하다.

인증서 갱신 자동화 with crontab

원하는 폴더에 쉘 스크립트 파일을 생성한다.
나같은 경우 ~/ssl_auto_renew 폴더를 생성하고 안에 renew.sh를 생성하였다.

$ mkdir ~/ssl_auto_renew
$ cd ~/ssl_auto_renew
$ vi renew.sh

다음의 명령어를 등록한다.

acme.sh --renew --dns --force -d '도메인' -d '*.도메인' --yes-I-know-dns-manual-mode-enough-go-ahead-please --server letsencrypt

acme.sh --installcert -d '도메인' \
	--key-file /etc/nginx/ssl/도메인.key \
	--fullchain-file /etc/nginx/ssl/도메인-fullchain.cer \
	--reloadcmd "service nginx force-reload"

그리고 해당 쉘 스크립트가 실행될 수 있도록

$ chmod +x renew.sh

를 해준다. 이제 crontab설정을 할 차례이다.

$ crontab -e

위의 명령어를 처음 사용하면 어떤 에디터를 사용할지 묻는데 자신이 사용하기 편한 에디터를 골라주면 된다. 나같은 경우에는 vi 에디터를 사용했다. 이후 작업을 등록할 수 있다.

0 2 1 * * /root/ssl_auto_renew/renew.sh >> /root/crontab_log.log 2>&1

매월 1일 2시에 renew.sh를 반복 실행시킨다는 의미를 가지고 있으며 뒤의 내용은 스크립트가 실행되는 로그파일을 남기기 위함이다. 혹시 오류가 날 경우 어떤 오류가 났는지 파악할 수 있다.
그리고 crontab을 적용한다.

$ service cron start

Synology 인증서 수동 갱신

Synology에서는 앞서 발급받은 인증서를 가지고 와서 수동으로 갱신할 수 있다. 자동으로 하는 방법도 존재한다고 하는데 아직 적용하지는 못했다.

아까 발급받은 인증서는 ~/.acme.sh/도메인_ecc 폴더에 존재한다.

Synology에서 DSM 제어판 > 보안 > 인증서 > 추가 or 인증서 교체를 누르고 직접 추가를 하게 되면
다음과 같이 창이 뜬다.

우리가 발급받은 인증서 폴더내에는 디렉토리를 제외하면 7개의 파일이 존재하는데 빨간색으로 가려놓은 부분은 나의 도메인이다!!


개인키 >> 도메인.key
인증서 >> 도메인.cer
중간인증서 >> ca.cer

과 같이 파일을 등록해주면 된다.

Ubuntu에서 acme.sh로 인증서를 갱신하고 Synology에 ssh로 업로드하는 과정까지 crontab으로 설정한다면 Synology에서 인증서파일을 계속 갱신받을 수 있다. 이후에 Synology 작업 스케줄러로 받은 인증서 파일을 자동으로 등록시켜줄 수 있다면 아마 Synology의 인증서를 자동 갱신할 수 있는 방법이 될 것이라 생각한다.

-> 현재 작업 스케줄러에서 업로드 받은 인증서파일을 루트 권한으로 기본 인증서 폴더로 복사 하려고 시도하고 있으나 복사가 작동하지 않는다. 그래서 방법을 발견하게 된다면 이후 게시글에서 방법을 작성해보도록 할 예정이다.

profile
최악의 환경에서 최선을 다하기

0개의 댓글