Admin Libre - Administración de sistemas y redes

Firma DKIM múltiple RSA y Ed25519 en OpenSMTPD con dkimsign
Por Francisco Gaitán el 4 de Mayo de 2022

El RFC 8463 describe el uso del algoritmo de firma Ed25519-SHA256 para DKIM (RFC 6376).

Gracias a los filtros de OpenSMTPD y a dkimsign es posible incluir una firma DKIM múltiple con RSA-1024 (para máxima compatibilidad) y Ed25519 como periodo de transición hasta que la firma Ed25519 sea comúnmente aceptada. No obstante, a día de hoy obtengo los mejores resultados usando una sola firma RSA de 1024 bits la cual aunque es menos segura es más compatible.

Trabajaré sobre la configuración de OpenSMTPD Setting up a mail server with OpenSMTPD, Dovecot and Rspamd escrito por su principal desarrollador, reemplazando Rspamd con dkimsign.

Instalación de dkimsign

Instalo el paquete con pkg_add, eligiendo la versión que soporta Ed25519:

$ doas pkg_add opensmtpd-filter-dkimsign
quirks-5.18 signed on 2022-05-03T20:55:38Z
Ambiguous: choose package for opensmtpd-filter-dkimsign
        0: <None>
        1: opensmtpd-filter-dkimsign-0.5
        2: opensmtpd-filter-dkimsign-0.5-ed25519
Your choice: 2

Generación de las llaves

El proceso viene explicado en /usr/local/share/doc/pkg-readmes/opensmtpd-filter-dkimsign, aunque yo usaré una llave RSA de 1024 bytes para una máxima compatibilidad.

Como diferencia con la documentación de dkimsign extraeré la llave pública como usuario _dkimsign y añadiré k=rsa para la llave RSA.

RSA-1024

Genero la llave:

$ doas -u _dkimsign openssl genrsa -out /etc/mail/dkim/example.com.rsa.key 1024
$ doas -u _dkimsign openssl rsa -in /etc/mail/dkim/example.com.rsa.key -pubout | sed '1s/.*/v=DKIM1;k=rsa;p=/;:nl;${s/-----.*//;q;};N;s/\n//g;b nl;' 

Usaré el selector 20220504-rsa. La llave pública se debe añadir como un registro TXT en el DNS en una línea:

20220504-rsa._domainkey.example.com. IN TXT "v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJaNB4WZs5uDMhHBqYl/PZf8OJBmpkHVE674AkbFIo0KtEm60AH8QJfGnuFgRQlmiuPvDScTs49Uq4mTntoDb/07gGNXffm77l63orNC7q0N+qg+wDxXDxQjw6PBvs3AuzpP6CNOCW+TU2L1GzA/eykzFKUP6kQnk5iVVYwU8HnwIDAQAB;"

Ed25519

Genero la llave:

$ doas -u _dkimsign eopenssl11 genpkey -algorithm ed25519 -outform PEM -out /etc/mail/dkim/example.com.ed25519.key

Obtengo la clave pública como indica la documentación:

printf "v=DKIM1;k=ed25519;p=%s" "$(eopenssl11 pkey -outform DER -pubout -in /etc/mail/dkim/example.com.ed25519.key | tail -c +13 | openssl base64)" 

Uso el selector 20220504-ed25591 y lo añado a la zona DNS:

20220504-ed25519._domainkey.example.com. IN TXT "v=DKIM1;k=ed25519;p=ZiBPo/mDeAI85YaNrBsQpcVUTRzPTEu+gcnuYpZIBvU="

Una vez hecho esto compruebo que los archivos .key no tengan permiso de lectura ni para el grupo ni para otros usuarios.

Configuración de OpenSMTPD

Estas son las líneas correspondientes que he cambiado partiendo de la configuración del tutorial de Gilles, firmando para los dominios example.com y example.net. También usaré la opción mask-src para ocultar la IP del cliente:

[...]
filter dkimsign_rsa proc-exec "filter-dkimsign -d example.com -d example.net -s 20220504-rsa -k /etc/mail/dkim/example.rsa.key" user _dkimsign group _dkimsign
filter dkimsign_ed25519 proc-exec "filter-dkimsign -a ed25519-sha256 -d example.com -d example.net -s 20220504-ed25519 -k /etc/mail/dkim/example.com.ed25519.key" user _dkimsign group _dkimsign
filter dkimsign chain { dkimsign_rsa, dkimsign_ed25519 }
[...]
listen on all port submission tls-require pki mail.example.com auth filter dkimsign \
   mask-src
[...]

De esta forma, gracias a la opción chain de OpenSMTPD los correos enviados tendrán las dos firmas. Esta es la práctica recomendada por el RFC como periodo de transición hasta que las firmas Ed25519 sean comúnmente aceptadas.

Como comprobar que funciona

Puedes usar un correo gratuito como Proton.me para enviar un correo a una de estas direcciones y mirar las cabeceras. Si todo ha ido bien verás algo así:

Authentication-Results: mail.example.com;
dkim=pass header.d=example.com header.i=@example.com header.a=ed5519-sha256 header.s=20221015-ed25519 header.b=awUlF57R;
dkim=pass (1024-bit key; unprotected) header.d=example.com header.i=@example.com header.a=rsa-sha256 header.s=20220425 header.b=jUwv0hOR;

También hay páginas para comprobar la configuración DKIM como appmaildev o mail-tester.com.

Destacado

Contacto

Si has encontrado algún error o quieres comentarme algo mándame un correo a webmaster@adminlibre.org