PHPMailer impossible de valider DKIM

Ce sujet est résolu
Default
,

Bonjour à tous,

Un petit message car la calvitie me guète suite à mon acharnement avec PHPMailer. Le problème est le suivant :

Ce que je fais

1/ J'ai suivi les tutos de Grafikart et sur le net pour mettre en place un serveur dédié.
2/ J'ai installé et configuré PostFix correctement
3/ Les mails s'envoient correctement et pour cela j'utilise PHPMailer.
4/ Lorsque je teste mon score spam sur mail-tester.com, je perds 3 points car mon DKIM n'est pas valide...

Le problème c'est que le serveur est bien configuré et quand j'utilise cet outil : DKIMvalidator j'ai le message suivant

Validating Signature

result = fail
Details: OpenSSL error: data too small for key size

Et effectivement quand je lis le détail du message reçu par le serveur de l'outil de test j'ai :

DKIM Signature

Message contains this DKIM Signature:
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; l=502; s=mail;
    t=1530726481; c=relaxed/simple;
    h=From:To:Date:Subject;
    d=app.mondomaine.fr; i=support@app.mondomaine.fr;
    z=From:=20MonDomaine=20
    |To:=20Jgy2UCZCPi45U6@dkimvalidator.com
    |Date:=20Wed,=204=20Jul=202018=2019:48:01=20+0200
    |Subject:=20Test=20;
    bh=JH6gson/L8FfiBOXc8nUer5Yt0Wr5WFfOIFhhNCbumo=;
    b=


Signature Information:
v= Version:         1
a= Algorithm:       rsa-sha256
c= Method:          relaxed/simple
d= Domain:          app.mondomaine.fr
s= Selector:        mail
q= Protocol:        dns/txt
bh=                 JH6gson/L8FfiBOXc8nUer5Yt0Wr5WFfOIFhhNCbumo=
h= Signed Headers:  From:To:Date:Subject
b= Data:            
Public Key DNS Lookup

Building DNS Query for mail._domainkey.app.mondomaine.fr
Retrieved this publickey from DNS: v=DKIM1; k=rsa; t=s; s=email; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAYRSBjm+M/g483yCtwAuuKuCQwnLPLS3s0hfr6cASM8QaKS5V8tAXs2BrJvAUbuf7EIOKO8S/0HhVxpxT6aEO5vbh0U1nwp+rIzl/aPq+MC+7RBT+IHePbyxuzSfw3DRCOToFUi+fsYq1i0QjVJ2cBFR/BTTKk+4HzZfWfXrJ+QIDAQAB

Ce que je veux

Il faudrait que j'arrive à comprendre pourquoi l'attribut "b" du DKIM Signature est égale à ""...

Quand je regarde la class PHPMailer, je vois bien que le problème vient de cette fonction :

public function DKIM_Sign($signHeader)
    {
        if (!defined('PKCS7_TEXT')) {
            if ($this->exceptions) {
                throw new Exception($this->lang('extension_missing') . 'openssl');
            }

            return '';
        }
        $privKeyStr = !empty($this->DKIM_private_string) ?
            $this->DKIM_private_string :
            file_get_contents($this->DKIM_private);
        if ('' != $this->DKIM_passphrase) {
            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
        } else {
            $privKey = openssl_pkey_get_private($privKeyStr);
        }
        if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
            openssl_pkey_free($privKey);

            return base64_encode($signature);
        }
        openssl_pkey_free($privKey);

        return '';
    }

Mais je sèche lamentablement... J'ai pourtant activé l'extension SSL sur mon php.ini.

Ah et voici mon utilisation de phpMailer :

try{
        $mail = new PHPMailer\PHPMailer\PHPMailer();
        $mail->Priority = 3;
        $mail->From = 'support@app.mondomaine.fr';
        $mail->Sender = 'support@app.mondomaine.fr';
        $mail->FromName = 'App';
        $mail->DKIM_domain = 'app.mondomaine.fr';
        $mail->DKIM_private = '/var/dkim/dkim.private';
        $mail->DKIM_selector = 'mail';
        $mail->DKIM_passphrase = '';
        $mail->DKIM_identity = $mail->From;
        $mail->Encoding = "base64";
        $mail->AddAddress('jgy2uczcpi45u6@dkimvalidator.com');
        $mail->Subject = 'Test';
        $mail->IsHTML(TRUE);
        $mail->CharSet = "text/html; charset=UTF-8;";
        $mail->Body = '<html><body><p>Message de test en html</p></body></html>';
        $mail->AltBody = "Message de test en HTML";
        $mail->Send();


        jsonKill(Success('YESP'));

    }catch(Exception $e){
        jsonKill(Success('MEssage' + $e->getMessage()));
    }

Je vous remercie sincèrement pour l'aide que vous pourrez m'apporter !

3 Réponse

Default
,

Ok trouvé... L'utilisateur www-data n'avait pas les droits nécessaires pour accéder au ficher /var/dkim/private.key. C'était vraiment tout bête.
J'ai aussi encrypté la clé public en 2048.

Merci à tous.

44835
, Il a répondu à ma question !

Apparemment la taille de la clé privée qui a servi à signer n'est pas la même que celle de la clé publique sur ton dns
essaye de regénérer une paire de clés.

Default
, Il a répondu à ma question !

Salut Huggy,

Merci pour ta réponse. J'ai bien re-généré mes clés mais même problème... Je ne comprends pas.

Voici comment je génère mes clés :

openssl genrsa -out private.key 1024 -> Privée
openssl rsa -in private.key -pubout -out public.key => Public

Et mon paramètre b est toujours vide. Serait-il possible que se soit un problème de droit d'accès au fichier ? Pourtant si je met un chemin non valide, PHP Mailer me sort une erreur...

Mes clés sont dans /var/dkim/ et je ne pense que ça vienne de là. Par ailleurs ça m'embête de donner à l'utilisateur www-data les droits sur ce dossier.

EDIT : Je viens de migrer ma clé dans le répertoire public le temps d'un test et même soucis, le champ B est vide... :

La signature DKIM de votre message est :

v=1;
a=rsa-sha256;
q=dns/txt;
l=505;
s=mail;
t=1531387966;
c=relaxed/simple;
h=From:To:Date:Subject;
d=app.mydomain.fr;
i=support@app.mydomain.fr;
z=From:=20Test=20<
support@app.mydomain.fr>
|To:=20web-xkzph@mail-tester.com|Date:=20Thu,=2012=20Jul=202018=2011:32:46=20+0200|Subject:=20Test;
bh=VVCT+c7dEN6bxnAieNGCNjFPLW0Fb0eJE8NnB5AcuCY=;
b=

Après mon fichier à les droits suivants :
-rw------- 1 root root 887 juil. 12 10:24 private.key

ça viendrait de là ? Je suis une brêle en droit user sous Debian et Linux en général.