summaryrefslogtreecommitdiff
path: root/dkim/mkcert
blob: 96c1637401113a0d7650fe44cca064b7c2f51d67 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/rc

# This script generates and stores DKIM keypair, using the correct user
# It outputs all paths generated in the following order:
#  - privkey
#  - pubkey
#  - txt record to be used in dns
#
# Example/intended usage:
#  dkimfiles = `$nl{dkim/mkcert <selector>}
#  privkey   = $dkimfiles(1)
#  txtfile   = $dkimfiles(2)
#
# There is no real need for the pubkey to be stored as its own file.

dir      = /etc/mail/dkim
user     =_dkimsign_
selector = $1
privkey  = $dir/$selector.priv.key
pubkey   = $dir/$selector.pub.key
txt      = $dir/$selector.txt

fn err {
	echo $* >[1=2]
}

fn die {
	err fatal error: $*
	exit 1
}

fn mustsucceed {
	if (!$*) {
		err fatal error: essential command failed
		cleanupfailed
		exit 1
	}
}

fn cleanupfailed {
	as rm $privkey
	as rm $pubkey
	as rm $txt
}

fn as {
	doas -u _dkimsign $*
}

if (!~ $#* 1) {
	err 'usage: mkcert <selector>'
	exit 2
}


as test -e $privkey && die $privkey already exists
as test -e $pubkey  && die $pubkey already exists
as test -e $txt     && die $txt already exists

mustsucceed as mkdir -p $dir

mustsucceed as openssl genrsa -out $privkey
mustsucceed as openssl rsa -in $privkey -pubout | \
	mustsucceed as tee $pubkey >/dev/null
mustsucceed as cat $pubkey | \
	mustsucceed as sed '1s/.*/v=DKIM1;p=/;:nl;${s/-----.*//;q;};N;s/\n//g;b nl;' | \
	mustsucceed as tee $txt >/dev/null

err 'Paths generated (privkey, pubkey, txt dns record):'
echo $privkey
echo $pubkey
echo $txt