Docker + Certbot를 사용해서 ssl인증서 자동 갱신하기
2024년 2월 14일 수요일
4분 소요
0회
문제
회사에서 사용하는 홈페이지가 인증서가 만료되어서 갱신해야 했는데, 만료된 이후에 알게 되어서 누락되지 않도록 자동으로 인증서를 갱신할 수 있게 스크립트를 작성하게 되었다.
문제 해결
회사에서는 apache2
를 사용하고 있어서 해당 webroot
경로에 맞춰 docker + certbot webroot
방식으로 인증을 받았다.
INFO
만약 apache2
대신 다른 웹서버를 사용한다면 사용하는 웹 서버의 webroot
경로와 재시작 할 서비스명만 교체하여 사용하면 된다.
쉘 파일 작성
ssl_update.sh
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/bash
# 도메인과 이메일 주소 설정
DOMAIN='example.com'
EMAIL='admin@example.com'
APACHE_USER='webapp'
APACHE_GROUP='webapp'
# webroot 경로와 ssl 인증서 설정 경로
WEBROOT_DIR='/var/www/'
SSL_DIR='/etc/letsencrypt'
# 인증서 갱신 날짜 비교용
CURRENT_DATE=$(date +%Y%m%d)
cd $WEBROOT_DIR
# 인증서의 만료일을 확인
if [ -f certificate.crt ]; then
CURRENT_DATE_SEC=$(date +%s)
EXPIRE_DATE_SEC=$(date -d "$(openssl x509 -enddate -noout -in certificate.crt | cut -d= -f 2)" +%s)
# 만료일이 10일 이내인 경우에만 스크립트를 실행
if [ $(( (EXPIRE_DATE_SEC - CURRENT_DATE_SEC) / 86400 )) -gt 30 ]; then
echo "인증서는 아직 30일 이상 남았습니다."
exit 0
fi
fi
echo "$DOMAIN 도메인 인증서 갱신을 시작합니다..."
# certbot 컨테이너 실행
docker run -it --rm --name certbot \
-v "$SSL_DIR:$SSL_DIR" \
-v "$WEBROOT_DIR:$WEBROOT_DIR" \
certbot/certbot certonly \
--webroot -w $WEBROOT_DIR \
-d $DOMAIN \
--email $EMAIL \
--agree-tos --no-eff-email
# 인증서 파일이 없을경우 발급 실패로 종료
if [ ! -f $SSL_DIR/live/$DOMAIN/cert.pem ] || [ ! -f $SSL_DIR/live/$DOMAIN/privkey.pem ] || [ ! -f $SSL_DIR/live/$DOMAIN/chain.pem ]; then
echo "오류: 발급된 인증서가 없습니다."
exit 1
fi
mkdir -p "$SSL_DIR/backup_cert/$CURRENT_DATE"
# 기존 인증서 백업
echo "기존 인증서 백업..."
if [ -f $SSL_DIR/live/$DOMAIN/cert.pem ] && [ -f $SSL_DIR/live/$DOMAIN/privkey.pem ] && [ -f $SSL_DIR/live/$DOMAIN/chain.pem ]; then
cp $SSL_DIR/live/$DOMAIN/cert.pem $SSL_DIR/live/$DOMAIN/privkey.pem $SSL_DIR/live/$DOMAIN/chain.pem backup_cert/$CURRENT_DATE
else
echo "백업할 인증서가 없습니다."
fi
echo "새 인증서 적용..."
chown $APACHE_USER:$APACHE_GROUP cert.pem privkey.pem chain.pem
echo "certbot 파일 정리"
rm -rf $WEBROOT_DIR/.well-known
echo "apache2 재시작"
service apache2 restart
echo "$DOMAIN 인증서 갱신이 완료되었습니다."
cron
설정 추가
shellscript
1
2
3
crontab -e
# 매일 0시에 쉘 스크립트 실행
* 0 * * * /home/ubuntu/update_ssl.sh
Loading reactions