Lighttpd 웹서버에 Let's Encrypt 무료 서버인증서 설치 및 Crontab으로 SSL 서버인증서 자동 갱신하기
써트봇 설치 후 써트봇으로 인증서를 발급받아서 Lighttpd 웹서버에 설정하는 방법에 대한 안내가 없어서 Lighttpd 웹서버를 사용할 때 무료 인증서 발급 및 설정하는 가이드를 올립니다.
다른 웹서버의 써트봇을 이용한 설정 안내는 써드봇 웹사이트에서 찾을 수 있습니다.
리눅스에서는 써트봇을 통해 도메인 무료 인증서를 받급받을 수 있습니다.
패키지는 공통적으로 certbot으로 배포가 됩니다.
우분투 기준으로는 다음 명령어로 써트봇을 설치할 수 있습니다.
써트봇을 설치한 후에는 써트봇 커맨드 명령어로 간단하게 무료 도메인 인증서를 발급받을 수 있습니다.
sudo apt-get install certbot
무료로 SSL 인증서를 발급 받는 방법에 대한 기본 안내는 다음 글을 참고하면 됩니다.
> 무료 SSL 보안 인증서 발급받기 (Free SSL Certificate)
우분투를 기준으로 설명합니다.
다른 리눅스 배포판도 설정 방법은 대동소이합니다.
웹서버에 따라 웹서버 설정 환경 파일 부분만 다르게 설정하면 되므로 각 웹 서버별 웹 서버 환경설정은 써트봇 가이드나 해당 웹서버 설정 안내를 참고하면 됩니다.
써트봇으로 무료 인증서 발급
먼저 써트봇으로 서버 인증서를 발급 받습니다.
mydomain.com 은 실제로 사용하는 도메인으로 변경해서 사용하면 됩니다.
/home/mydomain/wwwroot 경로는 인증서를 적용할 웹사이트 루트 경로입니다.
-d 뒤에는 도메인 명을 입력합니다.
sudo certbot --webroot -w /home/mydomain/wwwroot certonly -d mydomain.com
하나의 인증서로 여러 개의 도메인에 대한 인증서를 한꺼번에 받으려면(하나의 웹사이트에 여러 도메인을 설정한 경우) 다음과 같이 추가로 -d 옵션과 도메인을 표기해서 인증서에 도메인을 추가할 수 있습니다.
인증서를 발급 받는 기본 도메인이 맨 앞에 있는 도메인이 됩니다.
sudo certbot --webroot -w /home/mydomain/wwwroot certonly -d mydomain.com -d mydomain.co.kr
도메인은 반드시 실제 웹 서버의 웹사이트 루트 경로를 가리키고 있어야 합니다. 아니며 인증서가 발급되지 않습니다.
멀티 도메인 인증서를 발급받을 경우 반드시 모든 도메인이 실제 경로를 가리키고 있어야 합니다.
에러 메시지 없이 인증서가 발급되었으면 인증서 파일 2개를 하나로 합쳐야 합니다.
다음 경로로 이동해서 인증서가 정상적으로 링크되었는지 확인합니다.
/etc/letsencrypt/live/mydomain.com
root@ifinite-101632:/etc/letsencrypt/live/mydomain.com# ls -al
total 16
drwxr-xr-x 2 root root 4096 Oct 2 20:55 .
drwx------ 5 root root 4096 Jul 30 18:20 ..
-rw-r--r-- 1 root root 692 Jun 15 2020 README
lrwxrwxrwx 1 root root 36 Oct 2 20:55 cert.pem -> ../../archive/mydomain.com/cert8.pem
lrwxrwxrwx 1 root root 37 Oct 2 20:55 chain.pem -> ../../archive/mydomain.com/chain8.pem
lrwxrwxrwx 1 root root 41 Oct 2 20:55 fullchain.pem -> ../../archive/mydomain.com/fullchain8.pem
lrwxrwxrwx 1 root root 39 Oct 2 20:55 privkey.pem -> ../../archive/mydomain.com/privkey8.pem
-rw-r--r-- 1 root root 3554 Oct 2 21:00 web.pem
root@mfinite-101632:/etc/letsencrypt/live/mydomain.com# crontab -e
crontab: installing new crontab
root@mfinite-101632:/etc/letsencrypt/live/mydomain.com#
인증서 파일 합치기
인증서 파일 2개를 하나로 합치는 작업을 해야 합니다.
우리가 합칠 파일은 privkey.pem과 cert.pem파일입니다.
다음 명령어를 실행해서 인증서 파일을 하나로 합칩니다.
sudo cat /etc/letsencrypt/live/mydomain.com/privkey.pem /etc/letsencrypt/live/mydomain/cert.pem > /etc/letsencrypt/live/mydomain.com/web.pem
합친 인증서 파일이 있는지 확인한 후 웹서버에 적용하는 과정을 진행하면 됩니다.
Lighttpd 에 SSL 설정 후 이 파일이 없으면 Lighttpd 웹서버가 실행되지 않습니다.
/etc/letsencrypt/live/ 폴더의 인증서 파일은 항상 고정된 이름을 가지며 실제 생성된 인증서 파일의 링크 파일입니다.
실제 발급된 인증서 파일은 다음 경로에 만들어지며, 심볼릭 링크로 파일명 변경 없이 사용할 수 있도록 live 폴더에 링크가 제공되는 것입니다.
/etc/letsencrypt/archive/mydomain.com
인증서 파일은 다음과 같이 일련번호가 붙어서 차례로 생성됩니다.
인증서를 새로 발급받으면 live 폴더의 링크가 자동으로 최신 파일로 바뀌므로 archive 폴더의 파일을 신경 쓸 필요는 없습니다.
다만, 새 인증서가 잘 발급되었는지 확인하려면 archive 폴더의 인증서 파일의 시간을 확인하면 됩니다.
root@ifinite-101632:/etc/letsencrypt/archive/mydomain.com# ls -al
total 144
drwxr-xr-x 2 root root 4096 Oct 2 20:55 .
drwx------ 4 root root 4096 Jul 30 18:20 ..
-rw-r--r-- 1 root root 1903 Jun 15 2020 cert1.pem
-rw-r--r-- 1 root root 1903 Aug 14 2020 cert2.pem
-rw-r--r-- 1 root root 1907 Sep 16 2020 cert3.pem
-rw-r--r-- 1 root root 1915 Nov 11 2020 cert4.pem
-rw-r--r-- 1 root root 1850 Jan 20 2021 cert5.pem
-rw-r--r-- 1 root root 1850 Mar 21 2021 cert6.pem
-rw-r--r-- 1 root root 1850 May 21 00:00 cert7.pem
-rw-r--r-- 1 root root 1850 Oct 2 20:55 cert8.pem
-rw-r--r-- 1 root root 1647 Jun 15 2020 chain1.pem
-rw-r--r-- 1 root root 1647 Aug 14 2020 chain2.pem
-rw-r--r-- 1 root root 1647 Sep 16 2020 chain3.pem
-rw-r--r-- 1 root root 1647 Nov 11 2020 chain4.pem
-rw-r--r-- 1 root root 1586 Jan 20 2021 chain5.pem
-rw-r--r-- 1 root root 1586 Mar 21 2021 chain6.pem
-rw-r--r-- 1 root root 3750 May 21 00:00 chain7.pem
-rw-r--r-- 1 root root 3750 Oct 2 20:55 chain8.pem
-rw-r--r-- 1 root root 3550 Jun 15 2020 fullchain1.pem
-rw-r--r-- 1 root root 3550 Aug 14 2020 fullchain2.pem
-rw-r--r-- 1 root root 3554 Sep 16 2020 fullchain3.pem
-rw-r--r-- 1 root root 3562 Nov 11 2020 fullchain4.pem
-rw-r--r-- 1 root root 3436 Jan 20 2021 fullchain5.pem
-rw-r--r-- 1 root root 3436 Mar 21 2021 fullchain6.pem
-rw-r--r-- 1 root root 5600 May 21 00:00 fullchain7.pem
-rw-r--r-- 1 root root 5600 Oct 2 20:55 fullchain8.pem
-rw------- 1 root root 1704 Jun 15 2020 privkey1.pem
-rw------- 1 root root 1704 Aug 14 2020 privkey2.pem
-rw------- 1 root root 1704 Sep 16 2020 privkey3.pem
-rw------- 1 root root 1704 Nov 11 2020 privkey4.pem
-rw------- 1 root root 1704 Jan 20 2021 privkey5.pem
-rw------- 1 root root 1704 Mar 21 2021 privkey6.pem
-rw------- 1 root root 1708 May 21 00:00 privkey7.pem
-rw------- 1 root root 1704 Oct 2 20:55 privkey8.pem
root@mfinite-101632:/etc/letsencrypt/archive/mydomain.com#
발급받은 인증서는 3개월간 유효합니다. 이후 인증서를 갱신해야 할 때 정상적으로 갱신이 진행되는지 확인하려면
sudo certbot renew --dry-run
을 실행해서 테스트를 해볼 수 있습니다. 정상적으로 갱신이 되면 인증서를 사용할 수 있는 것입니다.
어디까지나 인증서 발급 프로세스를 테스트하는 것이지 실제 인증서를 새로 발급받지는 않습니다.
Lighttpd 웹서버 인증서 적용
/etc/lighttpd/ 폴더에서 lighttpd.conf을 찾습니다.
에디터로 lighttpd.conf 파일을 엽니다.
기본 웹사이트가 1개만 있다는 경우를 예를 들어 설명합니다.
기본 80 포트 웹사이트 설정 뒤에 다음의 SSL 구성을 추가합니다.
기본 환경 설정 파일인 경우 server.port = 80 이 있는 행 밑에 추가하면 됩니다.
web.pem과 chain.pem 인증서 파일 경로를 정확하게 적어야 합니다. 앞서의 Letsencrypt 인증서가 있는 live 폴더의 경로를 사용하면 됩니다.
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/letsencrypt/live/mydomain.com/web.pem"
ssl.ca-file = "/etc/letsencrypt/live/mydomain.com/chain.pem"
server.name = "mydomain.com"
server.document-root = "/home/mydomain/wwwroot"
server.errorlog = "/var/log/lighttpd/mydomain.com_error.log"
accesslog.filename = "/var/log/lighttpd/mydomain.com_access.log"
}
크론탭 설정
크론탭 편집 화면을 엽니다.
crontab -e
로 크론 설정 에디터로 들어가서 다음과 같이 한 달에 한 번씩 인증서 갱신 및 인증서 머지 파일 생성, 그리고 웹서버 재시작을 하도록 등록합니다.
Let's Encrypt 무료 인증서는 3개월 유효한 인증서이기 때문에 주기적으로 갱신을 해야 합니다.
5 0 1 * * sudo certbot --webroot -w /home/mydomain/wwwroot certonly -d mydomain.com -d mydomain.co.kr
10 0 1 * * sudo cat /etc/letsencrypt/live/mydomain.com/privkey.pem /etc/letsencrypt/live/mydomain/cert.pem > /etc/letsencrypt/live/mydomain.com/web.pem
15 0 1 * * sudo systemctl restart lighttpd