2010-03-24 16 views
16

Je vais admettre que je ne suis pas très habile à la vérification des clés. Ce que j'ai est un script qui télécharge des messages depuis un serveur POP3, et j'essaye de vérifier les signatures DKIM en PHP. J'ai déjà trouvé la vérification de validation du corps hash (bh), mais je ne peux pas comprendre la validation de l'en-tête.Comment vérifier une signature DKIM en PHP?

http://www.dkim.org/specs/rfc4871-dkimbase.html#rfc.section.6.1.3

Voici un exemple de mes têtes de message. J'ai été capable d'utiliser le paquet Mail :: DKIM pour valider la signature en Perl, donc je sais que c'est bon. Je ne peux pas sembler comprendre les instructions dans la RFC et les traduire en code PHP.

DomainKey-Signature: q=dns; a=rsa-sha1; c=nofws; 
    s=angrychimp-1.bh; d=angrychimp.net; 
    h=From:X-Outgoing; 
    b=RVkenibHQ7GwO5Y3tun2CNn5wSnooBSXPHA1Kmxsw6miJDnVp4XKmA9cUELwftf9 
    nGiRCd3rLc6eswAcVyNhQ6mRSsF55OkGJgDNHiwte/pP5Z47Lo/fd6m7rfCnYxq3 
DKIM-Signature: v=1; a=rsa-sha1; d=angrychimp.net; s=angrychimp-1.bh; c=relaxed/simple; 
    q=dns/txt; [email protected]; t=1268436255; 
    h=From:Subject:X-Outgoing:Date; 
    bh=gqhC2GEWbg1t7T3IfGMUKzt1NCc=; 
    b=ZmeavryIfp5jNDIwbpifsy1UcavMnMwRL6Fy6axocQFDOBd2KjnjXpCkHxs6yBZn 
    Wu+UCFeAP+1xwN80JW+4yOdAiK5+6IS8fiVa7TxdkFDKa0AhmJ1DTHXIlPjGE4n5; 
To: [email protected] 
Message-ID: <EF.CC.24859.F1DCA9B4> 
From: DKIM Tester <[email protected]> 
Reply-To: [email protected] 
Subject: Automated DKIM Testing (angrychimp.net) 
X-Outgoing: dhaka 
Date: Fri, 12 Mar 2010 15:24:15 -0800 
Content-Type: text/plain; charset=iso-8859-1 
Content-Transfer-Encoding: quoted-printable 
Content-Disposition: inline 
MIME-Version: 1.0 
Return-Path: [email protected] 
X-OriginalArrivalTime: 12 Mar 2010 23:25:50.0326 (UTC) FILETIME=[5A0ED160:01CAC23B] 

je peux extraire la clé publique de mon DNS très bien, et je crois que je canonisant les en-têtes correctement, mais je ne peux pas obtenir la signature validée. Je ne pense pas que je prépare ma clé ou que je calcule correctement la validation de la signature.

Est-ce que c'est quelque chose qui est possible (ai-je besoin d'extensions de poire ou quelque chose?) Ou est-ce que valider manuellement une signature DKIM en PHP n'est pas faisable?

+0

Je mets les en-têtes dans les étiquettes de code, si vous ne l'aimez pas, n'hésitez pas à revenir en arrière, mais je pense que c'est plus facile à lire. –

+0

Merci. Je pensais que j'avais fait ça, mais je suppose que j'ai foiré quelque chose. – angrychimp

+0

Avez-vous encore compris? – Xeoncross

Répondre

5

Le Mail :: DKIM a les dépendances suivantes sur d'autres bibliothèques:

  • Crypt :: OpenSSL :: RSA
  • Digest :: SHA
  • Mail :: Adresse (partie du paquet MailTools)
  • MIME :: Base64
  • net :: DNS

Tous ces Shoul d être disponible en PHP aussi. Donc, vérifiez manuellement la validité en PHP est contrôlable. Mail :: DKIM vérifie la signature "manuellement" avec ces libs. Peut-être que vous avez un pic dans la source de Mail :: DKIM?

De plus, "OpenDKIM Library (libopendkim)" est disponible. Vous pouvez construire un module PHP autour de cette bibliothèque comme d'autres personnes ont intégré OpenSSL, cURL, etc dans PHP.

Peut-être que vous pouvez fournir le code de votre fonction de vérification avec des données de test, afin que tout le monde puisse y jeter un coup d'œil?

HTH & Meilleures salutations

Michael

2

Essayez interopérer avec un outil externe ou une autre langue.

Vous pouvez envisager d'adapter l'outil externe pour ce faire ou utiliser la bibliothèque C qui a une meilleure prise en charge pour travailler avec DKIM. Vous pouvez également essayer d'intégrer via Perl ou Python.

+0

Je l'ai déjà fait pour l'instant, en passant mon contenu de message complet à un script Perl qui vérifie la signature en utilisant le paquet Mail :: DKIM. Je suis toujours à la recherche d'une solution native PHP, donc je vais mettre à jour cette question si/quand je suis capable de composer une classe ou une extension. Merci pour l'aide de tout le monde. – angrychimp

+0

Mieux vaut que votre MTA passe le courrier à travers quelque chose comme opendkim, et ensuite en PHP, vous vérifiez simplement le contenu de l'en-tête écrit par opendkim - en fonction de la façon dont vous manipulez ce courrier. Peut-être que vous devriez ajouter des détails sur ce que vous faites? – mc0e

2

Je crée nouveau projet dans googlecode. le nom était phpMailDomainSigner Il prend en charge DKIM-Signature et DomainKey-Signature dans le style orienté objet.