DKIM configuration¶
Installation¶
# apt-get install opendkim opendkim-tools
Unix socket¶
Postfix and opendkim communicate through a unix socket. Socket address is usually the one specified in /etc/postfix/main.cf, but the default configuration of postfix in debian runs under a chroot (/var/spool/postfix) so the socket must be created in the jail:
# sockdir=/var/spool/postfix/var/run/opendkim
# mkdir -p $sockdir
# chown opendkim. $sockdir
# chmod go-rwx $sockdir
# chmod g+x $sockdir
Generate keys¶
Generate the key pair. To generate a secret signing key, you need to specify the domain used to send mails and a selector which is used to refer to the key (choose anything you like, alpha-numeric strings will do).
# opendkim-genkey -r -s myselector -b 2048 -d $domain.tld
This creates two files in /etc/dkimkeys/: myselector.private and myselector.txt, the private and public key. Make sure that only the opendkim user can read them:
chgrp opendkim /etc/dkimkeys/*
chmod go-rwx /etc/dkimkeys/*
Configuration¶
Copy the sample configuration file /etc/opendkim/opendkim.conf.sample (or /usr/share/doc/opendkim/opendkim.conf.sample) to /etc/opendkim/opendkim.conf and change:
Domain $domain.tld
KeyFile /path/to/keys/myselector.private
Selector myselector
Socket inet:8891@localhost
UserID opendkim
On debian, for the unix socket:
Syslog yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask 007
# DO NOT BELIEVE that /etc/default/opendkim overrides the following :
# (In stretch, it does not on 2019-08-13)
Socket local:/var/spool/postfix/var/run/opendkim/opendkim.sock
Multiple domains¶
If you are providing mail server service to multiple virtual domains on the same server, provide these directives:
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
You have to create/move/copy DKIM keys in a separate domain folder for each domain, for example
/etc/opendkim/keys/domain1.com/. Otherwise you will receive
dkim: FAILED, invalid (public key: not available)” error message with DKIM email test. You can use the same key
for all the domains or generate a separate key for each domain.
Edit the /etc/opendkim/KeyTable file to specify key locations:
myselector._domainkey.domain1.com domain1.com:mail:/etc/opendkim/keys/domain1.com/myselector.private
myselector._domainkey.domain2.com domain2.com:mail:/etc/opendkim/keys/domain2.com/myselector.private
Edit the /etc/opendkim/SigningTable file to specify which key will sign a domain.
*@domain1.com myselector._domainkey.domain1.com
*@domain2.com myselector._domainkey.domain2.com
In /etc/opendkim/TrustedHosts, add trusted domain and IP addresses who can use the keys. If needed, include localhost as it is not implicit.
127.0.0.1
::1
localhost
<some_server_ip>
hostname.domain1.com
domain1.com
hostname.domain2.com
domain2.com
...
This is referenced by the
ExternalIgnoreListdirective. Opendkim will ignore this list of hosts when verifying incoming mail.It is also referenced by the
InternalHostsdirective, this same list of hosts will be considered “internal,” and opendkim will sign their outgoing mail.
The flow for DKIM lookup starts with the sender’s address. The signing table is scanned until an entry whose pattern matches the address is found. Then, the second item’s value is used to locate the entry in the key table whose key information will be used. For incoming mail the domain and selector are then used to find the public key TXT record in DNS and that public key is used to validate the signature. For outgoing mail the private key is read from the named file and used to generate the signature on the message.
Postfix integration¶
To make Postfix listen to the unix socket on debian (set up as above):
Add user postfix to the opendkim group (postfix needs to be able to access the socket):
# adduser postfix opendkim
And append to /etc/postfix/main.cf:
milter_default_action = accept
milter_protocol = 6
# from inside the chroot, the socket will be in /var/run/opendkim
smtpd_milters = unix:/var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:/var/run/opendkim/opendkim.sock
Restart postfix¶
# systemctl restart postfix
DNS Configuration¶
Add a TXT record for your domain(s). For example: As a Hostname, use the myselector followed by the literal string ._domainkey and use as Text:
v=DKIM1; p=yourPublicKey
Or
v=DKIM1; h=sha256; k=rsa; s=email; p=yourPublicKey
Exact format may vary per DNS provider. Check the documentation for the exact style required.
Testing¶
Try to send a mail. Check
/var/log/mail.logTest the installation with
opendkim-testkey:
# opendkim-testkey -d $domain.tld -s myselector -vvv
Configuration resources¶
Breaking DKIM - on Purpose and by Chance, October 2017, Update 08/2018