pfou, ça fait longtemps ..
et après un mailing plein de retours spams, je me suis dit qu’il fallait quand même implémenter dkim dans mon vieux qmail (et après .. dmarc)
les docs de qmailrock sont bien , les scripts domainkey qmail-remote sont lisibles, et sagredo.eu a une autre approche mais plus complexe, je choisis qmailrock car c’est assez simple de signer un message en mettant un shell à la place de qmail-remote.
…sauf que libdkimtest, version19 ou version21, ne fait pas des supercalculs, et je suis rejeté comme quoi le message est altéré.
heureusement ça existe en perl, et c’est bien plus facile que cpp mail::dkim. Comme j’ai fait quelques remix et simplifications , en gros je prends la méthode et les scripts de qmailrock, en remplaçant lidkimtest par le module perl :
le remplaçant de qmail-remote (qui lui est renommé qmail-remote-binary)
#!/bin/sh
# DKIM signing for qmail
# Author: Joerg Backschues + gyu kastenbaum
[ "$DKSIGN" ] || DKSIGN="/etc/domainkeys/%/default"
[ "$DKREMOTE" ] || DKREMOTE="/var/qmail/bin/qmail-remote-binary"
[ "$DKIMPL" ] || DKIMPL="/var/qmail/bin/dkim.pl"
# parent domains (see RFC 4871 3.8)
FQDN=${2##*@}
TLD=`echo $FQDN | awk 'BEGIN {FS = "."} {print $NF}'`
DOM=`echo $FQDN | awk 'BEGIN {FS = "."} {print $(NF-1)}'`
# get domainkey file
if [[ $DKSIGN == *%* ]] ; then
DOMAIN=$DOM.$TLD
DKSIGN="${DKSIGN%%%*}${DOMAIN}${DKSIGN#*%}"
fi
if [ -f "$DKSIGN" ] ; then
# domain with domainkey # sign message
cat - | $DKIMPL $DOMAIN | "$DKREMOTE" "$@"
retval=$?
echo "qmail-remote: domainkey for $2" | /var/qmail/bin/splogger qmail;
exit $retval
else
# domain without domainkey
exec "$DKREMOTE" "$@"
fi
le bout de perl qui signe un message
#!/usr/bin/perl
use Mail::DKIM::Signer;
use Mail::DKIM::TextWrap; #recommended
my $dom=$ARGV[0];
my $key="/etc/domainkeys/$dom/default";
if (! -f $key ) {
print while (<STDIN>);exit;
}
# create a signer object
my $dkim = Mail::DKIM::Signer->new(
Algorithm => "rsa-sha256",
Method => "simple/relaxed",
Domain => $dom,
Selector => "default",
KeyFile => $key,
);
my $output="";
while (<STDIN>)
{
$output=$output.$_;
# remove local line terminators
chomp;
s/\015$//;
# use SMTP line terminators
$dkim->PRINT("$_\015\012");
}
$dkim->CLOSE;
# what is the signature result?
my $signature = $dkim->signature;
my $outsign = $signature->as_string."\n";
$outsign =~ s/\015$//gm;
print $outsign;
print $output;
bon… faudrait être plus fin sur la config, mais déjà ça passe…
merci aussi à qmailrocks.thibs.com/downloads/scripts/ , à http://dkimvalidator.com et à https://www.altospam.com/actualite/2014/01/des-outils-de-verification-des-emails-pour-eviter-detre-considere-spammeur/