cert-renewal-haproxy.sh 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. # sudo ./cert-renewal-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/lib/haproxy"
  16. # Enable to redirect output to logfile (for silent cron jobs)
  17. # LOGFILE="/var/log/certrenewal.log"
  18. ######################
  19. ## utility function ##
  20. ######################
  21. function issueCert {
  22. $LE_CLIENT certonly --text --webroot --webroot-path ${WEBROOT} --renew-by-default --agree-tos --email ${EMAIL} $1 &>/dev/null
  23. return $?
  24. }
  25. function logger_error {
  26. if [ -n "${LOGFILE}" ]
  27. then
  28. echo "[error] [$(date +'%d.%m.%y - %H:%M')] ${1}" >> ${LOGFILE}
  29. fi
  30. >&2 echo "[error] ${1}"
  31. }
  32. function logger_info {
  33. if [ -n "${LOGFILE}" ]
  34. then
  35. echo "[info] [$(date +'%d.%m.%y - %H:%M')] ${1}" >> ${LOGFILE}
  36. else
  37. echo "[info] ${1}"
  38. fi
  39. }
  40. ##################
  41. ## main routine ##
  42. ##################
  43. le_cert_root="/etc/letsencrypt/live"
  44. if [ ! -d ${le_cert_root} ]; then
  45. logger_error "${le_cert_root} does not exist!"
  46. exit 1
  47. fi
  48. # check certificate expiration and run certificate issue requests
  49. # for those that expire in under 4 weeks
  50. renewed_certs=()
  51. exitcode=0
  52. while IFS= read -r -d '' cert; do
  53. if ! openssl x509 -noout -checkend $((4*7*86400)) -in "${cert}"; then
  54. subject="$(openssl x509 -noout -subject -in "${cert}" | grep -o -E 'CN=[^ ,]+' | tr -d 'CN=')"
  55. 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')"
  56. domains="-d ${subject}"
  57. for name in ${subjectaltnames}; do
  58. if [ "${name}" != "${subject}" ]; then
  59. domains="${domains} -d ${name}"
  60. fi
  61. done
  62. issueCert "${domains}"
  63. if [ $? -ne 0 ]
  64. then
  65. logger_error "failed to renew certificate! check /var/log/letsencrypt/letsencrypt.log!"
  66. exitcode=1
  67. else
  68. renewed_certs+=("$subject")
  69. logger_info "renewed certificate for ${subject}"
  70. fi
  71. else
  72. logger_info "none of the certificates requires renewal"
  73. fi
  74. done < <(find /etc/letsencrypt/live -name cert.pem -print0)
  75. # create haproxy.pem file(s)
  76. for domain in ${renewed_certs[@]}; do
  77. cat ${le_cert_root}/${domain}/privkey.pem ${le_cert_root}/${domain}/fullchain.pem | sudo tee ${le_cert_root}/${domain}/haproxy.pem >/dev/null
  78. if [ $? -ne 0 ]; then
  79. logger_error "failed to create haproxy.pem file!"
  80. exit 1
  81. fi
  82. done
  83. # soft-restart haproxy
  84. if [ "${#renewed_certs[@]}" -gt 0 ]; then
  85. $HAPROXY_RELOAD_CMD
  86. if [ $? -ne 0 ]; then
  87. logger_error "failed to reload haproxy!"
  88. exit 1
  89. fi
  90. fi
  91. exit ${exitcode}