How to set up/manage services on a computer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.1 KiB

use Certbot to automatically generate and renew Let's Encrypt certificates for HAproxy

Install

install haproxy & certbot:

apt install haproxy certbot

configure haproxy

we need to configure haproxy to reroute Let's Encrypt requests to the certbot server. Add to your web frontend the directive:

frontend www
        bind *:80

	    ...
		
        # Reroute certbot requests to certbot
        use_backend certbot if { path_beg /.well-known/acme-challenge/ }

and also add a backend:

backend certbot
        mode http
        server certbot-1 localhost:${port:?}

and then add an update script to /usr/local/admin/bin/certbot-haproxy:

#!/bin/bash

create() {
        certbot certonly --standalone -d $1 --non-interactive --agree-tos --email $email --http-01-port=$port
}

renew() {
        certbot renew --tls-sni-01-port=$port
}

concat() {
        # Only do the concat if the live cert file is newer than the combined file
        if [[ /etc/letsencrypt/live/$1/fullchain.pem -nt /etc/haproxy/certs/$1.pem ]]; then
                mkdir -p /etc/haproxy/certs
                cat /etc/letsencrypt/live/$1/fullchain.pem /etc/letsencrypt/live/$1/privkey.pem > /etc/haproxy/certs/$1.pem
                #etckeeper commit "got new Let's Encrypt certificate for $1"
        fi
}

# Main Execution
if [[ (-z $1) || ("$1" != "create" && "$1" != "renew") ]]; then
        echo "Improper argument: expecting \"create\" or \"renew\""
        exit 1
fi

. /etc/haproxy/certbot.cfg.sh

for site in ${sites[@]}; do
        $1 $site
        concat $site
done

and don't forget to make it executable:

chmod +x /usr/local/admin/bin/certbot-haproxy

finally, we will make a config file for our certbot script in /etc/haproxy/certbot.cfg.sh:

#!/bin/bash

# domains certbot should get certificates for
sites=(
        medusa.alemor.org
)

# port that the standalone certbot server should use
port=8888

# email that you will give to Let's Encrypt
email=letsencrypt@mario.alemor.org

and make it executable as well:

chmod +x /etc/haproxy/certbot.cfg.sh