PHPMailer impossible de valider DKIM

Par Seeryos, il y a 7 ans


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éponses

Huggy, il y a 7 ans

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.

Seeryos, il y a 7 ans

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.

Seeryos, il y a 7 ans

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.