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

© 2024 Hopoduck. All rights reserved.