¿Cómo verifico una firma DKIM en PHP?

Admitiré que no soy muy hábil en la verificación de claves. Lo que tengo es un script que descarga mensajes de un servidor POP3, y estoy intentando verificar las firmas DKIM en PHP. Ya he averiguado la comprobación de validación de hash de cuerpo (bh), pero no puedo entender la validación de encabezado.

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

A continuación se muestra un ejemplo de mis encabezados de mensajes. He podido usar el paquete Mail :: DKIM para validar la firma en Perl, así que sé que es bueno. Simplemente no puedo entender las instrucciones en el RFC y traducirlas al código 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; i=@angrychimp.net; t=1268436255; h=From:Subject:X-Outgoing:Date; bh=gqhC2GEWbg1t7T3IfGMUKzt1NCc=; b=ZmeavryIfp5jNDIwbpifsy1UcavMnMwRL6Fy6axocQFDOBd2KjnjXpCkHxs6yBZn Wu+UCFeAP+1xwN80JW+4yOdAiK5+6IS8fiVa7TxdkFDKa0AhmJ1DTHXIlPjGE4n5; To: iptest@example.com Message-ID:  From: DKIM Tester  Reply-To: noreply@angrychimp.net 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: noreply@angrychimp.net X-OriginalArrivalTime: 12 Mar 2010 23:25:50.0326 (UTC) FILETIME=[5A0ED160:01CAC23B] 

Puedo extraer la clave pública de mi DNS, y creo que estoy canonizando los encabezados correctamente, pero no puedo validar la firma. No creo que estoy preparando mi clave o calculando la validación de la firma correctamente.

¿Es esto posible (¿necesito extensiones de pera o algo así?) O validar manualmente una firma DKIM en PHP no es posible?

El Mail :: DKIM tiene las siguientes dependencias en otras bibliotecas:

  • Crypt :: OpenSSL :: RSA
  • Digest :: SHA
  • Mail :: Address (parte del paquete MailTools)
  • MIME :: Base64
  • Net :: DNS

Todos estos deberían estar disponibles en PHP también. Entonces, compruebe manualmente que la validación en PHP es controlable. Mail :: DKIM está verificando la firma “manualmente” con esas libs. ¿Quizás tengas un pico en la fuente de Mail :: DKIM?

Adicionalmente, ” OpenDKIM Library (libopendkim) ” está disponible. Puedes construir un módulo PHP alrededor de esta biblioteca como otras personas han integrado OpenSSL, cURL, etc. en PHP.

Tal vez pueda proporcionar el código de su función de verificación con algunos datos de prueba, para que todos puedan echarle un vistazo.

HTH y Saludos cordiales

Miguel

Intente interoperar con una herramienta externa u otro idioma.

Puede considerar la posibilidad de adaptar la herramienta externa para hacer eso o usar la biblioteca C, que tiene una mejor compatibilidad para trabajar con DKIM. También puede intentar integrar a través de Perl o Python.

Creo un nuevo proyecto en googlecode. el nombre era phpMailDomainSigner Admite DKIM-Signature y DomainKey-Signature en Object Oriented Style.