Spring Boot에 Let's Encrypt SSL 적용기

Jiwon Jung·2023년 4월 28일
1
post-thumbnail
post-custom-banner

예전에 아파치나 NginX 같은 웹서버 없이 Spring Boot으로 만든 웹 어플리케이션에 무료 SSL 중 하나인 Let's Encrypt을 적용한적이 있었습니다.

90일동안 사용가능하며 다시 갱신을 시켜줘야하나? 싶었지만 간단한 설정으로 자동갱신까지 가능하니 참 괜찮았던 것 같아 소개하고자 글을 포스팅합니다.

그리고 Let's Encrypt SSL 인증서 발급 방법은 여러가지가 있는데 그 중 standalone 방식을 택했습니다.

1) standalone
. 사이트 작동을 멈추고 이 사이트의 네크워킹을 이용해 사이트 유효성을 확인해 Let’s Encrypt SSL 인증서를 발급하는 방식
. 80포트로 가상 standalone 웹서버를 띄워 인증서를 발급
. 이 방식은 동시에 여러 도메인을 발급 받을 수 있음
. 자동갱신 가능

2) webroot
. 사이트 디렉토리 내에 인증서 유효성을 확인할 수 있는 파일을 업로드하여 인증서를 발급
. 실제 작동하고 있는 웹서버의 특정 데렉토리의 특정 파일 쓰기 작업을 통해서 인증
. 이 방식의 장점은 서버를 중단없이 발급 가능
. 이 방법의 단점은 인증 명령에 하나의 도메인 인증서만 발급 가능
. 자동갱신 가능

3) DNS
. 도메인을 쿼리해 확인되는 TXT 레코드로 사이트 유효성을 확인하는 방법
. 와일드 카드 방식으로 인증서를 발급 가능
. 이 방법은 당연하게도 서버 관리자가 도메인 DNS를 관리/수정할 수 있어야 하며
. 인증서 갱신 시마다 DNS에서 TXT값을 변경해야 함

이제부터 standalone 방식으로 인증서를 발급받아 SSL을 적용해보겠습니다.

(적용하기 위해 이미 웹 어플리케이션은 배포된 상태여야 하며, 도메인 주소를 가지고 있어야 합니다. )

STEP1. 터미널로 리눅스 서버에 원격 접속한다.

# -p 뒤에 포트번호를 넣으면 됩니다.
ssh username@ip주소 -p 1234

STEP2. Certbot을 설치한다.

sudo apt-get install certbot

STEP3. 기존에 사용중인 80 포트는 kill 한다.

STEP4. Certbot을 어떤 방식으로 구동시킬 지 선택한다. (전 standalone 방식을 택했습니다.)

sudo certbot certainly --standalone

위 그림처럼 입력하면 이메일을 입력하라고 나타나고 이메일을 입력하면 됩니다.

곧이어 동의 절차글이 나타납니다. A, Y를 차례대로 입력하고 마지막으로 ssl 인증설르 발급받을 도메인을 입력하면 됩니다.

여러개 입력 가능합니다. ex) naver.com www.naver.com

위처럼 Congratulations!! 문구가 뜨면 성공입니다!
그리고 /etc/letsencrypt/live/도메인/ 경로에 fullcahin.pem과 privkey.pem 가 발급되었다고 안내합니다.

위에서 알려주는 경로로 이동해봅시다. (live 폴더 이상 안들어가진다면 접근권한이 없는 것이므로 sudo -i로 접근하거나 root로 들어가면 live폴더 이상 접근 가능합니다.)

STEP5. pem은 스프링 부트에서 인식을 못하므로, pem을 PKCS12 형식으로 변경

-fullchain.pem, privkey.pem 등이 발급받아진 경로로 이동 한 뒤 아래 명령어를 입력하면 keystore.p12 파일이 생성됩니다.

sudo openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name ttp -CAfile chain.pem -caname root
  • 위 명령어 진행 후 Enter Export Password가 나오는데 이때 비밀번호는 스프링 부트에 적용시 필요한 비밀번호이므로 잘 기억해둡시다.

STEP6. 스프링 부트에 적용시키기 위해 변환된 keystore.p12을 로컬로 가져와야한다.

저는 FileZilla를 통해 keystore.p12이 있는 경로로 가서 로컬로 가져오는 방식을 택했습니다.

STEP7. Spring Boot에 적용시키자

  • resources 폴더 아래에 ssl 디렉토리를 생성한 뒤, 그곳에다가 keystore.p12을 넣어주세요.

STEP8. Spring Boot의 application.yml 수정

server:
	port: 443
	ssl:
    	key-store: classpath:ssl/keystore.p12
    	key-store-type: PKCS12
    	key-store-password: 변환후입력헀던비밀번호

이제 웹 어플리케이션을 배포해서 https 까지 붙였을때 잘 뜨면 성공입니다.

인증서 자동갱신 하기

# Crontab 보기

$ crontab -l


# Crontab 편집
$ crontab -e

crontab -e 로 편집 모드로 들어갑니다.

그 다음 매달 1일에 자동 갱신 될 수 있는 아래 명령어를 입력하고 저장 후 나오면 끝!

$ 0 2 1 * * /usr/bin/certbot renew

인증서 만료일 확인하기
Certbot으로 부터 발급받은 인증서들에 대한 정보를 표시합니다.

$ certbot certificates

인증서 갱신 모의 테스트
인증서 renew 갱신이 제대로 동작하는지 테스트 해볼 수 있습니다.

certbot renew --dry-run

만약 certbot renew 도중 아래와 같은 에러가 발생한다면?

Attempting to renew cert (www.도메인.kr) from /etc/letsencrypt/renewal/www.도메인.kr.conf produced an unexpected error:
Problem bindging to port 80: Could not bind to IPv4 or IPv6......

apache2를 중단 하고 다시 실행해봅시다.

systemctl stop apache2.service

그리고 다시 certbot renew 로 실행하면 Congratulations, all renewals succeeded ..... 등의 내용이 뜨게 됩니다.

좀 예전에 적용했던 부분이라 내용설명이 부족했지만, 궁금한 점 있으면 댓글 부탁드립니다.
여기서 포스팅을 마치겠습니다.

profile
게을러지고 싶어 부지런한 개발자
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 2월 4일

안녕하세요

올려주신 글 잘 봤습니다.

중간에 오타가 있네요

sudo certbot certainly --standalone -> sudo certbot certonly --standalone

답글 달기