일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 개발자
- 스프링
- ES
- 읽기쉬운코드
- Spring
- Baekjoon
- API
- 애자일기법
- 프레임워크
- 코딩테스트
- 백준
- 클린코드
- spring boot
- database
- 코드
- 코딩
- 엘라스틱서치
- kotlin
- 애자일프로그래밍
- Elasticsearch
- 알고리즘
- 자바
- framework
- cleancode
- 그리디알고리즘
- Java
- 개발
- 데이터베이스
- 그리디
- JPA
- Today
- Total
튼튼발자 개발 성장기🏋️
spring boot + docker + ssl cert 본문
사이드 프로젝트를 진행하던 중 ssl 인증서 갱신 자동화를 고민하고 정리해두기 때문에
모든 내용은 사이드 프로젝트에 초점을 맞춘다.
1. letsencrypt 인증서 발급
sudo certbot certonly --manual --preferred-challenges dns -d "{도메인}"
가장 먼저 os에 알맞게 certbot 설치가 선행되어야한다.
인증서를 발급받는 여러가지 방법 중 위 방법으로 발급했다. letsencrypt 인증서는 /etc/letsencrypt 디렉토리에서 관리된다.
ll /etc/letsencrypt/live/{도메인}
위 command로부터 cert.pem, chain.pem, fullchain.pem, privkey.pem 4가지의 pem파일이 생성된다. 하지만 궁극적인 목표는 키스토어 파일을 spring boot에 적용시키는 것이다. 생성된 pem 파일을 가지고 키스토어를 만들자.
HOME="/etc/letsencrypt/live/{도메인}"
PKCS12_PATH="/path/to/cert/keystore.p12"
FULLCHAIN="$HOME/fullchain.pem"
PRIVKEY="$HOME/privkey.pem"
sudo openssl pkcs12 -export \
-in "$FULLCHAIN" \
-inkey "$PRIVKEY" \
-out "$PKCS12_PATH" \
-name "tomcat" \
-CAfile chain.pem \
-caname "root" \
-passout pass:{패스워드}
2. letsencrypt 인증서 갱신
letsencrypt는 3개월 주리고 갱신해주어야한다. 갱신해서 내 애플리케이션에 적용시키기가 굉장히 귀찮아서 이를 자동화하는 것이 목적이다.
갱신은 아래와 같이 할 수 있다.
sudo service nginx stop
fuser -k 80/tcp
sudo service nginx start
그럼 답이 나왔다. [갱신 > 앱 배포]가 자동화 되면 된다.
이제 본론으로 들어가겠다.
3. Project Architecture
나의 프로젝트는 [그림 1]과 같이 git actions를 사용해서 docker image를 생성하고 젠킨스를 통해 docker image를 pull 받아서 컨테이너를 실행한다. 그렇다면 인증서가 갱신될 때마다 젠킨스에서 갱신된 인증서를 가지고 앱이 실행되어야한다.
4. Jenkins Jobs
젠킨스 잡을 통해서 인증서를 주기적으로 갱신하고, 앱을 배포한다.
4-1. letsencrypt-auto-renew job
인증서를 갱신하기 위해서 아래와 같은 쉘을 실행시킨다.
그러면 PKCS12_PATH 경로에 갱신된 인증서 파일이 생성된다.
#!/bin/sh
HOME="/etc/letsencrypt/live/{도메인}"
PKCS12_PATH="/path/to/cert/keystore.p12"
FULLCHAIN="$HOME/fullchain.pem"
PRIVKEY="$HOME/privkey.pem"
echo "인증서를 조회합니다..."
sudo certbot certificates
sudo service nginx stop
fuser -k 80/tcp
sudo service nginx start
echo "갱신된 인증서를 조회합니다..."
sudo certbot certificates
echo "keystore.p12를 생성합니다..."
sudo openssl pkcs12 -export \
-in "$FULLCHAIN" \
-inkey "$PRIVKEY" \
-out "$PKCS12_PATH" \
-name "tomcat" \
-CAfile chain.pem \
-caname "root" \
-passout pass:{패스워드}
sudo chown jenkins:jenkins $PKCS12_PATH
4-2. Application Deploy
앱 배포는 자동이 아닌 수동으로 실행하게 해두었는데, 인증서가 갱신될 때마다 수동으로 실행시킨다면 완전한 자동화가 아니므로 트리거를 설정한다.
[그림 2]와 같이 상기 인증서 갱신 잡이 성공적으로 완료되었을 때에만 자동으로 실행되도록 설정한다.
그리고 중요한 부분! docker image를 생성할 때 Dockerfile 내에서 인증서 파일을 마운트해주지 않았다. 그렇다면 컨테이너가 실행될 때 이 인증서 파일을 마운트해주어야한다.
jenkins pipeline에서 아래와같이 설정한다.
중간에 -v 옵션이 바로 갱신된 인증서 파일을 마운트하는 옵션이다.
// ...
stage('Run New Container') {
steps {
echo '[새 컨테이너를 실행합니다...]'
sh """
docker run \
-v /path/to/cert/keystore.p12:/app/cert/keystore.p12 \
--name ${CONTAINER_NAME} --rm -d -p ${PORT_MAPPING} \
-e JAVA_TOOL_OPTIONS="${JVM_OPTIONS}" \
${IMAGE_NAME}
"""
sh 'docker ps'
}
}
// ...
주의해야할 점은 spring boot 설정시 `server.ssl.key-store=file:/app/cert/keystore.p12`를 설정해주어야한다.
우리는 jenkins pipeline으로부터 인증서 파일을 `/app/cert/keystore.p12`로 마운트했으니 이 인증서 파일을 설정해주는 것이다.
'Framework > spring' 카테고리의 다른 글
kotlin + spring boot + kotest + rest docs + swagger (3) | 2025.06.08 |
---|---|
part2. 동시성 이슈의 해결 방법 (2+1)가지 (0) | 2023.09.06 |
part1. 동시성 이슈의 해결 방법 (2+1)가지 (1) | 2023.09.05 |
배치 처리 테스트하기 (1) | 2022.09.22 |
클라우드 네이티브 배치 (0) | 2022.09.21 |