Certbot으로 SSL 인증서 발급부터 자동갱신까지 완전정복 (CentOS7 + 커스텀 Apache 환경 포함)
Let's Encrypt 무료 SSL 인증서를 사용할 때 Certbot은 사실상 표준 도구죠.
하지만 3개월 주기로 갱신해야 해서, 시간이 지나면 “이거 어떻게 했더라?” 하면서 매번 뒤적이게 됩니다 😅
이번 글에서는 발급 → 갱신 테스트 → 실제 갱신 → 자동 갱신 → 인증서 삭제 → 만료 처리까지 전체 흐름을 정리했습니다.
아래 내용 중 일부는 제가 운영하는 서버(센트OS7 + 커스텀 Apache /opt/apache/bin/httpd 환경) 기준 설명입니다.
서버마다 웹서버 경로, 서비스명, certbot 설치 방식(snap/yum)이 다르기 때문에 그대로 따라 하면 장애 생길 수 있습니다.
각 명령 실행 전에 본인 서버 환경을 반드시 확인하세요!
0. 기본 환경
- OS : CentOS 7.9
- 웹서버 : Apache (직접 컴파일 설치,
/opt/apache/bin/httpd) - 인증서 : Let's Encrypt (90일)
- 클라이언트 : Certbot (snap 설치)
※ 공식 패키지로 설치한 Apache가 아니기 때문에 httpd.service도 apache2.service도 없습니다. 따라서 certbot post-hook에서 systemctl reload는 동작하지 않으며 apachectl graceful을 직접 호출해야 합니다.
1. 첫 인증서 발급하기
가장 기본적인 발급 방식 두 가지만 간단히 적어볼게요.
1-1. 웹루트(webroot) 방식
$ sudo certbot certonly \
--webroot \
-w /var/www/html \
-d example.com -d www.example.com
이 방식은 이미 웹서버가 정상적으로 운영되는 환경에서 사용하기 좋습니다.
1-2. Apache 자동 구성 방식
일반적인 Apache 패키지를 사용 중이라면 아래 명령도 가능하지만,
커스텀 Apache는 지원되지 않으니 주의!
$ sudo certbot --apache -d example.com -d www.example.com
2. 인증서/만료일 확인
현재 서버에 어떤 인증서가 있는지 보려면:
$ sudo certbot certificates
여기서 Expiry Date를 보고 만료일을 확인하면 됩니다.
3. 갱신 테스트 (DRY RUN)
실제 갱신 전에 테스트를 꼭 해보는 걸 추천합니다.
$ sudo certbot renew --dry-run
에러 없이 통과하면 실제 갱신해도 거의 문제 없습니다.
4. 실제 인증서 갱신
$ sudo certbot renew
- 만료 30일 이내인 인증서만 갱신됩니다.
- 아직 기간이 많이 남으면 “not due for renewal” 메시지가 뜹니다.
5. 자동 갱신 설정
5-1. 내 서버 상황(CentOS7 + Snap 설치 certbot)
CentOS 7은 기본적으로 certbot.timer가 없습니다. 하지만 snap으로 설치한 certbot은 snap.certbot.renew.timer가 자동 생성됩니다.
$ systemctl list-timers | grep certbot
snap.certbot.renew.timer ← 이 타이머가 실제로 동작 중
즉, 자동갱신은 이미 정상 동작 중입니다. 문제는 갱신 후 Apache에 새 인증서를 적용해주지 않는다는 점이죠.
5-2. snap 기반 certbot은 post-hook을 직접 줄 수 없다
snap.certbot.renew.timer는 내부적으로 certbot -q renew만 실행하기 때문에,
아래처럼 post-hook을 설정해도 실제 자동 갱신에서는 적용되지 않습니다:
certbot renew --post-hook "/opt/apache/bin/apachectl graceful"
수동 갱신에는 적용되지만, 자동갱신 타이머에는 반영되지 않습니다. 그래서 해결책은 renewal-hooks 디렉토리에 스크립트 넣는 방식입니다.
5-3. certbot renewal-hooks 사용 (정답)
갱신이 실제로 발생했을 때만 실행되는 스크립트를 추가합니다.
$ sudo mkdir -p /etc/letsencrypt/renewal-hooks/deploy
$ sudo vi /etc/letsencrypt/renewal-hooks/deploy/apache-graceful.sh
내용:
#!/bin/bash
/opt/apache/bin/apachectl graceful
실행권한 부여:
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/apache-graceful.sh
이제 certbot이 자동 갱신될 때마다 자동으로 Apache graceful reload가 수행됩니다.
커스텀 Apache인 경우 systemctl reload는 절대 동작하지 않습니다.
반드시
apachectl graceful 또는 apachectl restart를 사용해야 합니다.6. 인증서 삭제하기 (certbot delete) — 예시 기반으로 완전 상세 정리
운영 중이지 않은 도메인이나 테스트용으로 발급한 인증서를 정리하고 싶을 때는
certbot delete 명령을 사용하면 됩니다.
단, 잘못 삭제하면 웹서버가 SSL 파일을 못 찾아서 서비스가 중단될 수 있으니 반드시 신중히 작업해야 합니다.
여기서 설명하는 삭제 예시는 서버 상황에 따라 위험할 수 있어요.
특히 운영 중인 Apache 설정에서 해당 인증서를 사용하는 경우, 삭제하면 HTTPS가 바로 터질 수 있습니다.
삭제하기 전 반드시 웹서버 설정에서 인증서 경로를 확인하고, 더 이상 사용되지 않는 도메인임을 확실히 하세요.
6-1. 현재 인증서 목록 먼저 확인
삭제하기 전에 어떤 이름으로 인증서가 저장되어 있는지 확인해야 합니다.
$ sudo certbot certificates
예시 출력:
Found the following certs:
Certificate Name: example.com
Domains: example.com www.example.com
Expiry Date: 2025-01-13 09:11:02+00:00 (VALID: 40 days)
Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
Certificate Name: testdomain.kr
Domains: testdomain.kr
Expiry Date: 2025-02-01 10:00:00+00:00 (VALID: 50 days)
Certificate Path: /etc/letsencrypt/live/testdomain.kr/fullchain.pem
Private Key Path: /etc/letsencrypt/live/testdomain.kr/privkey.pem
여기서 “Certificate Name”이 실제 삭제할 때 사용하는 이름입니다. 예: - `example.com` - `testdomain.kr`
6-2. certbot delete 인터랙티브(선택형) 방식
아무 옵션 없이 실행하면 삭제할 인증서를 고르는 화면이 나옵니다.
$ sudo certbot delete
예시 화면:
Which certificate would you like to delete?
1: example.com
2: testdomain.kr
3: dev.mydomain.com
Select the number (1-3):
여기서 숫자를 입력하면 해당 인증서가 삭제됩니다.
삭제되면 /etc/letsencrypt/live/, archive/, renewal/ 경로의 해당 도메인 관련 파일이 정리됩니다.
6-3. 특정 인증서를 직접 지정해 삭제하기
특정 이름을 알고 있다면 이렇게 바로 삭제할 수 있습니다.
$ sudo certbot delete --cert-name example.com
예시 출력:
Deleted all files relating to certificate example.com.
삭제 후에는 `/etc/letsencrypt/live/example.com/` 폴더도 사라지고, renewal 설정도 제거되며 깔끔하게 정리됩니다.
6-4. 삭제하기 전에 꼭 확인해야 하는 부분
Apache 설정 파일 예시:
<VirtualHost *:443>
ServerName example.com
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
만약 이런 식으로 설정되어 있다면 delete로 인증서를 지우는 순간
Apache는 다음 reload 시 SSL 파일을 못 읽어서 서비스 에러가 발생합니다.
따라서 반드시 아래 순서로 진행해야 합니다:
- Apache 설정에서 해당 도메인의 SSL 설정 제거 또는 주석 처리
- Apache graceful/restart
- 문제 없는지 확인
- 이제 certbot delete 실행 (삭제 안전!)
6-5. 예시를 통한 “안전한 인증서 삭제 절차”
예를 들어 testdomain.kr 이라는 도메인을 더 이상 사용하지 않는다고 가정해봅시다.
① 인증서 목록 확인
$ sudo certbot certificates
② Apache 설정에서 해당 SSL 가상호스트 제거
/opt/apache/conf/extra/httpd-ssl.conf
또는 개별 vhost 파일에서:
# 주석 처리
# SSLCertificateFile /etc/letsencrypt/live/testdomain.kr/fullchain.pem
# SSLCertificateKeyFile /etc/letsencrypt/live/testdomain.kr/privkey.pem
③ Apache graceful 적용
$ sudo /opt/apache/bin/apachectl graceful
④ 도메인이 더 이상 사용되지 않는지 확인
브라우저로 접속 → 정상적으로 SSL 없이 페이지 뜨거나 404/연결안됨 확인
⑤ 이제 인증서 삭제
$ sudo certbot delete --cert-name testdomain.kr
⑥ 삭제 확인
$ sudo certbot certificates
→ 목록에서 testdomain.kr 인증서가 사라진 것을 확인.
6-6. 인증서 폐지(revoke)까지 필요한 경우
보안 사고(키 유출 등)가 발생하면 삭제 전에 revoke(폐지) 처리를 해야 합니다.
예:
$ sudo certbot revoke --cert-name example.com
$ sudo certbot delete --cert-name example.com
일반적인 운영 환경에서는 revoke까지 할 필요는 없습니다. 도메인을 더 이상 사용하지 않을 때는 delete만으로 충분합니다.
정리
certbot delete는 SSL 인증서를 안전하게 제거할 때 사용하는 명령- 삭제할 때는 Certificate Name을 정확히 확인해야 함
- Apache/Nginx에서 해당 인증서 파일을 사용 중이면 절대 바로 삭제하면 안 됨
- 사용 중지 → Apache 설정 제거 → reload → 확인 → delete 순서가 안전
- 보안 이슈 발생 시
revoke후 delete
운영 중인 서버에서 인증서 삭제는 매우 민감한 작업입니다.
잘못 삭제하면 HTTPS 서비스 전체가 중단될 수 있으니,
반드시 웹서버 설정을 확인하고, “더 이상 사용하지 않는 인증서”임을 확실히 하세요.
필요하시면 “내 서버 기준 certbot 삭제·정리 체크리스트”도 별도로 만들어 드릴게요 😊
7. 인증서 만료 시 대응
7-1. 사이트 계속 쓸 경우
$ sudo certbot renew --dry-run
$ sudo certbot renew
7-2. 사이트 중단 시
- Apache vhost에서 인증서 설정 제거
certbot delete로 인증서 삭제
7-3. 갱신 실패(Challenge 오류) 시
- DNS 레코드 확인
- .well-known 경로 차단 여부 확인
- 필요 시 인증서 삭제 후 재발급
정리
- 발급 :
certbot certonly ... - 만료 확인 :
certbot certificates - 갱신 테스트 :
certbot renew --dry-run - 실갱신 :
certbot renew - 자동 갱신 : snap.certbot.renew.timer
- 갱신 후 Apache 적용 : renewal-hooks 로 graceful 처리
- 인증서 삭제 :
certbot delete
이 글의 일부 명령은 저의 개인적인 환경(CentOS7 + 커스텀 Apache)에 해당합니다.
같은 리눅스여도 환경이 다르면 명령이 달라질 수 있으니,
환경 확인 없이 그대로 따라 하면 서비스 중단될 수 있습니다.
자신의 서버 설정(웹서버 경로, 서비스명, certbot 설치 방식)을 반드시 확인 후 실행하세요!
힘들구먼..ㅋㅋ 😊
'개발 > 리눅스' 카테고리의 다른 글
| Certbot으로 Let's Encrypt 무료 인증서 설치(certbot설치) (2) | 2024.01.24 |
|---|---|
| Certbot으로 Let's Encrypt 무료 인증서 설치(snap설치) (2) | 2024.01.05 |
| ssh_exchange_identification: read: Connection reset by peer (0) | 2024.01.02 |
| find, sed로 문자열 치환하기 (0) | 2022.07.13 |
| find, perl로 문자열 치환하기 (0) | 2022.07.12 |