Let's Encrypt는 무료로 TLS(Transport Layer Security) 인증서를 자동 발급하는 인증 기관(Certificate Authority, CA)이고, certbot은 그 인증서를 받아 웹 서버에 설치·갱신하는 대표 클라이언트다. 인증서 유효 기간이 짧아(기본 90일, 2027-02부터 64일, 2028-02부터 45일로 단계적으로 줄어듦, 2026 기준) 자동 갱신이 전제다.
nginx에 적용
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com
sudo certbot renew --dry-run # 갱신 시험- certbot이 도메인 소유를 확인하려고 80번 포트로 들어오는 요청(HTTP-01 챌린지, HTTP-01 challenge)에 응답한다. 방화벽·보안 그룹(security group)에서 80·443을 열어 둔다. DNS가 이 서버를 가리켜야 한다(DNS와 CNAME)
--nginx는 서버 블록에listen 443 ssl, 인증서 경로 등을 자동으로 추가한다- 패키지로 설치하면 대개 systemd 타이머나 cron이 하루 두 번
certbot renew를 실행한다. 직접 cron을 걸 때는 갱신 뒤 웹 서버를 reload하는 훅을 붙인다
0 3 * * * certbot renew --deploy-hook "systemctl reload nginx"자주 만나는 문제
- certbot이 타임아웃되면 80번 포트를 다른 프로세스가 잡고 있지 않은지 본다(포트를 쓰는 프로세스 찾아 종료하기)
- 앱 프로세스가
/etc/letsencrypt/live아래 키를 못 읽으면, 앱을 root로 돌리지 말고 그룹 권한을 주거나 nginx가 TLS를 끝내고 앱에는 평문으로 넘긴다(nginx로 SPA 배포)
스프링 부트에 직접 붙일 때
내장 Tomcat은 PEM(Privacy-Enhanced Mail) 형식 대신 PKCS#12(Public-Key Cryptography Standards #12) 키스토어(keystore)를 쓰는 경우가 많다.
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name appserver.ssl.key-store에 경로를, 비밀번호는 저장소가 아니라 환경변수나 비밀 저장소에서 읽게 한다(스프링 설정 외부화와 프로파일). 스프링 부트 3.1부터는 PEM을 바로 읽는 SSL(Secure Sockets Layer) 번들을 쓸 수 있고, reload-on-update: true를 켜면 certbot이 파일을 갱신할 때 내장 Tomcat·Netty가 재시작 없이 인증서를 다시 읽는다. 그래도 앱이 여러 개라면 앞단의 nginx나 로드밸런서에서 TLS를 끝내는 구성이 관리하기 쉽다.
HTTPS가 무엇을 지켜 주는지는 HTTP와 HTTPS, HTTPS가 있어야 쓸 수 있는 브라우저 기능(Secure 쿠키 등)은 HTTP 쿠키를 본다.
출처: Let's Encrypt: Decreasing Certificate Lifetimes to 45 Days · Let's Encrypt: Challenge Types (HTTP-01) · Certbot 사용법: Renewal · Certbot: Hooks · Spring Boot: Reloading SSL Bundles