스프링프로젝트 letsencrypt 의 SSL 을 적용해보자. post_hook
certbot 을 주기적으로 renew 한 후 , 인증서가 갱신되면 post_hook 으로
새로운 SSL 인증서 .pem 을 Spring Project 의 .pfx 로 변환하고, 스프링 프로젝트를 재실행 해주는 코드가 필요하다.
지난글의 https://blog.1day1.org/712 에서 언급한 pem => pfx 변환 코드를 좀더 개선했다.
개선한 코드는 letsencrypt의 pem 인증서의 날짜와 변환한 pfx 날짜를 비교해서 변환할지 체크하는 코드를 추가했다.
# cat lets-pem2pfx.sh
#!/bin/bash
if [ "$2" == "" ]; then
echo "Usage) $0 {domain} {out-dir/out-file.pfx} {convert-now}";
exit;
fi
out_dir=$PWD
domain=$1
out_file=$2
convert=$3
password=124345
######
lets_dir=/etc/letsencrypt/live
if [ "$convert" == "convert-now" ]; then
echo
else
certbot certificates --cert-name $domain
fi
ls -al $lets_dir
cd $lets_dir/$domain
# file mtime check.
echo
echo -n "Origin: "
echo `date +%s%N --reference cert.pem`
echo " "`date --reference cert.pem`
echo
echo -n "Target: "
echo `date +%s%N --reference $out_dir/$out_file`
echo " "`date --reference $out_dir/$out_file`
echo
if [ "cert.pem" -nt "$out_dir/$out_file" ]; then
printf '%s\n' "cert.pem is newer than $out_dir/$out_file : need to update new"
else
printf '%s\n' "cert.pem is older than $out_dir/$out_file"
echo "No action";
echo
exit 122 # fail code ( 0~256 )
fi
if [ "$convert" == "convert-now" ]; then
openssl pkcs12 -export \
-out $out_dir/$out_file \
-inkey privkey.pem -in cert.pem -certfile chain.pem \
-passin pass:$password -passout pass:$password
echo "Convert Done";
ls -al $out_dir/$out_file;
fi
exit 200;
# end file
위 코드를 기반으로 renew 시에 post_hook 에서 처리할 스크립트는 다음과 같다.
# cat renewal-ssl-restart.sh
#!/bin/bash
readlink=$(readlink -f $0)
dirpath=$(dirname $readlink)
echo
echo `date`
echo $dirpath;
cd $dirpath;
# convert pem 2 pfx - renewal pem
bash lets-pem2pfx.sh your-domain.com ssl/your-domain.com.pfx convert-now
retCode=$?
if [ "$retCode" == "200" ]; then
echo "convert-done - do action"
# restart - tomcat
echo "Shutdown..."
shutdown.sh
sleep 5
echo "Start up..."
startup.sh
fi
letsencrypt 의 인증서가 갱신이 되면 post_hook 으로 해당 코드를 실행하여,
pem => pfx 변환 / 스프링프로젝트 재실행 해준다. 위 프로젝트 재실행 코드는 본인에 맞게 수정하여 쓴다.
해당 코드를 콘솔에서 실행까지 테스트 한 후에 /etc/letsencrypt/renewal/yourdomain.conf 의 post_hook 에 넣어준다.
# Options used in the renewal process
[renewalparams]
authenticator = nginx
installer = nginx
account = af93d65834vadv37436bddsfh092ad2a
manual_public_ip_logging_ok = None
#pre_hook = systemctl stop nginx
post_hook = systemctl restart nginx ; bash /root/bin/renewal-ssl-restart.sh >> /var/log/nginx/renewal_ssl_restart-$(date +\%Y-\%m-\%d).log
server = https://acme-v02.api.letsencrypt.org/directory
다음 명령으로 테스트 해본다.
certbot renew --cert-name your-domain.com --dry-run
테스트 명령 후에 혹시 이런 에러가 보일 수 있다.
renewal-ssl-restart.sh >> /var/log/nginx/renewal_ssl_restart-$(date +\%Y-\%m-\%d).log
Error output from post-hook command systemctl:
Another instance of Certbot is already running.
해당 bash 코드에 certbot 확인하는 코드가 있었는데, 해당 코드를 post_hook 에서 실행되지 않게 고쳐줬다.(아래 부분이 고친 코드)
if [ "$convert" == "convert-now" ]; then
echo
else
certbot certificates --cert-name $domain
fi
위 코드는 인증서 확인용 코드인데, 없어도 무방하니 해당 부분 지워도 된다.
테스트 까지 완료했다면, 이제 기다리면 된다.
내가 쓰고 있는 인증서는 30일정도 후에 업데이트 될 듯 하다(잘 되길...)
'알아둘일' 카테고리의 다른 글
n8n 음 뭔가 쉽진 않군. (4) | 2024.09.07 |
---|---|
coolify + n8n 으로 자동화해보자 - 설치편 (feat. vultr) (1) | 2024.09.06 |
요즘 핫한 postgres (feat. supabase) (0) | 2024.08.20 |
스프링 프로젝트에 letsencrypt 인증서를 사용해보자 ( feat. pfx / PCKS12) (1) | 2024.08.06 |
letsencrypt 를 좀더 활용해보자. (feat. post_hook) (0) | 2024.08.04 |
WRITTEN BY
- 1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.