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:
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:
Mocht er iemand weten hoe DomainKeys werkt en mij kan vertellen wat ik in godsnaam verkeerd doe, mijn eeuwige dank!
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:
dus door alleen de From: header te gebruiken weet ik zeker hoe de canonieke mail (waar de DomainKeys signature mee wordt berekend) eruit ziet.(...random headers...)
DomainKey-Signature: blablabla
From: my@address
(...nog wat headers...)
Body van een regel
Mocht er iemand weten hoe DomainKeys werkt en mij kan vertellen wat ik in godsnaam verkeerd doe, mijn eeuwige dank!