cert-renewal-haproxy.sh 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #/bin/bash
  2. # automation of certificate renewal for let's encrypt and haproxy
  3. # - checks all certificates under /etc/letsencrypt/live and renews
  4. # those about about to expire in less than 4 weeks
  5. # - creates haproxy.pem files in /etc/letsencrypt/live/domain.tld/
  6. # - soft-restarts haproxy to apply new certificates
  7. # usage:
  8. # ./cert-renew-haproxy.sh
  9. ###################
  10. ## configuration ##
  11. ###################
  12. EMAIL="your_le_account@email.com"
  13. LE_CLIENT="/path/to/letsencrypt-auto"
  14. HAPROXY_RELOAD_CMD="service haproxy reload"
  15. WEBROOT="/var/tmp"
  16. LOG_TO_FILE="/var/log/certrenew.log"
  17. ######################
  18. ## utility function ##
  19. ######################
  20. function issueCert {
  21. $LE_CLIENT certonly --text --webroot --webroot-path ${WEBROOT} --renew-by-default --agree-tos --email ${EMAIL} $1 > /dev/null
  22. return $?
  23. }
  24. function logger_warn {
  25. if [ -n "${LOG_TO_FILE}" ]
  26. then
  27. echo "[error] ${1}\n" >> ${LOG_TO_FILE}
  28. fi
  29. >&2 echo "[error] ${1}"
  30. }
  31. function logger_info {
  32. if [ -n "${LOG_TO_FILE}" ]
  33. then
  34. echo "[info] ${1}\n" >> ${LOG_TO_FILE}
  35. else
  36. echo "[info] ${1}"
  37. fi
  38. }
  39. ##################
  40. ## main routine ##
  41. ##################
  42. le_cert_root="/etc/letsencrypt/live"
  43. if [ ! -d ${le_cert_root} ]; then
  44. logger_warn "${le_cert_root} does not exist!"
  45. exit 1
  46. fi
  47. # check certificate expiration and run certificate issue requests
  48. # for those that expire in under 4 weeks
  49. renewed_certs=()
  50. exitcode=0
  51. while IFS= read -r -d '' cert; do
  52. if ! openssl x509 -noout -checkend $((4*7*86400)) -in "${cert}"; then
  53. subject="$(openssl x509 -noout -subject -in "${cert}" | grep -o -E 'CN=[^ ,]+' | tr -d 'CN=')"
  54. subjectaltnames="$(openssl x509 -noout -text -in "${cert}" | sed -n '/X509v3 Subject Alternative Name/{n;p}' | sed 's/\s//g' | tr -d 'DNS:' | sed 's/,/ /g')"
  55. domains="-d ${subject}"
  56. for name in ${subjectaltnames}; do
  57. if [ "${name}" != "${subject}" ]; then
  58. domains="${domains} -d ${name}"
  59. fi
  60. done
  61. issueCert "${domains}"
  62. if [ $? -ne 0 ]
  63. then
  64. logger_warn "failed to renew certificate! check /var/log/letsencrypt/letsencrypt.log!"
  65. exitcode=1
  66. else
  67. renewed_certs+=("$subject")
  68. logger_info "renewed certificate for ${subject}"
  69. fi
  70. fi
  71. done < <(find /etc/letsencrypt/live -name cert.pem -print0)
  72. # create haproxy.pem file(s)
  73. for domain in ${renewed_certs[@]}; do
  74. cat ${le_cert_root}/${domain}/privkey.pem ${le_cert_root}/${domain}/fullchain.pem > ${le_cert_root}/${domain}/haproxy.pem
  75. if [ $? -ne 0 ]; then
  76. logger_warn "failed to create haproxy.pem file!"
  77. exit 1
  78. fi
  79. done
  80. # soft-restart haproxy
  81. $HAPROXY_RELOAD_CMD
  82. if [ $? -ne 0 ]; then
  83. logger_warn "failed to create haproxy.pem file!"
  84. exit 1
  85. fi
  86. exit ${exitcode}