Después de tener nuestro servidor de correo básico funcionando, podemos integrar la firma DKIM a nuestros mensajes. Ésta se utiliza para validar que el mensaje de correo electrónico se ha enviado efectivamente por el servidor de nuestro dominio, ya que es el único que tiene la clave DKIM que lo firma. Necesitaremos por un lado agregar un registro a nuestra zona DNS con la firma que utilizaremos. Por otro lado, será necesario firmar los correos salientes.

Firma DKIM

Creamos el par de claves que necesitaremos para firmar los mensajes.

cd /usr/local/etc/mail
openssl genrsa -out dkim.key 2048
openssl rsa -in dkim.private.key -pubout -out dkim.public.key

Registro DNS

Se necesita publicar desde el DNS la clave DKIM para que los servidores de correo que reciban los mensajes, comprueben que efectivamente se han enviado desde el origen que se indica.

Creamos un registro TXT con la siguiente forma:

_domainkey.correo.com TXT "v=DKIM1;h=sha256;p=<public key>"

El contenido entre <> será el contenido del fichero que creamos anteriormente **dkim.public.key

Instalación de DKIMProxy

pkg install dkimproxy

Configuración de DKIMProxy

Crear y editar su fichero

cp /usr/local/etc/dkimproxy_out.conf.example /usr/local/etc/dkimproxy_out.conf
vi /usr/local/etc/dkimproxy_out.conf

Tal que

# specify what address/port DKIMproxy should listen on
listen    127.0.0.1:10027

# specify what address/port DKIMproxy forwards mail to
relay     127.0.0.1:10028

# specify what domains DKIMproxy can sign for (comma-separated, no spaces)
domain    correo.com

# specify what signatures to add
signature dkim(c=relaxed)
signature domainkeys(c=nofws)

# specify location of the private key
keyfile   /usr/local/etc/mail/dkim.private.key

# specify the selector (i.e. the name of the key record put in DNS)
selector  _domainkey

# control how many processes DKIMproxy uses
#  - more information on these options (and others) can be found by
#    running `perldoc Net::Server::PreFork'.
#min_servers 5
#min_spare_servers 2

Habilitamos el servicio

sysrc dkimproxy_out_enable="YES"

E iniciamos

service dkimproxy_out start

Configuración de reenvío en OpenSMTPd

Ahora hace falta reenrutar el correo para que salga firmado. Para eso hay que decirle al MTA que le mande el correo saliente a DKIMproxy, que lo firmará y se lo devolverá a OpenSMTPd para que esta vez lo envíe al destino que corresponda. Para esto se añaden las líneas listen y relay en /usr/local/etc/dkimproxy_out.conf, y modificamos las reglas del MTA en /usr/local/etc/mail/smtpd.conf

# Destino del correo firmado por dkimproxy
listen on lo0 port 10025 tag dkim_out

# Reenvío al MTA externo
action "relay_dkim" relay host smtp://127.0.0.1:10027
action "relay" relay helo mail.correo.com

# Reglas de entrega
match tag dkim_out for any action "relay"
match from any auth for any action "relay_dkim"