Skip to content

Instantly share code, notes, and snippets.

@richardevcom
Created April 12, 2022 22:57
Show Gist options
  • Save richardevcom/a79e8ca313c2b6f34f9ea8c02959165c to your computer and use it in GitHub Desktop.
Save richardevcom/a79e8ca313c2b6f34f9ea8c02959165c to your computer and use it in GitHub Desktop.

Revisions

  1. richardevcom created this gist Apr 12, 2022.
    110 changes: 110 additions & 0 deletions add-opendkim-key.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,110 @@
    #!/bin/bash

    # Which domain?
    get_domain(){
    printf "\n"
    read -p "Domain: " DOMAIN
    }

    # Is domain set?
    domain_is_set(){
    if [ -z "$DOMAIN" ]; then
    return 1
    fi
    }

    # Is domain valid?
    domain_is_valid(){
    if echo $DOMAIN | grep -P '(?=^.{4,253}$)(^(?:[a-zA-Z0-9](?:(?:[a-zA-Z0-9\-]){0,61}[a-zA-Z0-9])?\.)+([a-zA-Z]{2,}|xn--[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])$)' >/dev/null 2>&1; then
    return 0
    else
    return 1
    fi
    }

    # Prompt try again
    try_again() {
    printf "\n"
    read -p "Try again? (Y|N)" -n 1

    if [[ $REPLY =~ ^[Yy]$ ]]
    then
    return 0
    else
    return 1
    fi
    }

    # Sign DKIM in table
    dkim_add_signing_table() {
    DKIM_SIGN_STRING="*@$DOMAIN\t\tdefault._domainkey.$DOMAIN"
    if grep -Fxq "$DOMAIN" /etc/opendkim/signing.table; then
    echo "DKIM already signed in /etc/opendkim/signing.table"
    else
    echo -e $DKIM_SIGN_STRING >> /etc/opendkim/signing.table
    echo "Added $DKIM_SIGN_STRING to /etc/opendkim/signing.table"
    fi
    }

    # Add key to table
    dkim_add_key_table(){
    DKIM_KEY_STRING="default._domainkey.$DOMAIN\t$DOMAIN:default:/etc/opendkim/keys/$DOMAIN/default.private"
    if grep -Fxq "$DOMAIN" /etc/opendkim/key.table; then
    echo "DKIM key already in /etc/opendkim/key.table"
    else
    echo -e $DKIM_KEY_STRING >> /etc/opendkim/key.table
    echo "Added $DKIM_KEY_STRING to /etc/opendkim/key.table"
    fi
    }

    # Add domain to trusted hosts
    add_trusted_host(){
    TRUSTED_HOST_STRING="*.$DOMAIN"
    if grep -Fxq "$DOMAIN" /etc/opendkim/trusted.hosts; then
    echo "Domain already in /etc/opendkim/trusted.hosts"
    else
    echo -e $TRUSTED_HOST_STRING >> /etc/opendkim/trusted.hosts
    echo "Added $TRUSTED_HOST_STRING to /etc/opendkim/trusted.hosts"
    fi
    }

    mkdirs(){
    mkdir /etc/opendkim/keys/$DOMAIN
    }

    mkkeys(){
    opendkim-genkey -b 2048 -d $DOMAIN -D /etc/opendkim/keys/$DOMAIN -s default -v
    }

    own(){
    chown opendkim:opendkim /etc/opendkim/keys/$DOMAIN/default.private
    chmod 600 /etc/opendkim/keys/$DOMAIN/default.private
    }

    while true; do
    get_domain
    if ! domain_is_set || ! domain_is_valid; then
    echo -ne "Please provide valid domain name (ex. domain.com)."
    if ! try_again; then
    break
    fi
    else
    dkim_add_signing_table
    dkim_add_key_table
    add_trusted_host
    mkdirs
    mkkeys
    own

    printf "\n"
    echo "You can now add these DNS records as follows:"
    echo "---------------------------------------------"
    echo " TXT @ v=spf1 mx ~all"
    # Print DKIM
    cat /etc/opendkim/keys/$DOMAIN/default.txt

    break
    fi
    done

    exit 0
    6 changes: 6 additions & 0 deletions test-dkim-key.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,6 @@
    #!/bin/bash

    printf "\n"
    read -p "Domain: " DOMAIN

    opendkim-testkey -d $DOMAIN -s default -vvv