고객사 도메인 50개를 엑셀 없이 관리하기
웹 에이전시나 호스팅 대행을 하다 보면 어느 순간 이런 엑셀이 생긴다.
| 고객사 | 도메인 | 인증서 만료 | 도메인 만료 | 담당 |
|---|---|---|---|---|
| A사 | a-corp.co.kr | 2026-11-03 | 2027-02-14 | 김OO |
| B사 | b-shop.com | 2026-10-21 | ? | 김OO |
| … | (×50행) |
문제는 만든 날 이후로 아무도 안 고친다는 것이다. 갱신하면 날짜가 바뀌는데 엑셀은 모른다. 고객사가 도메인을 하나 더 사면 행이 없다. 담당자가 바뀌면 그 파일이 어디 있는지부터 못 찾는다. 엑셀은 적어 둘 뿐 지켜보지는 않는다.
텍스트 파일 한 장과 스크립트
도메인을 한 줄에 하나씩 적은 domains.txt 하나가 엑셀보다 낫다. 날짜를 사람이 적지 않기 때문이다.
날짜는 물어보면 나온다.
#!/bin/bash
# check-all.sh — domains.txt 의 인증서·도메인 만료를 한 번에
while read -r d; do
[ -z "$d" ] && continue
cert=$(openssl s_client -connect "$d:443" -servername "$d" </dev/null 2>/dev/null \
| openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
if [ -z "$cert" ]; then cert_days='?' # 접속 실패 — 0일로 보이지 않게
else cert_days=$(( ($(date -d "$cert" +%s) - $(date +%s)) / 86400 )); fi
dom=$(curl -sL -m 10 "https://rdap.org/domain/$d" \
| python3 -c "import json,sys
try:
[print(e['eventDate'][:10]) for e in json.load(sys.stdin)['events'] if e['eventAction']=='expiration']
except: print('?')" | head -1)
printf '%-28s 인증서 %4s일 도메인만료 %s\n' "$d" "$cert_days" "$dom"
sleep 2 # RDAP 레이트리밋 예의
done < domains.txt
GNU date 기준이다. macOS에서는 date -d 대신 gdate -d(coreutils)를 쓴다.
a-corp.co.kr 인증서 46일 도메인만료 2027-02-14
b-shop.com 인증서 12일 도메인만료 2026-12-01
이것만으로 지금 상태는 늘 정확하다. 남는 문제는 누가 이걸 매일 돌리고 빨간 줄을 알아채느냐다.
cron으로 돌리고 알림만 받기
사람이 결과를 보러 가야 하는 체계는 결국 무너진다. 그 얘기는 만료 사고가 반복되는 구조에 적었다. 방향을 뒤집어서, 임계값을 넘은 것만 슬랙으로 날아오게 한다.
#!/bin/bash
# alert.sh — 30일 이내만 슬랙 통보 (cron: 0 9 * * *)
WEBHOOK="https://hooks.slack.com/services/…"
while read -r d; do
[ -z "$d" ] && continue
if ! openssl s_client -connect "$d:443" -servername "$d" </dev/null 2>/dev/null \
| openssl x509 -noout -checkend $((30*86400)) >/dev/null 2>&1; then
curl -s -X POST "$WEBHOOK" -H 'content-type: application/json' \
-d "{\"text\":\"⚠️ $d 인증서 30일 이내 만료 (또는 접속 불가)\"}" >/dev/null
fi
sleep 1
done < domains.txt
-checkend가 실패하면 통보하도록 묶었기 때문에 접속이 안 될 때도 알림이 온다. 알림이 없으니
정상이겠거니 하는 착각이 제일 위험하다.
웹훅은 개인 DM 말고 팀 채널로 보낸다. 받는 사람이 한 명이면 그 사람이 휴가 간 날이 곧 장애다.
여기까지 하면 엑셀은 필요 없다. 스크립트 두 장과 서버 한 대면 된다.
스크립트로는 모자란 것
직접 굴려 보면 이런 게 남는다.
스크립트를 돌리는 서버가 죽으면 감시가 죽었다는 알림은 누가 주나. 감시를 감시하는 문제다. 갱신과 감시를 분리했듯 감시도 한 지점에만 두면 안 된다.
도메인 만료일 조회는 파편화돼 있다. TLD마다 RDAP 서버가 달라 IANA 부트스트랩부터 타야 하고, 지원하지 않는 ccTLD도 있다. 도메인 만료가 더 위험한데 정작 조회는 제일 까다롭다.
지역 차이도 있다. 서버에서 본 인증서와 고객 지역에서 보이는 인증서가 다를 수 있다. CDN을 쓰는 고객사라면 실제로 겪는다.
이력도 쌓여야 한다. 지난달에 왜 알림이 왔었는지 답하려면 결과가 어딘가 남아 있어야 한다.
고객사별 보고는 끝까지 수작업으로 남는다. 월말에 “귀사 도메인 이상 없음” 리포트를 뽑는 일이다.
이쯤부터는 스크립트보다 서비스가 할 일이다. 도메인 몇 개라면 진단 툴에 넣어 보면 인증서 상태와 체인, 지역별 차이까지 바로 나온다. 도메인 5개까지는 만료 감시 구독이 인증서와 도메인 만료를 매일 무료로 확인한다. 50개 단위를 다루는 팀용 버전은 준비하고 있고, 위에 적은 모자란 점들이 그 요구사항이다. 소식을 먼저 받으려면 글 아래 안내에서 이메일을 남기면 된다.