#!/usr/bin/env bash # @file Configure HTTPS certificates via Certbot # @brief Acquires initial Certbot Let's Encrypt certificates and adds a cronjob for certificate renewal # @description # This script ensures the system has Let's Encrypt SSL certificates loaded. It leverages the CloudFlare DNS method. # So long as your `.user.cloudflare.username` value in `home/.chezmoi.yaml.tmpl`, your `CLOUDFLARE_API_TOKEN` variable, # and your `.host.domain` value in `home/.chezmoi.yaml.tmpl` are available, then this process should work. The API token # only needs access to `DNS:Zone:Edit` for your `.host.domain` on CloudFlare. # # ## Links # # * [certbot-dns-cloudflare](https://certbot-dns-cloudflare.readthedocs.io/en/stable/) # * [CloudFlare API Tokens](https://dash.cloudflare.com/profile/api-tokens) # TODO: Integrate this into flow if command -v certbot > /dev/null; then ### Ensure configuration files are in place if [ -f "$HOME/.local/etc/letsencrypt/dns-cloudflare.ini" ] && [ -f "$HOME/.local/etc/letsencrypt/letsencryptcli.ini" ]; then logg info 'Copying Lets Encrypt / Certbot configurations to /etc/letsencrypt' sudo mkdir -p /etc/letsencrypt sudo cp -f "$HOME/.local/etc/letsencrypt/dns-cloudflare.ini" /etc/letsencrypt/dns-cloudflare.ini sudo cp -f "$HOME/.local/etc/letsencrypt/letsencryptcli.ini" /etc/letsencrypt/letsencryptcli.ini fi ### Ensure certificate is present if [ -f '/etc/letsencrypt/live/{{ .host.domain }}/cert.pem' ]; then logg info 'LetsEncrypt SSL certificate is already available' else logg info 'Acquiring certbot LetsEncrypt SSL certificates' certbot certonly --noninteractive --dns-cloudflare --agree-tos --email '{{ .user.cloudflare.username }}' --dns-cloudflare-propagation-seconds 14 -d '*.{{ .host.domain }},*.lab.{{ .host.domain }},*.{{ .host.hostname | replace .host.domain "" | replace "." "" }}.{{ .host.domain }}' fi ### Setup renewal cronjob if ! sudo crontab -l | grep "$(which certbot) renew --quiet" > /dev/null; then TMP="$(mktemp)" echo "30 3 * * * $(which certbot) renew --quiet" > "$TMP" logg info 'Adding certbot renew entry to crontab' sudo crontab < "$TMP" fi else logg warn 'certbot is not available. SSL certificate issuance cannot be run without it.' fi