krijg DomeinKeys niet werkend (met php mail)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil DomainKeys-authenticated mail kunnen sturen vanaf m'n site met php's mail() functie.

Gebaseerd op de DomainKeys documentatie op sourceforge (en met name RFC4870) doe ik het volgende:


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
 
// init ssl key
$privatePem = 
"-----BEGIN RSA PRIVATE KEY-----
MIII5RV/0k9USo...etc...hXF2Vh7T4yfT5QN
-----END RSA PRIVATE KEY-----";
 
$encKey = @openssl_pkey_get_private( $privatePem );
if (!$encKey) die("Kan encryption key niet extracten");
 
// maak test emailtje
$to        = "voorbeeld@gmail.com"; // random gmail of yahoo test account
$myAddress = "naam@mijndomein.com";
$subject   = "Hallo";
$body      = "Dit is een test";
 
$fromHeader = "From: $myAddress";
 
// maak canoniek bericht (met 'simple' DomainKeys conventie)
$canonLines = array();
$canonLines[] = $fromHeader;
$canonLines[] = ""; // lege line tussen headers en body
$canonLines[] = $body; // body bestaat hier uit een regel (zonder line-ending)
 
$crlf = "\r\n";
$canonTxt = implode($crlf,$canonLines).$crlf;
 
// bepaal checksum
$hexHash = sha1($canonTxt);     // voor php4 compatibility (sha1 geeft een hex string), in php5 kun je 
$rawHash = pack('H*',$hexHash); // met sha1($txt,true) direct het binaire resultaat krijgen
 
// encrypt + encode
if (!@openssl_private_encrypt( $rawHash, $encryptedHash, $encKey )) die("Kan hash niet encrypten");
$dkey = base64_encode($encryptedHash);
 
// maak custom headers
$headers = "DomainKey-Signature: a=rsa-sha1; s=mail; d=mydomain.com; h=From; q=dns; c=simple; b=$dkey;";
$headers .= $crlf.$fromHeader;
 
// en verzenden maar
$success = mail( $to , $subject , $body , $headers );
die( $success ? "mail verzonden" : "mail NIET verzonden" );
 
?>

Ik heb de overeenkomstige public RSA key in de DNS van mijn domein ingesteld (policy en selector TXT records voor domainkey.mijndomein.com and mail._domainkey.mijndomein.com), en deze gecheckt met deze twee dingen. De policy is "o=~; t=y;"

Echter als ik met bovenstaande een mail verstuur, zeggen zowel gmail als yahoo:
domainkeys = bad or fail (bad sig) ;(

Ik heb die h=From expres in de domainkeys signature gestopt. De php mail() functie en SMTP server van mijn provider voegen zelf ook headers toe. Die kan ik anders niet in de checksum meenemen, dus daarom neem ik expres alleen een header die ik zelf kan bepalen en kan meenemen in de hash.

De uiteindelijke mail ziet er dus zo uit:
(...random headers...)
DomainKey-Signature: blablabla
From: my@address
(...nog wat headers...)

Body van een regel
dus door alleen de From: header te gebruiken weet ik zeker hoe de canonieke mail (waar de DomainKeys signature mee wordt berekend) eruit ziet.

Mocht er iemand weten hoe DomainKeys werkt en mij kan vertellen wat ik in godsnaam verkeerd doe, mijn eeuwige dank!

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Dit hebben wij opgelost door het 'z' veld op te nemen in de DKIM-SIG header. Daarmee kun je de originele header inhoud meegeven.

In jouw geval zou de header dan worden:
PHP:
1
$headers = "DomainKey-Signature: a=rsa-sha1; s=mail; d=mydomain.com; h=From:to; q=dns; c=simple; b=$dkey;z=from:$myAddress|to:$to";


Ik heb ook even het to veld opgenomen. Wij gebruiken de velden from, to, subject en date. values van headers in het Z veld dienen in printed quotable notatie te zijn (bijv. =20 voor een spatie)

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank voor de hulp, van die z tag had ik nog niet gehoord. Maar ik krijg het helaas nog niet werkend ;(

Je zegt dat je ook de To header meeneemt. Maar deze staat in de mail, zoals deze aankomt bij mijn gmail account, voor de DomainKey-Signature. Ik dacht dat het de bedoeling was dat alleen headers na die signature meetellen in die hash? (en dan nog alleen degene in de h= tag, indien aanwezig)

Ik heb ook zelf nog een keer een custom To header toegevoegd (na de From), maar dat maakte geen verschil. Ik heb ook die To uit de h= en z= tags gehaald, dus h werd weer alleen h=From; en z werd z=from:$myAddress; maar dat hielp ook niet.

Wat betreft dat Z veld:
values van headers in het Z veld dienen in printed quotable notatie te zijn (bijv. =20 voor een spatie)
Moet het dan geen from:=20$myAddress worden? (voor de spatie tussen de dubbele punt en het adres)
En moet From ook niet met een hoofdletter? (zo vul ik de echte header ook in)
En moet die dubbele punt (=3A) en het @ teken (=40) uit het adres ook niet worden ge-escaped?

Voor het geval dat, ik heb deze combinaties geprobeerd, de meest fail-safe leek mij:
z=From=3A=20naam=40mijndomein.com;
Maar helaas, ook dan werkt het nog niet.

Misschien enig idee wat het in godsnaam nog zou kunnen zijn??

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Ik ben niet zo heel erg bekend meer met PHP, maar volgens mij moet de header dan worden:
PHP:
1
2
3
<?php
$headers = "DomainKey-Signature: a=rsa-sha1; s=mail; d=mydomain.com; h=From; q=dns; c=simple; b=$dkey;z=from:$myAddress";
?>

Volgens de RFC 4871 dienen header velden case-INsentive benaderd te worden (de inhoud ervan is wel case sensitive). Het maakt dus niet uit of je dus 'From', 'FROM' of 'from' opgeeft als header. Verder moet je alleen de inhoud van het veld printed-quotable opnemen. 'z=From:naam=40mijndomein.com'

Overigens had ik het extra To veld opgenomen om te tonen hoe de scheidingen in de DKIM-SIG header opgenomen moeten worden. Als het 'z' veld aanwezig in de header, dan wordt de originele from header genegeerd en de inhoud van de velden uit de 'z' header gebruikt.

printed quotable is abstract gezien gelijk aan urlencoding, alleen wordt het procent teken (%20) vervangen door een 'gelijk aan' teken (=20).

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb nog diverse pogingen gedaan, maar niets werkte helaas.

Jij hebt het trouwens over DKIM, dat is niet precies hetzelfde als DomainKeys toch? Al overlappen ze wel, DKIM is een afgeleide van DomainKeys geloof ik. Kan daar misschien een (klein maar cruciaal) verschil tussen zitten? Weet je nog wat jij toen hebt gebruikt, DomainKeys of DKIM? Ik had zelf namelijk DomainKeys als uitgangspunt.

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Wat jij wilt is alleen een elektronische ondertekening van een bericht. Dat gedeelte heet DKIM-SIG. DomainKeys (authorization/authentication) gaat namelijk veel verder dan alleen mail. DKIM is het DomainKeys gedeelte voor mail verkeer. Je weet zeker dat de inhoud van je DNS records correct zijn?

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah, wist ik niet. Ik heb wel de DomainKeys specificaties (RFC4870) gevolgd en wat daar beschreven staat leek me toch wel een signature conventie, maar het zal best dat DomainKeys meer omvat.

Ja m'n DNS records zijn correct. Policy record is zoals in OP, mail._domainkey records is:
k=rsa; p=MEcG6...enz...AzT3B
(de public key hoort bij de private key in mijn PHP)

Maar ik ga het eens proberen met een DKIM-Signature! (conform de RFC 4871 specs die je postte)
Pagina: 1