Let's encrypt & certbot으로 인증서 자동 갱신하기 + 도커
nginx, Linux(Ubuntu 22.04), docker 환경 기준으로 작성된 글입니다.
Let's encrypt?
무료로 SSL/TLS 인증서를 발급해 주는 공인 인증 기관(Certificate Authority, CA)이다.
발급은 ACME(Automatic Certificate Management Environment) 프로토콜을 통해 이루어진다.
ACME 프로토콜은 SSL/TLS 인증서 발급 및 갱신을 자동화하기 위해 만들어진 표준 프로토콜이다.
Let's encrypt와 ISRG(Internet Security Research Group)가 주도하여 표준화했다.
복잡하고 수동적인 인증서 발급 및 갱신을 자동화하여 HTTPS 보급을 쉽게 하도록 돕는다.
더 자세한 정보는 아래에서!
[Let's encrypt] Chains of Trust
[Medium] Key Kim - Let’s encrypt로 만든 인증서 살펴보기
Certbot?
Let's Encrypt에서 인증서를 발급받고 관리할 수 있도록 만들어진 클라이언트 프로그램
인증서 발급 및 갱신을 자동화할 수 있도록 도와주며, nginx나 apache와 같은 웹서버에 적용까지 해준다.
공인 SSL 발급기관(DigiCert 등)과의 차이
공인 발급기관은 인증서 유형이 다양하고,(Organization Validation, Extended Validation) 신뢰성이 높다.
다만 비용이 연간 수십~수백만원 발생하고, 자동화 지원이 부족한 경우가 많아 갱신과정이 다소 번거로우며 시간도 오래 걸린다.
let's encrypt는 무료이며, 자동화가 가능하며 발급도 빠르다. (몇 초 걸리지 않음)
하지만 인증서 유형에 제한이 있으며(현재 Domain Validation만 지원) 유효기간이 90일로 짧다.
신뢰도도 공인 기관에 비해서는 떨어지고, 법적 책임이나 기업 신원 검증 관련 보호가 없다.
또한 키 유출이나 도메인 탈취와 같은 문제가 생겼을 경우 서비스 운영자가 직접 대처해야 한다.
문제가 생겼을 때의 안정성을 돈 주고 사는 느낌이랄까...
아무튼 가보자~
테스트 하기 전에 주의!!!
인증서는 발급 횟수 제한이 있다. Let's encrypt - 발급 횟수 제한 안내
어찌 보면 당연한 건데, 동일한 고유 도메인에 대해 1주일에 최대 5번 발급받을 수 있다.
이 횟수를 넘어선 후에는 34시간마다 1개씩 발급 가능하게 되므로... 시행착오하는 동안에는 스테이징에서 발급받자.
An unexpected error occurred:
too many certificates (5) already issued for this exact set of identifiers in the last 168h0m0s,
retry after 2025-08-28 17:07:25 UTC
: see https://letsencrypt.org/docs/rate-limits/#new-certificates-per-exact-set-of-identifiers
Ask for help or search for solutions at https://community.letsencrypt.org.
See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
발급 제한을 넘어서면 이런 메시지를 보게 되는데, 저도 이 사실을 알고 싶지 않았습니다.
심지어 발급받을 때마다 이전에 발급받은 인증서는 삭제해 버렸는데,
다행히 /etc/letsencrypt/archive라는 폴더에 모두 보존되어 있었다............
스테이징에서 받는 방법은 아래와 같다.
$ certbot certonly
--server https://acme-staging-v02.api.letsencrypt.org/directory # 이거 추가
--manual --preferred-challenges=dns
--manual-auth-hook /doodoo/scripts/authenticator.sh
--manual-cleanup-hook / doodoo /scripts/cleanup.sh -d *. doodoo.kr
--server 어쩌구 할 것 없이, --dry-run 이나 --test-cert 플래그만 입력해 줘도 된다.
진짜 시작!
1. Certbot을 설치한다.
Certbot 공식 페이지에서는 snap을 통해 설치할 것을 권장하고 있다.
snap 설치 방법 / [Certbot] snap & nginx 설치 방법 / [Certbot] pip & nginx 설치 방법
근데 snap이 뭐냐....
snap은 리눅스용 범용 패키지 관리/배포 시스템으로, 우분투를 만든 캐노니컬에서 개발했다!
Snaps are app packages for desktop, cloud and IoT that are easy to install, secure, cross-platform and dependency-free. Snaps are discoverable and installable from the Snap Store, the app store for Linux with an audience of millions. Snap : A snap is a bundle of an app and its dependencies that works without modification across Linux distributions. Snapd : Snapd is the background service that manages and maintains your snaps, automatically. Snap Store : The Snap Store provides a place to upload snaps, and for users to browse and install the software they want. Snapcraft : Snapcraft is the command and the framework used to build and publish snaps. |
배포판(Ubuntu, Debian, CentOS, Fedora 등)에 관계없이 동일한 방식으로 패키지를 설치하고 업데이트할 수 있게 해준다.
우분투 18.04 이상에는 기본으로 설치되어 있다.
그리고 Certbot snap은 x86_64, ARMv7, ARMv8 과 같은 아키텍처를 지원한다.
배포판별 패키지 관리자(apt, yum 등)는 배포판의 리포지토리에 묶여 있어 업데이트가 늦어질 수 있고,
인증서 발급이니만큼 프로토콜의 변화에 따라 빠른 업데이트가 필요하기 때문에...
대부분의 사용자에게 snap을 통해 Certbot을 설치할 것을 강력히 권장하고 있다.
그래서 일단 snap install certbot 으로 설치를 해 보려는데,
$ snap install --classic certbot
error: system does not fully support snapd: cannot mount squashfs image using "squashfs"
mount: /tmp/syscheck-mountpoint-3773037643 : mount failed: Operation not permitted.
이런 에러가 떴다.
원인을 찾아 보니 내 테스트환경이 VM이라 경량 OS를 사용해서 생긴 문제였다.
snap은 내부적으로 squashfs 이미지(.snap 파일)를 loop 장치로 마운트해서 동작하는데,
그걸 지원할 수 없는 환경에서는 원천적으로 동작이 막히게 된다.
현재 VM의 커널은 Proxmox VE 기반의 6.8.4-3-pve로... squashfs 모듈 자체를 포함하고 있지 않았다.
우분투 기준으로 일반 generic 커널은 기본적으로 squashfs 지원을 포함한다. (uname -r로 확인가능)
이걸 해결하려면 두 가지 방법이 있다.
1. 커널 교체해서 snap 지원하기 (snap 꼭 써야 할 때)
2. 걍 pip로 설치하기
나는 일단 테스트로 한 번 해보는 게 목적이었기 때문에 후자를 택했다.
어차피 나중에 도커 띄워서 하는 방식으로 바꿀거라...
2. Certbot으로 인증서 발급받기
certbot으로 Let's encrypt 인증서를 발급받기 위해서는 도메인 인증(Challenge)이 필요한데,
도메인 인증방식에는 주로 두 가지가 쓰인다. Let's encrypt - Challenge Types
1. HTTP-01 Challenge
가장 흔히 쓰이는 인증 방식이다.
Let's encrypt가 인증 대상의 ACME 클라이언트에 토큰을 제공하고,
ACME 클라이언트는 http://<YOUR_DOMAIN>/.well-known/acme-challenge/<TOKEN>라는 경로에 토큰을 저장한다.
이 파일에는 토큰과 계정 키의 fingerprint가 포함되어 있고,
ACME 클라이언트가 Let's encrypt에 파일이 준비되었음을 알리면 Let's encrypt가 해당 파일을 가져오려고 시도한다.
이렇게 가져 온 파일에 대해 유효성 검사를 진행해서, 올바른 응답을 받으면 인증서가 발급된다.
HTTP-01 챌린지는 80번 포트에서 가능하며 다른 포트는 사용할 수 없도록 제한되어 있다.
와일드카드 인증서(루트 도메인에 대한 인증서)를 발급받을 수 없고,
내부 망이거나 공인 IP를 통해 접근할 수 없는 서버에 연결된 도메인은 이 방식을 사용할 수 없다.
2. DNS-01 Challenge
https://eff-certbot.readthedocs.io/en/stable/using.html#getting-certificates-and-choosing-plugins
도메인 이름 아래의 TXT 레코드에 특정 값을 입력해서 해당 도메인 이름의 DNS를 제어하고 있음을 증명한다.
Let's encrypt가 제공한 토큰을 _acme-challenge.<YOUR_DOMAIN> 의 TXT 레코드에 저장하면,
해당 레코드에 대한 DNS 시스템을 쿼리해서 일치한다면 인증서가 발급된다.
HTTP-01보다 세팅이 조금 어렵지만 와일드카드 인증서를 발급할 수 있으며,
공개되지 않은 웹서버에 연결된 도메인에도 적용이 가능하다.
하지만 인증서를 발급할 때마다 변경되는 토큰을 매번 DNS의 TXT 레코드에 설정해줘야 하므로,
DNS 제공처에서 관련 API를 제공하지 않는다면 굉장히 번거로워질 수 있다...
관련 API를 제공한다고 해도 API를 날릴 수 있는 키를 웹서버에 저장하는 만큼 보안에 좀 더 신경써야 한다.
그리고 레코드가 반영되는 데까지 수 초에서 몇 분 이상 소요될 수 있기 때문에 이 부분도 주의.
DNS TXT 레코드는 DNS에 등록할 수 있는 레코드 타입 중의 하나로, 텍스트 문자열을 저장하기 위해 사용된다.
원래는 도메인에 임의의 정보를 붙여 두기 위해 만들어졌지만 현재는 Let's encrypt의 도메인 소유권 검증이라던가,
이메일 보안 설정(Sender Policy Framework, DomainKeys Identified Mail, DMARC 등)과 같이
서비스 인증 설정시에 활용된다.
아무튼. 나는 와일드카드 인증서를 발급받고 싶었고,
외부에서 접근이 불가능한 서버도 있었기 때문에 DNS-01 챌린지 방식으로 진행했다!
DNS 방식으로 발급받기 위해서는 아래와 같이 명령을 실행해주면 된다.
certonly는 인증서를 "발급" 만 받는 명령어이다.
자동으로 conf파일을 수정해 주는 --nginx 등 여러 옵션을 제공하나 그건 공식 문서에서~.~
$ certbot certonly --manual --preferred-challenges dns -d dev-ssl.doodoo.kr
# --preferred-challenges dns 로 DNS-01 챌린지를 선택
# -d는 어떤 도메인에 대해 인증서를 발급받을 건지 지정
그럼 이용 약관 동의, 인증 실패 등 안내 메일 수신할 주소 등을 입력하게 되고, 아래와 같이 안내 메시지가 나온다.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for dev-ssl.doodoo.kr
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:
_acme-challenge.dev-ssl.doodoo.kr.
with the following value:
fZILq5g6OVJbZStcpwUqcs7ph8kpRmkJntia83tx3QI
Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.dev-ssl.doodoo.kr.
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
여기서 나오는 토큰값을 DNS에 등록해 주면 된다! (등록해서 반영되기 전까지는 엔터를 치면 안된다.)
반영이 제대로 됐는지는 안내 메시지에 나타난 경로(Admin Toolbox)로 들어가면 위와 같은 웹페이지가 나오는데,
아래 Value에 내가 입력한 값이 나오면 성공적으로 반영된 것!
등록하고 반영된 후 엔터를 눌러 계속 진행해 주면,
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/test-ssl.doodoo.kr/fullchain.pem
Key is saved at: /etc/letsencrypt/live/test-ssl.doodoo.kr/privkey.pem
This certificate expires on 2025-11-25.
These files will be updated when the certificate renews.
NEXT STEPS:
- This certificate will not be renewed automatically.
Autorenewal of --manual certificates requires the use of an authentication hook script
(--manual-auth-hook) but one was not provided.
To renew this certificate, repeat this same certbot command before the certificate's expiry date.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
정상적으로 인증서가 발급됐다는 알림이 뜬다.
3. 자동 갱신 설정하기
이제 인증서가 만료될 때에 자동으로 인증서가 갱신되도록 설정해 보자.
DNS-01 챌린지를 이용하고, 현재 사용하고 있는 DNS 서비스에서 플러그인을 제공한다면,
인증서 발급시에 자동 갱신 cronjob이 등록된다는데....
나는 그런 편의성 플러그인을 제공하지 않는 wix를 이용하고 있다.
플러그인을 제공한다 해도 그 명령어를 crontab에서 실행하는 건 동일하긴 하다.
아무튼 플러그인이 없으니...
인증서를 발급받을 때 진행한 DNS 레코드 등록, 요청 확인, 레코드 삭제 등등을 수동으로 진행해야 한다.
manual 세팅에 대한 공식 문서는 여기 → [Certbot] Pre and Post Validation Hooks
가뜩이나 유효기간도 짧은데 90일마다 그렇게 하기는 좀 그렇죠 아무래도?
첫 발급 진행 후에는 자동으로 진행되게 세팅해 보자.
다행히 certbot 명령어 자체에서 --manual-auth-hook, --manual-cleanup-hook 과 같은 옵션을 제공한다.
이 옵션으로 인증서 발급/갱신 시도 전후, 갱신 완료 후에 실행할 파일을 지정해줄 수 있다.
옵션명 | 실행 시점 |
--manual-auth-hook | 인증 작업을 진행하는 실행 파일/명령어 |
--manual-cleanup-hook | 인증 후 후처리를 진행하는 실행 파일/명령어 |
--deploy-hook | 인증 및 갱신 성공 후에 실행할 파일/명령어 |
--post-hook | 갱신 성공 여부와 관계없이 종료 후 실행할 파일/명령어 |
그리고 --manual-auth-hook과 --manual-cleanup-hook은 해당 옵션으로 실행될 파일/명령어에
다음과 같은 환경 변수도 전달해 준다.
- CERTBOT_DOMAIN: The domain being authenticated
- CERTBOT_VALIDATION: The validation string
- CERTBOT_TOKEN: Resource name part of the HTTP-01 challenge (HTTP-01 only)
- CERTBOT_REMAINING_CHALLENGES: Number of challenges remaining after the current challenge
- CERTBOT_ALL_DOMAINS: A comma-separated list of all domains challenged for the current certificate
실행할 쉘스크립트 파일에서 $CERTBOT_DOMAIN 처럼 샥 꺼내서 써먹을 수 있게 해 준다.
더 자세한 내용은 여기 참고!
그 후에는 무한 시행착오를 거친 세팅...
각자 이용하는 DNS 서비스에 따라 다르겠지만, 참고용으로 첨부한다. (wix 기준)
[Wix] Get Dns Zone - wix 공식 API 문서
[Wix] Api Keys - API 키 발급 관련 문서
auth.sh
#!/bin/bash
API_KEY="{API 키}"
EMAIL="{API 주인 계정}"
CREATE_DOMAIN="_acme-challenge.$CERTBOT_DOMAIN"
# Create TXT record
RES=$(curl -sS -X PATCH "{DNS 레코드 등록 요청하는 API 주소}" \
-H "wix-account-id: $EMAIL" \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"additions":[{"values":["'"$CERTBOT_VALIDATION"'"],"type":"TXT","hostName":"'"$CERTBOT_DOMAIN"'"}],"nssecEnabled":false}')
# Save info for cleanup
if [ ! -d /tmp/CERTBOT_$CERTBOT_DOMAIN ];then
mkdir -m 0700 /tmp/CERTBOT_$CERTBOT_DOMAIN
fi
# TXT 레코드 존재 여부 확인
TXT_COUNT=$(jq '[.dnsZone.records[] | select(.type=="TXT")] | length' <<< "$RES")
FILE_NAME="$(date +'%Y-%m-%d')_additions.json"
if [ "$TXT_COUNT" -gt 0 ]; then
echo "$RES" \
| jq '{additions:[.dnsZone.records[] | select(.type=="TXT")], nssecEnabled:false}' \
> "/tmp/CERTBOT_$CERTBOT_DOMAIN/$FILE_NAME"
else
echo "$RES" | jq '.' > "/tmp/CERTBOT_$CERTBOT_DOMAIN/fail_$FILE_NAME"
fi
# Sleep to make sure the change has time to propagate over to DNS
sleep 25
나의 경우에는 DNS 서비스 API로 TXT 레코드를 등록하는 요청을 보내고,
레코드가 제대로 등록됐는지 확인한 후에 성공/실패 여부에 따라 결과를 json으로 내보내 저장하고,
DNS 서비스에 레코드가 제대로 올라가 업데이트될 때까지 기다리는 시간을 25초 부여했다.
API 키가 쉘스크립트 내에 존재하니 키 관리 등 보안에 주의!!
cleanup.sh
#!/bin/bash
API_KEY="{API 키}"
EMAIL="{API 주인 계정}"
RES_FILE_NAME="$(date +'%Y-%m-%d')_additions.json"
if [ -f /tmp/CERTBOT_$CERTBOT_DOMAIN/$RES_FILE_NAME ]; then
RESPONSE==$(cat /tmp/CERTBOT_$CERTBOT_DOMAIN/$RES_FILE_NAME)
fi
FILE_NAME="$(date +'%Y-%m-%d')_deletions.json"
# Remove the challenge TXT record from the zone
if [ -n "${RESPONSE}" ]; then
curl -sS -X PATCH "{DNS 레코드 삭제 요청하는 API 주소}" \
-H "wix-account-id: $EMAIL" \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"deletions":[{"values":[""],"type":"TXT","hostName":"'"_acme-challenge.$CERTBOT_DOMAIN"'"}]>
| jq '.' \
> "/tmp/CERTBOT_$CERTBOT_DOMAIN/$FILE_NAME"
fi
cleanup에서는...
성공했을 때 저장되는 파일이 존재하면 DNS 서버에 레코드 삭제 요청을 보내고~ 결과를 따로 json으로 저장했다.
위 두 파일이 준비됐다면 이제 (좀 긴) 명령어 한줄 인증서를 발급받을 수 있게 됐다!
$ certbot certonly --manual \
--preferred-challenges=dns \
--manual-auth-hook /doodoo/scripts/auth.sh \
--manual cleanup-hook /doodoo/scripts/cleanup.sh \
-d *.doodoo.kr
한 번 인증서를 발급한 후에, certonly가 아니라 renew 로 실행해 주면
현재 발급된 인증서 중 갱신 대상인 인증서들을 갱신해 준다.
갱신된 후에 nginx를 재시작해주는 것도 잊지말자.
[Let's encrypt Community] What do I need to restart after renewing a certificate?
+ 이 모든걸 도커로 하기
certbot은 certbot/certbot 이라는 도커 이미지를 공식적으로 제공한다.
이걸 이용해서 어떤 환경이든 상관없이 편하게 인증서 발급 환경을 세팅해 보자.
cerbot은 여러 가지 환경의 이미지를 제공하는데, 가장 기본적인 certbot/certbot:latest는
alpine linux 위에서 만들어져 있어, 기본적으로 제공되지 않는 라이브러리가 있을 수 있다.
json 라이브러리인 jq도 그렇고, curl도 그렇고...nginx 또한 도커로 실행시킬 것이기 때문에...
이런 라이브러리를 설치한 커스텀 도커 이미지를 만들어서 써 보자.
# Dockerfile
FROM certbot/certbot
RUN apk add --no-cache curl jq bash docker-cli
그리고 내가 만든 Dockerfile로 커스텀 cerbot을 빌드한다.
$ docker build -t doodoo-certbot .
이렇게 만든 이미지로 컨테이너를 올려서 인증서를 발급받는다.
$ docker run -i --rm --name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-v "/doodoo/scripts:/doodoo/scripts" \
doodoo-certbot certonly --manual --preferred-challenges=dns \
--manual-auth-hook /doodoo/scripts/auth.sh \
--manual-cleanup-hook /doodoo/scripts/cleanup.sh \
--email lilo.kim@doodoo.kr \
--agree-tos \
-d *.doodoo.kr
갱신할 때는 이렇게 할 거다.
$ docker run -i --rm --name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-v "/doodoo/scripts:/doodoo/scripts" \
doodoo-certbot renew --manual --preferred-challenges=dns \
--manual-auth-hook /doodoo/scripts/auth.sh \
--manual-cleanup-hook /doodoo/scripts/cleanup.sh
잠깐. 볼륨 연결이니 실행 명령어니 너무 길다... 가독성도 떨어진다.
기왕 하는 거 docker-compose.yml 파일 하나로 모든 걸 다 세팅을 해 보자.
services:
certbot:
container_name: certbot
build:
context: .
dockerfile: ./Dockerfile
image: doodoo-certbot
volumes:
- /etc/letsencrypt:/etc/letsencrypt # 인증서 파일 저장
- /var/lib/letsencrypt:/var/lib/letsencrypt
- /doodoo/log/letsencrypt:/var/log/letsencrypt # 로그 파일 저장
- /doodoo/scripts:/doodoo/scripts # 실행 파일
- /var/run/docker.sock:/var/run/docker.sock # docker-cli 실행용
command: >
renew --manual --preferred-challenges=dns
--manual-auth-hook /doodoo/scripts/auth.sh
--manual-cleanup-hook /doodoo/scripts/cleanup.sh
--post-hook "docker exec nginx sh -c 'nginx -s reload'"
stdin_open: true
tty: true
restart: "no"
이제 좀 더 간편하게 갱신할 수 있게 됐다.
docker compose -f {docker compose 파일 경로} run --build --rm certbot
기왕 하는거 성공/실패 결과를 이메일로 받아 볼까?
이 과정에서 다양한 시행착오를 했지만...
결론적으로는 파이썬으로 이메일을 발송하도록 세팅했다.
파이썬으로 gmail을 보내기 위해서는 비밀번호 발급도 받아야 하고 뭐가 많지만...생략한다.
import smtplib
import subprocess
from email.message import EmailMessage
from email.utils import formataddr
smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
# 실행할 커맨드 입력
cmd = ["docker", "compose", "-f", "{docker compose 파일 위치}", "run", "--build", "--rm",
"certbot"]
# 실행 결과를 파일로 저장
try:
# 커맨드 실행
result = subprocess.check_output(cmd).decode("utf-8", "replace")
except subprocess.CalledProcessError as e:
result = e.output.decode("utf-8", "replace")
smtp.login('Gmail SMTP 계정', 'Gmail SMTP 비밀번호')
message = EmailMessage()
# 저장한 실행 결과 파일을 이메일에 첨부
message.add_attachment(result, filename='certbot_result.txt')
# 이메일 제목 설정
message['Subject'] = '[Certbot] Update of Certificate Attempted.'
# 이메일 발신/수신인 설정
message['From'] = formataddr(("두두킴", "lilo.kim@doodoo.kr"))
message['To'] = ["lilo.kim@doodoo.kr"]
sender = "lilo.kim@doodoo.kr"
# 발송!
smtp.send_message(message)
smtp.quit()
결론적으로, 아래와 같이 cronjob에 등록해서 매달 1일에 갱신을 시도할 수 있게 됐다~
0 0 1 * * python3 /doodoo/scripts/certbot-with-mail.py
추가
인증 정보는 /etc/letsencrypt/renewal/{인증서를 발급한 도메인}.conf에서 확인할 수 있다.
$ cat doodoo.kr.conf
version = 4.2.0
archive_dir = /etc/letsencrypt/archive/doodoo.kr
cert = /etc/letsencrypt/live/doodoo.kr/cert.pem
privkey = /etc/letsencrypt/live/doodoo.kr/privkey.pem
chain = /etc/letsencrypt/live/doodoo.kr/chain.pem
fullchain = /etc/letsencrypt/live/doodoo.kr/fullchain.pem
# Options used in the renewal process
[renewalparams]
account = xxxx
pref_challs = dns-01,
server = https://acme-staging-v02.api.letsencrypt.org/directory
authenticator = manual
manual_auth_hook = /doodoo/scripts/auth.sh
manual_cleanup_hook = /doodoo/scripts/cleanup.sh
key_type = ecdsa
인증서 파일의 위치, 인증시 사용한 정보를 확인할 수 있다!
만료일자는 아래 명령어로 가능~
$ openssl x509 -in {인증서 경로}/{인증서 파일명} -noout -dates
'TIL > Docker' 카테고리의 다른 글
무중단 배포 삽질 (0) | 2025.02.13 |
---|---|
MSA 도커 컨테이너 (0) | 2024.12.05 |
docker-compose.yml로 Redis 컨테이너 올리기 (2) | 2024.12.05 |