letsencrypt 인증서 발급/갱신
letencrypt 는 무료로 발급 받을 수 있는 도메인 인증서이다. 도메인 인증서는 서버와 클라이언트간에 HTTP 통신을 암호화하는데 필요한 것이다. 원래는 돈을 주고 구매해야 하지만 letsencrypt 는 무료로 사용할 수 있게 해준다.
대부분의 발급 절차를 서버의 CLI 를 통해서 이루어진다. 따라서 서버가 있어야 하며 터미널 접속이 가능해야 한다. 또, Python 을 필요로 한다. 인증서를 발급 받기위해서 프로그램을 사용하는데 이것이 Python 을 필요로 한다.
certbot 설치
certbot 은 letsencrypt 인증서를 발급받기 위한 CLI 명령어 세트다. 다음과 같이 다운로드 할 수 있다.
1 2 3 |
]$ git clone https://github.com/letsencrypt/letsencrypt ]$ ls letsencrypt |
복제된 디렉토리에는 letsencrypt 인증서를 위한 모든 내용이 포함되어 있다.
주도메인, 멀티도메인
발급 받기전에 한가지 생각해봐야 할게 있다. 인증서는 주도메인 인증서와 멀티도메인 인증서로 크게 나뉜다. 예를들면 다음과 같다.
- systemv.pe.kr – 주도메인 인증서
- *.systemv.pe.kr – 멀티도메인 인증서
많은 사람들이 실수하는 것이 멀티도메인 인증서를 발급받고 systemv.pe.kr 도메인으로 접속할려고 한다는 것이다. 멀티도메인 인증서의 *. 이것이 주도메인을 포함하지 않는다. 따라서 반드시 따로 도메인 인증서를 발급 받아야 한다.
수동 도메인 인증서 발급
도메인 인증서를 발급 받를때에 해줘야 하는 거이 Validation 이다. 이것이 실제로 인증서를 사용 가능한 발급요청인지를 체크한다. 이 체크를 위한 방법은 두가지가 있다.
- DNS TXT 레코드를 이용.
- HTTP 를 이용한 특정 디렉토리에 파일 접근.
멀티 도메인 인증서를 발급 받을때는 DNS TXT 레코드를 이용하는 방법이 좋다. 주도메인(단일도메인) 을 발급 받을때는 HTTP 를 이용한 파일 접근으로 유요한 요청인지를 인증하면 된다.
발급을 위해서 시스템의 슈퍼유저 계정으로 실행 한다.
1 2 3 4 5 6 7 8 9 10 11 |
]# ./certbot-auto --server https://acme-v02.api.letsencrypt.org/directory -d "systemv.pe.kr" --manual --preferred-challenges http certonly ... Create a file containing just this data: YRUCqKBZhmN_0tnXMpTzewAV2sg4Gyi7tMqa_fJKUT8.VmFPdf83 And make it available on your web server at this URL: http://systemv.pe.kr/.well-known/acme-challenge/YRUCqKBZhmN_0tnXMpTzewAV2sg4Gyi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
위와같이 특정 디렉토리에 외부에서 접근 가능한 파일을 작성해 위에서 출력한 데이터를 작성하고 저장한다. 이렇게 한 후에 진행을 하면 Letsencrypt 에서 파일에 접근해 유요한 요청인지를 확인하고 인증서를 발급해 준다.
멀티도메인처럼 하나의 인증서로 여러 도메인을 인증하기 위해선 DNS TXT 레코드 인증을 이용하는 것이 편하다.
1 2 |
]# ./certbot-auto --server https://acme-v02.api.letsencrypt.org/directory -d "*.systemv.pe.kr" --manual --preferred-challenges dns-01 certonly ... |
위와같이 하면 화면에 TXT 레코드를 입력하라는 메시지가 나온다. 그것을 다음과 같이 DNS 에 입력해 준다.
1 |
_acme-challenge 1 IN TXT "EOk_ZkeE4MVHX0dJLt9O-HgstDrE3" |
_acme-challenge.systemv.pe.kr 도메인으로 하는 TXT 를 입력해 주는 것이다. 그리고 반드시 DNS 서버를 재시작해 적용해 준다.
정상적으로 발급이 되었다면 /etc/letsencrypt/live 디렉토리에 도메인으로 디렉토리가 생성되고 인증서가 발급된다.
2022-02 내용추가
Lets Encrypt 관련해 내용이 변경되었다. 인증서를 적용하기 위한 절차는 다음과 같다.
letsencrypt 업데이트
git 로 소스를 복제했다면 시간이 지남에 따라 최신 소스가 달라진다. 다음과 같이 최신판으로 업데이트를 해준다.
1 2 |
]# cd letsencrypt ]# git pull |
한번에 멀티 도메인 인증서 발급
나는 DNS 서버를 별도로 운영하고 있다. 따라서 DNS TXT 필드를 이용해서 인증서 설정이 가능하다. 다음과 같이 하면 된다.
1 2 3 |
]# pwd /root/letsencrypt/letsencrypt-auto-source ]# ./letsencrypt-auto --server https://acme-v02.api.letsencrypt.org/directory -d "systemv.pe.kr" -d "*.systemv.pe.kr" --manual --preferred-challenges dns-01 certonly |
대상 도메인에 대해서, 위 경우에는 두개(systemv.pe.kr, *.systemv.pe.kr), DNS TXT 를 발급해 준다. 그러면 그것을 zone 파일에서 DNS TXT 에 적용해주고 DNS 서버를 재시작 해준다.
그리고 letsencrypt 의 Verify 를 해주면 적용 된다.
2023.01 변경사항
이제는 letencrypt-auto 스크립트도 더 이상 이용할 수 없다.
1 2 3 4 5 |
]# ./letsencrypt-auto --server https://acme-v02.api.letsencrypt.org/directory -d "systemv.pe.kr" -d "*.systemv.pe.kr" --manual --preferred-challenges dns-01 certonly Skipping bootstrap because certbot-auto is deprecated on this system. Your system is not supported by certbot-auto anymore. Certbot cannot be installed. Please visit https://certbot.eff.org/ to check for other alternatives. |
위와같이 메시지를 내면서 실행되지 않는다. 검색을 해보면 snapd 를 설치해서 실행하는 방법을 소개하고 있지만, snapd 를 설치한다고 하더라도 letencrypt-auto 스크립트를 사용하는 것은 아니다.
letencrypt-auto 대신에 certbot 명령어를 이용하면 된다. 이 명령어를 이용하기 위해서는 Python 을 이용해서 설치를 해줘야 하는데 letencrypt 를 git 클론하면 들어있다. 설치하고 실행을 하면 의존성 패키지가 없다는 메시지가 나오는데 함께 설치해주면 된다. 20.04 LTS, Python 3.8 에서 정상적으로 동작했다.
1 |
]# certbot --server https://acme-v02.api.letsencrypt.org/directory -d "systemv.pe.kr" -d "*.systemv.pe.kr" --manual --preferred-challenges dns-01 certonly |
자동갱신 스크립트를 이용해서 3개월에 한번 자동으로 갱신되도록 할 수 있지만, 개인적으로 갱신 알람 메일이 오고 그것을 확인하고 수동으로 하는 방법을 선호하는데, 자동갱신을 하게 되면 이래저래 관련 명령어를 까먹게 되어서 자동갱신을 하진 않았다.