Intro
기존에 ZeroSSL을 활용해서 SSL을 발급받았는데, 90일마다 제법 번거로운 과정을 통해 재발급을 하는건 그래도 견딜 수 있었지만, 다른 도메인 포함 총 3번의 90-Day Certificates 발급을 하고 나니 이제부터는 돈내고 인증서를 발급받으라고 한다.
앞으로 zeroSSL을 쓸 일은 없겠다.
다른 무료 인증서 발급 기관을 찾아보다보니 Let's Encrypt가 사용방법도 편하고 무엇보다 비영리 단체이기 때문에 앞서 경험했던 것과 비슷한 상황을 걱정할 필요도 없고 갱신 방법이 간단하다는 점에서 선택하게 되었다.
심지어 대부분의 문서가 한국어로 번역도 잘 되어 있기 때문에 누구나 손쉽게 사용할 수 있을거라 생각한다.
발급
https://letsencrypt.org/getting-started/
Let's Encrypt의 Getting Started 탭을 확인 해 보면 Certbot 클라이언트를 이용해서 발급받으라고 한다. 클라이언트 옵션은 https://letsencrypt.org/docs/client-options/ 링크에서 확인 할 수 있는 것 처럼 굉장히 많지만 특별한 상황이 아니면 Certbot을 쓰면 되겠다.
Certbot 설치
권유한대로 Certbot 설치 부터 시작해본다. 운영할 서버가 우분투라서 apt를 이용해 설치 했다.
그 외 다양한 상황에서의 설치 방법에 대해서는 https://certbot.eff.org/instructions 를 참고하도록 한다.
소프트웨어와 OS를 선택하면 설치 방법부터 발급까지 친절하게 알려준다.
sudo apt-get update
sudo apt-get install certbot
Certificate 발급
설치가 완료되었다면 certbot에게 인증서 발급을 요청한다.
아래의 yourdomain.com 자리에 본인의 도메인 주소를 써주도록 한다.
sudo certbot certonly --standalone -d yourdomain.com
처음에는 이메일 주소를 입력하라고 한다.
그다음에는 이용 약관에 동의한다.
그다음에는 이메일 수신 동의를 하는데 거절했다.
그러면 이제 발급이 된다.
만료는 90일 이후다. 갱신은 단순하게 certbot renew
만 하면 된다고 하니 번거롭지 않고 아주 좋다.
인증서 포맷 변경
생성된 파일을 확인해본다.
/etc/letsencrypt/live
하위 경로에 도메인이름의 폴더를 생성 하여 키파일들을 저장해두었는데, sudo 권한이 필요하다.
그런데 Let's Encrypt로 생성한 키파일은 PEM 포맷이다. 자바는 PKCS12 를 사용하기 때문에 .p12
파일로 변환해준다.
sudo openssl pkcs12 -export -in /etc/letsencrypt/live/dutypark.o-r.kr/fullchain.pem -inkey /etc/letsencrypt/live/dutypark.o-r.kr/privkey.pem -out keystore.p12 -name tomcat -CAfile /etc/letsencrypt/live/dutypark.o-r.kr/chain.pem -caname root
dutypark.o-r.kr 로 작성해둔 부분은 각자 본인의 도메인으로 변경하여 입력 한다.
암호를 입력하라고 하는데, 까먹지 않도록 유의한다.
위의 명령어를 입력 하면, 명령어를 입력했던 경로에 keystore.p12
파일이 생성된다.
이 파일로 인증서를 갈아끼우면 된다.
스프링부트 프로젝트에서의 SSL 적용방법이 필요하다면 https://shanepark.tistory.com/442 를 참고하도록 한다.
해당 글에서
SSL 인증서를 Java keystore 로 변환
이후 부분을 참고하면 될 것이다.
인상적인건 .well-known/
경로에 본인의 웹사이트임을 인증하는 과정이 필요할거라고 생각했는데 딱히 그런걸 요구하지는 않았다.
결과
단순하게 keystore.p12
파일만 바꿔치기 후 서버를 새로 띄우니 정말 손쉽게 인증서가 갱신되었다.
앞으로는 sudo certbot renew
로 손쉽게 갱신하거나 그것마저 cron job으로 자동화하면 되니 그 얼마나 편리한가.
재발급
드디어 3개월이 지났다. 재발급이 가능할 때가 되니 lets encrypt에서 자동으로 이메일도 보내준다. 얼마나 간단한지 한번 인증서 재발급을 받아보자.
sudo certbot renew
를 실행 한다.
아쉽게도 한번에 하는건 실패했는데, 이를 해결하기 위해서는 certbot의 standalone 동작 방식에 대한 이해가 필요하다.
standalone 방식은 기존의 사이트 작동을 잠시 멈추고 80 포트로 가상의 인증서버를 띄워 확인하도록 되어 있는데, 이때 인증에 실패한것이다. 여러가지 원인을 의심 할 수 있겠지만 나의 경우에는 iptables 방화벽에서 443 포트만 열어두도록 설정해두었던게 문제였다. 80포트도 허용을 해 주어야 한다.
아래와 같이 입력해 포트 허용 및 설정값을 persist 했다.
# 80 포트 허용
sudo iptables -I INPUT 6 -p tcp --dport 80 -j ACCEPT
# iptables 설정값 저장
sudo sh -c "iptables-save > /etc/iptables/rules.v4"
이후 다시 시도하여 성공 하였다.
인증서 재발급 설공
하지만 아쉽게도 여기에서 끝은 아니다. 위에서 한번 해 봤던 것 처럼 인증서 포맷 변경이 필요하다. renew
만 한 상태에서 여전히 예전의 keystore.p12
를 사용하고 있다면 인증서 유효기간은 예전 그대로다.
일단 아래의 명령어를 참고해 .pem
파일이 있는 장소에 keystore.p12
파일을 생성해준다.
sudo openssl pkcs12 -export -in /etc/letsencrypt/live/dutypark.o-r.kr/fullchain.pem -inkey /etc/letsencrypt/live/dutypark.o-r.kr/privkey.pem -out /etc/letsencrypt/live/dutypark.o-r.kr/keystore.p12 -name tomcat -CAfile /etc/letsencrypt/live/dutypark.o-r.kr/chain.pem -caname root
그러고 나서는 key-store
경로를 방금 생성한 키 파일 위치로 지정해준다. 원래는 classpath:keystore.p12
로 지정하고 secret repository에서 pull을 하도록 CI/CD 를 구성해두었었는데, 그러면 인증서를 갱신 할 때마다 커밋도 새로 해야하기 때문에 그럴필요가 없도록 파일경로로 지정해두었다.
물론 인증서가 갱신되었을 때 어플리케이션을 재시작하는건 필요하다.
${code:application.yml}
server:
ssl:
key-store: /etc/letsencrypt/live/dutypark.o-r.kr/keystore.p12
이제 변경사항을 Merge 해서 새로운 인증서가 적용되었는지 확인 해 본다.
Github Action이 수행되었다.
사이트에 접속해서 인증서 정보를 확인 해본다.
인증서가 정상적으로 갱신되어 유효 기간이 늘어났다. 확실히 certbot을 사용하는 방법이 간편하다.
3개월에 한번 하는 것도 귀찮고 모든 작업을 자동화하고 싶다면, cronjob으로 아래의 세가지 작업을 연달아 하는 쉘스크립트를 작성해 등록해주면 되겠다.
- certbot renew
- keystore.p12 파일 생성
- 어플리케이션 재시작
References
'Development > DevOps' 카테고리의 다른 글
공유기 DDNS 설정으로 아이피 변경 대비하기 (ipTIME) (0) | 2023.06.19 |
---|---|
Grafana 모니터링중 이상 발생시 슬랙으로 알림 보내기 (0) | 2023.06.07 |
Github Action을 활용한 SpringBoot 프로젝트 CI/CD (1) | 2023.04.01 |
Gitlab Runner 등록 (0) | 2023.03.31 |
Docker 용량 부족할 때 저장 경로 변경 (0) | 2023.03.21 |