#!/bin/rc # This script generates and stores DKIM keypair, using the correct user # It outputs all paths generated in the following order for each algorithm: # - privkey # - txt record to be used in dns # # Example/intended usage: # dkimfiles = `$nl{dkim/mkcert } # rsakey = $dkimfiles(1) # rsatxt = $dkimfiles(2) # edkey = $dkimfiles(3) # edtxt = $dkimfiles(4) dir = /etc/mail/dkim user = _dkimsign selector = $1 ed = ed25519 rsaprivkey = $dir/$selector.rsa.priv.key rsapubkey = $dir/$selector.rsa.pub.key rsatxt = $dir/$selector.rsa.txt edprivkey = $dir/$selector.$ed.priv.key edpubkey = $dir/$selector.$ed.pub.key edtxt = $dir/$selector.$ed.txt files = ( $rsaprivkey $rsapubkey $rsatxt \ $edprivkey $edpubkey $edtxt ) fn err { echo $* >[1=2] } fn die { err fatal error: $* exit 1 } fn as { doas -u $user $* } fn mustsucceed { if (!$*) { err fatal error: essential command failed cleanupfailed exit 1 } } fn cleanupfailed { for (f in $files) { as rm $f [2]>/dev/null } } if (!~ $#* 1) { err 'usage: dkim/mkcert ' exit 2 } for (f in $files) { as test -e $f && die $f already exists } mustsucceed as mkdir -p $dir # RSA mustsucceed as openssl genrsa -out $rsaprivkey mustsucceed as openssl rsa -in $rsaprivkey -pubout | \ mustsucceed as tee $rsapubkey >/dev/null mustsucceed as cat $rsapubkey | \ mustsucceed as sed '1s/.*/v=DKIM1;p=/;:nl;${s/-----.*//;q;};N;s/\n//g;b nl;' | \ mustsucceed as tee $rsatxt >/dev/null # ED25519 mustsucceed as openssl genpkey -algorithm $ed -out $edprivkey mustsucceed as openssl pkey -outform DER -pubout -in $edprivkey | \ mustsucceed tail -c +13 | mustsucceed openssl base64 | \ mustsucceed as tee $edpubkey >/dev/null mustsucceed printf 'v=DKIM1;k=%s;p=%s\n' $ed `$nl{mustsucceed as cat $edpubkey} | \ mustsucceed as tee $edtxt >/dev/null err 'Paths generated (rsa privkey, rsa dns record, ed25519 privkey, ed25519 dns record):' echo $rsaprivkey echo $rsatxt echo $edprivkey echo $edtxt