안녕하세요.
운영하시는 사이트가 있다는 것만으로도 이미 어느 정도 경험이 있으신 것 같은데, SSL 갱신 쪽은 아무리 해도 신경 쓰이는 부분이잖아요.
자동 갱신이 가끔 터지는 경우를 대비해서 수동 프로세스를 원하신다니, 그 마음 충분히 이해합니다.
보안이나 서비스 연속성 같은 건 자동화만 믿기 어려울 때가 많거든요.
'가장 정석적인' 절차를 공유해 달라고 하셨는데, 사실 '정답'은 서버 환경(Nginx인지, Apache인지, 리버스 프록시가 몇 개인지)에 따라 약간씩 달라지긴 합니다.
하지만 핵심 원리와 실패했을 때의 대처법까지 포함해서, 제가 실무에서 가장 안정적이라고 느꼈던 프로세스를 단계별로 아주 자세하게 풀어서 설명드리겠습니다.
분량이 좀 길어지긴 하는데, 이 부분이 질문자님께 가장 도움이 되었으면 좋겠습니다.
---
가장 먼저, 전제 조건부터 짚고 넘어가겠습니다. 우리가 지금 다루는 건 '갱신' 과정입니다.
인증서 자체가 만료되는 게 아니라, Let's Encrypt의 인증 주체(ACME) 서버에 "저, 이 도메인 주인 맞아요.
새 인증서 주세요!"라고 재확인받는 과정이라고 보시면 돼요.
가장 많이 쓰이는 툴은 역시 certbot입니다.
이 툴을 기준으로 설명드릴게요.
1단계: 사전 점검 (가장 중요합니다) 수동으로 진행하기 전에, 딱 세 가지만 점검하고 시작하는 게 좋습니다.
첫째, 도메인 이름 확인: 현재 사용 중인 도메인과 갱신하려는 도메인이 정확히 일치하는지 확인하세요.
서브도메인(www, blog 등)이 추가되었다면, 그때마다 certbot에 옵션을 주거나 인증을 받아야 하니 이 부분은 놓치지 마세요.
둘째, 방화벽 및 포트 개방: Let's Encrypt가 인증을 요구하는 포트(일반적으로 HTTP의 80번 포트)가 외부에서 접근 가능한지 반드시 확인해야 합니다.
만약 클라우드 환경이라면, 보안 그룹(Security Group)이나 NACL 설정에서 80번 포트 인바운드를 허용했는지 확인하는 게 90%의 실수 방지책입니다.
셋째, 권한 문제: certbot 실행 시 sudo 권한이 필요할 수 있습니다.
또한, 생성된 인증서 파일들이 서버의 웹 서비스 프로세스(예: Nginx 사용자)가 읽을 수 있는 권한으로 저장되는지 확인하는 습관이 중요합니다.
---
️ 2단계: 실제 인증서 재발급 (The Renewal) 여기서 가장 흔히 실수하는 게 바로 '인증 방식'입니다.
어떤 방식을 쓰느냐에 따라 명령어와 난이도가 확 달라져요.
A.
HTTP-01 Challenge 방식 (가장 일반적) 이게 가장 표준적이고 일반적이에요.
Let's Encrypt가 "당신이 이 도메인 주인 맞는지 증명해 보세요"라고 할 때, 웹 서버의 특정 경로(예: .well-known/acme-challenge/)에 임시 파일을 올려놓고, Let's Encrypt 서버가 그 파일을 가져가서 확인하는 방식입니다.
- 장점: 설정이 비교적 간단하고, 서버 자체에 큰 변화가 없습니다.
- 단점: 80번 포트가 외부에서 열려 있어야 합니다.
만약 로드 밸런서나 WAF(웹 방화벽)가 80번 포트를 가로채서 변조한다면, 이 방식은 무조건 실패합니다.
- 명령어 팁 (Nginx 기준): 대부분의 경우,
certbot --nginx 또는 certbot --apache처럼 웹 서버 플러그인을 사용하는 게 제일 편합니다.
이 플러그인들이 인증서 발급과 동시에 웹 서버 설정 파일 수정까지 한 번에 처리해주기 때문이에요.
만약 플러그인이 없다면, certbot certonly --webroot -w /var/www/html -d example.com 이런 식으로 수동으로 웹 루트를 지정해서 인증서만 먼저 받습니다.
B.
DNS-01 Challenge 방식 (최후의 보루) HTTP-01 방식이 포트 문제나 프록시 문제로 절대 안 될 때 쓰는, 좀 더 강력한 방식입니다.
- 원리: 웹 서버에 파일을 올리는 대신, 도메인의 DNS 레코드(TXT 레코드)를 직접 수정해서 인증합니다.
- 장점: 80번 포트 접근 여부와 상관없이 인증이 가능합니다.
복잡한 환경(클라우드 백엔드, 로드 밸런서 뒤 등)에서 최고의 선택지입니다.
- 단점: DNS 레코드를 수정해야 하므로, 사용하시는 도메인 관리 서비스(가비아, AWS Route 53 등)에서
certbot과 연동할 수 있는 플러그인(예: certbot-dns-route53)을 별도로 설치하고, API 키 같은 민감한 정보를 관리해야 합니다.
이 과정이 가장 까다롭습니다.
️ 실무적인 추천: 만약 환경이 단순하고 80번 포트 접근이 확실하다면, **웹 서버 플러그인이 포함된 certbot**을 쓰는 게 가장 빠르고 안정적입니다.
만약 환경이 복잡하다면, 무조건 DNS-01 방식으로 가셔야 합니다.
---
️ 3단계: 서버 설정 적용 및 최종 검증 (The Deployment) 인증서 파일(보통 fullchain.pem과 privkey.pem 두 개)을 성공적으로 받았다면, 이제 이걸 웹 서버에 적용해야 합니다.
가장 흔한 실수: 인증서 파일을 서버의 적절한 위치에 저장했지만, 웹 서버 서비스를 재시작(Restart)하거나 설정을 리로드(Reload)하는 것을 잊어버리는 경우입니다.
Nginx 기준 적용 예시: 1.
파일 위치 확인: 받은 인증서 파일을 /etc/nginx/ssl/ 같은 전용 디렉토리에 정리해 두세요.
Nginx 설정 파일 수정: 해당 도메인의 server 블록을 찾습니다.
3.
SSL 지시어 업데이트: <virtual_host>나 server 블록 내의 listen 지시어에 ssl on; 이 붙어 있는지 확인하고, ssl_certificate와 ssl_certificate_key 경로를 새로 받은 파일로 덮어씁니다.
(예: ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;) 4.
설정 테스트: sudo nginx -t 명령어로 문법 오류가 없는지 먼저 테스트합니다.
이 테스트가 필수입니다. 5.
서비스 재시작/리로드: * 문법 테스트 통과 후, sudo systemctl reload nginx 를 사용합니다.
(가장 안전함) * 만약 reload로 안 되면, sudo systemctl restart nginx 를 사용합니다.
(재부팅급이라 트래픽이 잠깐 끊길 수 있음) Apache 기준 적용 예시: 1.
Virtual Host 수정: 해당 도메인의 Virtual Host 설정 파일(*.conf)을 엽니다.
2.
SSL 지시어 업데이트: <VirtualHost *:443> 블록 내의 SSLCertificateFile과 SSLCertificateKeyFile 경로를 새로 받은 파일로 변경합니다.
3.
서비스 재시작: sudo systemctl reload apache2 또는 sudo systemctl restart httpd 를 실행합니다.
---
️ 4단계: 고급 팁 및 실전 노하우 (완성도를 높이는 방법) 질문자님께서 '가장 정석'을 물어보셨으니, 마지막으로 몇 가지 실전 노하우를 드리겠습니다.
1.
HTTP -> HTTPS 강제 리다이렉션은 필수입니다. 사용자가 http://example.com으로 접속해도, 서버 설정(Nginx의 경우 server { listen 80; ... } 블록)에 이 트래픽을 무조건 https://example.com으로 301 리다이렉트 시켜주는 설정을 추가하는 것이 기본 중의 기본입니다.
이걸 안 하면 검색 엔진 최적화나 보안 측면에서 큰 손해를 봅니다.
2.
주기적인 테스트 스크립트 구축: 수동으로 할 때는 위 과정을 메모해두면 되지만, 정말 프로답게 하려면 쉘 스크립트(Shell Script)를 짜서 자동화하는 겁니다.
스크립트의 흐름: if (check_if_cert_expired) { certbot renew --nginx && systemctl reload nginx; } 이런 식으로 certbot renew 명령어만 실행하는 걸 습관화하세요.
certbot renew는 자동으로 갱신 시도를 하되, 성공하면 설정 리로드까지 해주도록 설계되어 있어서, 수동으로 재발급을 시도할 때도 이 명령어를 이용하는 것이 가장 안전합니다.
3.
캐싱 문제에 대비하세요. 아무리 완벽하게 서버를 재시작해도, 클라이언트(브라우저)나 CDN(Cloudflare 등) 측에서 이전 인증서 정보를 캐싱하고 있을 수 있습니다.
테스트할 때는 **시크릿 모드(Incognito Mode)**로 접속하거나, 브라우저 캐시를 완전히 삭제하고 확인해야 진짜 적용 여부를 알 수 있습니다.
요약하자면: 1.
환경 파악: (Nginx/Apache/Proxy) 2.
인증 방식 선택: (HTTP-01이 안 되면 DNS-01 고려) 3.
툴 사용: certbot의 플러그인 기능을 최대한 활용하여 인증서 발급 + 웹 서버 설정 수정까지 한 번에 처리.
4.
마무리: nginx -t -> systemctl reload 순서로 진행하고, 80 포트 리다이렉트는 항상 유지.
너무 복잡하게 생각하실 필요 없고, '자동 갱신 실패했을 때의 백업 플랜'이라는 관점에서 접근하시면, 오늘 말씀드린 'certbot renew' 명령어와 '서비스 리로드' 과정을 숙지하시는 것만으로도 99%의 문제는 해결하실 수 있을 겁니다.
궁금하신 점이 또 생기면 언제든지 다시 질문해주세요!