SyntaxHighlighter.all(); Spring Boot에 Let's Encrypt SSL 적용하기 :: 게을러지고 싶어 부지런한 개발자

아파치나 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. 터미널로 리눅스 서버에 원격 접속한다.

 

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 ..... 등의 내용이 뜸!!!

 

 

+ Recent posts