| 
          #!/bin/bash | 
        
        
           | 
          # Certbot automated renewal script by AfroThundr | 
        
        
           | 
          # Uses the tls-alpn-01 challenge for renewal | 
        
        
           | 
          # This runs twice since I use two certificates (RSA and ECDSA) | 
        
        
           | 
          # Version 1.2.2 updated 20190509 | 
        
        
           | 
          
 | 
        
        
           | 
          # Declare some variables... | 
        
        
           | 
          dom=example.com | 
        
        
           | 
          cfg=/etc/letsencrypt/cli.ini | 
        
        
           | 
          dirs=( /etc/ssl/private/letsencrypt{1,2} ) | 
        
        
           | 
          service=apache2 | 
        
        
           | 
          
 | 
        
        
           | 
          cbot="certbot certonly --standalone --preferred-challenges tls-alpn-01 \ | 
        
        
           | 
              --config $cfg --keep-until-expiring --agree-tos --expand" | 
        
        
           | 
          
 | 
        
        
           | 
          for dir in ${dirs[@]}; do | 
        
        
           | 
              # Check if cert is close to expiring first | 
        
        
           | 
              printf 'Checking for certificate expiration...\n' | 
        
        
           | 
              now=$(date -ud "now" +%s) | 
        
        
           | 
              exp=$(date -ud "$(openssl x509 -in ${dir}/${dom}.crt -enddate -noout | | 
        
        
           | 
                  cut -d= -f 2)" +%s) | 
        
        
           | 
              days_exp=$(bc <<< "( $exp - $now ) / 86400") | 
        
        
           | 
          
 | 
        
        
           | 
              # Begin renewal process only if cert is expiring soon | 
        
        
           | 
              if [[ $days_exp -le ${days_min:=3} ]]; then | 
        
        
           | 
                  printf 'Certificate expiring soon, proceeding with renewal.\n' | 
        
        
           | 
          
 | 
        
        
           | 
                  # Stop web server if running, then leave flag | 
        
        
           | 
                  [[ $RENEW == true ]] || { systemctl stop $service; RENEW=true; } | 
        
        
           | 
          
 | 
        
        
           | 
                  # Backup existing files, then renew cert | 
        
        
           | 
                  if [[ -f ${dir}/${dom}.crt ]]; then | 
        
        
           | 
                      mv ${dir}/${dom}.crt{,.bak} | 
        
        
           | 
                      mv ${dir}/ca-chain.pem{,.bak} | 
        
        
           | 
                      mv ${dir}/${dom}.pem{,.bak} | 
        
        
           | 
                  fi | 
        
        
           | 
          
 | 
        
        
           | 
                  printf 'Running renewal on %s\n' "${dir}/${dom}.crt" | 
        
        
           | 
                  $cbot --csr ${dir}/${dom}.csr --cert-path ${dir}/${dom}.crt \ | 
        
        
           | 
                      --chain-path ${dir}/ca-chain.pem --fullchain-path ${dir}/${dom}.pem | 
        
        
           | 
          
 | 
        
        
           | 
                  # If successful, remove backups; if not, revert | 
        
        
           | 
                  if [[ -f ${dir}/${dom}.crt ]]; then | 
        
        
           | 
                      rm -f ${dir}/*.bak | 
        
        
           | 
                      chmod 0600 ${dir}/* | 
        
        
           | 
                  else | 
        
        
           | 
                      mv ${dir}/${dom}.crt{.bak,} | 
        
        
           | 
                      mv ${dir}/ca-chain.pem{.bak,} | 
        
        
           | 
                      mv ${dir}/${dom}.pem{.bak,} | 
        
        
           | 
                  fi | 
        
        
           | 
          
 | 
        
        
           | 
                  printf 'Certificate renewal complete.\n' | 
        
        
           | 
              fi | 
        
        
           | 
               | 
        
        
           | 
              # Start web server, if stopped by us | 
        
        
           | 
              [[ $RENEW == true ]] && systemctl start $service | 
        
        
           | 
          done | 
        
        
           | 
          
 | 
        
        
           | 
          # Nothing to do, time to go. | 
        
        
           | 
          printf 'Certificates are up to date, exiting.\n' | 
        
        
           | 
          exit 0 |