Nginx SpringBoot Https 적용 [3] (스프링부트 Tomcat Https 설정)

10000DOO·2023년 3월 21일
1

YouHaveTo

목록 보기
10/12
post-thumbnail

2편에서 이어지는 내용입니다.

운영체제는 RedHat 기반의 RockyLinux 9.1을 사용했습니다.

📌 Key 확장자 변경

스프링부트에서는 .pem 키를 사용할 수 없다. 따라서 pkcs12 형태로 바꿔줘야 됩니다.
openssl 라이브러리를 사용하여 변경시킬 수 있다.

아래 명령어를 실행하면 keystore.p12 파일이 생긴 것을 확인하실 수 있습니다.
# key가 있는 위치로 이동
cd /etc/letsencrypt/live/도메인 이름

#키 변환
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name ttp -CAfile chain.pem -caname root
# 키 비밀번호를 입력해야됩니다. 나중에 스프링부트 .yml파일에 필요하니 꼭 기억해두세요.

📌 스프링부트 적용

다른 분들의 글을 보면 FileZilla 등을 사용해서 생성된 키를 로컬로 옮겨 스프링부트 resource 하위에 놔두고 사용하고 있습니다.
하지만 해당 방법은 나중에 ssl 인증서가 갱신된다면 다시 키를 변환하고 로컬로 옮겨 재배포 해야 되는 번거로움이 있을 것 같았습니다.
저는 .yml파일을 테스트, 로컬, 배포 환경으로 나누어 작성했기 때문에 
배포 환경에 적용되는 .yml에만 설정 내용을 작성하고 키 위치를 스프링부트 프로젝트 밖으로 적어주었습니다.
# 키 위치 이동
mv /etc/letsencrypt/live/도메인 이름/keystore.p12 키를 옮길 위치/
# ex) mv /etc/letsencrypt/live/도메인 이름/keystore.p12 /home/유저 이름/ssl/
# .yml 파일에 추가 (key-store에 대한 내용은 추후 설명)
server:
  ssl:
    enabled: true
    key-store: /ssl/keystore.p12
    key-store-type: PKCS12
    key-store-password: 생성 시 입력했던 비밀번호
스프링부트 프로젝트는 도커 컨테이너 안에서 실행되기 때문에 옮겨둔 키 위치와 컨테이너 안을 연결시켜줍니다.
#볼륨 생성
docker volume create ssl

# 스프링부트 프로젝트 실행
docker run -d -p 8080:8080 -e PW=비밀번호 -e TZ=Asia/Seoul -v file:/app/ -v /home/10000doo/ssl/:/ssl/ --name spring 도커 유저이름/도커 리포지토리:latest

#설명
다른 것은 이번 주제와 관련 없는 것이고 봐야 할 것은 -v /home/10000doo/ssl/:/ssl/ 부분입니다.
배포 서버의 키 위치와 도커 컨테이너 안에 /ssl/위치를 연결시켜 줍니다.
위에서 설명한 .yml 파일 내용을 보면 key-store의 /ssl/keystore.p12에서 /ssl이 여기서 연결시켜준 ssl입니다.

📌 갱신된 키 자동 적용

2편에서 ssl 인증서 만료를 대비해 매월 재발급 받도록 설정했습니다.
따라서 ssl 인증서가 재발급 되면 자동으로 keystore.p12키를 만들고 지정된 위치로 옮겨 스프링부트에 자동 적용될 수 있도록 했습니다.
# 쉘 스크립트 작성
# 명령어들을 순차적으로 실행시키기 위해 쉘 스크립트를 작성했습니다. 작성 위치는 .pem키와 같은 위치에 있습니다.
---쉡 스크립트 내용---
#!/bin/bash

# openssl 명령어 실행
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name ttp -CAfile chain.pem -caname root -passout pass:키 발급할 때 사용할 비밀번호

# keystore.p12 파일 이동
mv /etc/letsencrypt/live/도메인 이름/keystore.p12 /home/유저 이름/ssl/
해당 스크립트가 실행되면 자동으로 변경된 키가 적용됩니다.
그럼 이제 마지막으로 해당 스크립트를 매월 ssl인증서 재발급 이후 실행되도록 crontab을 사용하겠습니다.
crontab -e

1 4 1 * * /etc/letsencrypt/live/도메인 이름/script.sh

# ssl 인증서 재발급을 매월 1일  4시에 진행하게 만들었기 때문에 스크립트 실행은 매월 1일 오전 4시 1분에 실행되도록 했다.

📚 참고 자료

https://taewooblog.tistory.com/entry/spring-boot-https-적용하기-Lets-Encrypt
https://notes.harues.com/posts/how-to-setup-auto-renew-certbot-certificate/

profile
iOS 개발자 지망생 https://github.com/10000DOO

0개의 댓글