Working DKIM example
Esempio pratico di verifica di una firma DKIM
Premessa
Per la verifica della firma crittografica useremo OpenSSL, una spiegazione più approfondita sul funzionamento della firma a chiave pubblica può essere trovato su Wikipedia:Public-key cryptography. L'esempio sotto é tratto sempre dal messaggio File:Da GMX a Mail-Tester.txt scelto proprio per la sua brevità e semplicità
Considerazioni di base
Per poter verificare la validità di una firma crittografica servono tre elementi: La parte pubblica della chiave, la firma crittografica e il messaggio da verificare.
Chiave RSA pubblica
Per recuperare la chiave RSA pubblica andremo ad interrogare il DNS che viene ricavato a partire dai tag s=s31663417
(selettore) e d=gmx.ch
(dominio)
s31663417._domainkey.gmx.ch. 3600 IN TXT "v=DKIM1; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAujKq2O+04tKe1Z8z5K852dJIqyreVB8jR4Z8PpIVR3dzbLcJt/cDivXpJBFJ8jFU63jT5lNcTthBxXP+7t8lp6nDoW6Vlvzkp4W/Wts9U8ZIOXBkw4hOTzVTdsk0aKGASrf9USh7JN9PT61bP2nXJ1GnnuiJ4o8EabE8MqwPELUuCd1+my+8pMsQ/wqqDWKu1lVDW0n9" "9+uL/fAcc3tN4xrl4qBCBfuo/Do/hnyEJeuVLq3nxpCBClYROspfdrpQ2fDul2TIzdqDJcbsf/n62yrydNwHsSl9HPaQc98pxyix9zFGCRHlf08F2livgBjwVQ7Evzmag8Qc8meoqsyHMwIDAQAB"
dove la stringa valorizzata nel tag p=
rappresenta la chiave RSA pubblica in formato PEM. Da notare che, per le limitazioni del protocollo la chiave é stata spezzata in due parti che andranno riunite. La chiave risultante sarà quindi la seguente:
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAujKq2O+04tKe1Z8z5K85 2dJIqyreVB8jR4Z8PpIVR3dzbLcJt/cDivXpJBFJ8jFU63jT5lNcTthBxXP+7t8l p6nDoW6Vlvzkp4W/Wts9U8ZIOXBkw4hOTzVTdsk0aKGASrf9USh7JN9PT61bP2nX J1GnnuiJ4o8EabE8MqwPELUuCd1+my+8pMsQ/wqqDWKu1lVDW0n99+uL/fAcc3tN 4xrl4qBCBfuo/Do/hnyEJeuVLq3nxpCBClYROspfdrpQ2fDul2TIzdqDJcbsf/n6 2yrydNwHsSl9HPaQc98pxyix9zFGCRHlf08F2livgBjwVQ7Evzmag8Qc8meoqsyH MwIDAQAB -----END PUBLIC KEY-----
Firma
La firma crittografica vera e propria é quella codificata in Base64 nel tag b=
dell'header DKIM-Signature:
ovvero:
I+MuEdkjdMoa9Bx3JIp+KpqE4XD+Pl9FfBM90vZsDe+N2gDoEnsQb6CJ/JVxPTng1z5s2NR5uj7/ UCC0+uBazEWygr2iiHhvq5X9l0hlo27wFkdCgYYbv13iMc8zgV8EMLBaQSaMe/NMdIa1ZwfFwA2l n39GHeWzNhBnR/wJlSnA1o6HeIc5Oirv1JOH1F0pnahJ0S43n2BSkY0zbOJYwHrq9RuHqypM25dZ purUWZju5nC7yu+WhK+zPvHguLHqPih158Xo48Dg/z54ENinhrgLyD4Ydr7/kX2TAFGVBANIk9pq H/o3qCT8E5mXXbPPP1lV5J3LgNGvmrO8RNilcw==
Per usarla con OpenSSL verrà comunque scritta in formato binario.
Header
Ricordiamo ancora una volta che quello che viene firmato sono alcuni header selezionati e normalizzati dal mittente, in questi header é contenuto anche l'hash (di una parte) del corpo del messaggio vero e proprio. Della normalizzazione abbiamo già parlato prima, il dump esadecimale degli header é quindi:
00000000: 782d 7569 2d73 656e 6465 722d 636c 6173 733a 3732 3462 3466 x-ui-sender-class:724b4f 00000018: 3766 2d63 6265 632d 3431 3939 2d61 6434 652d 3539 3863 3031 7f-cbec-4199-ad4e-598c01 00000030: 6135 3064 3361 0d0a 6672 6f6d 3a41 6c65 7373 616e 6472 6f20 a50d3a..from:Alessandro 00000048: 4361 7269 6e69 203c 6361 7269 6e69 4067 6d78 2e63 683e 0d0a Carini <carini@gmx.ch>.. 00000060: 746f 3a74 6573 742d 7473 6130 6876 6f72 6d40 7372 7631 2e6d to:test-tsa0hvorm@srv1.m 00000078: 6169 6c2d 7465 7374 6572 2e63 6f6d 0d0a 7375 626a 6563 743a ail-tester.com..subject: 00000090: 444b 494d 2054 6573 740d 0a64 6174 653a 5375 6e2c 2031 3420 DKIM Test..date:Sun, 14 000000a8: 4a61 6e20 3230 3234 2031 383a 3437 3a31 3220 2b30 3130 300d Jan 2024 18:47:12 +0100. 000000c0: 0a64 6b69 6d2d 7369 676e 6174 7572 653a 763d 313b 2061 3d72 .dkim-signature:v=1; a=r 000000d8: 7361 2d73 6861 3235 363b 2063 3d72 656c 6178 6564 2f73 696d sa-sha256; c=relaxed/sim 000000f0: 706c 653b 2064 3d67 6d78 2e63 683b 2073 3d73 3331 3636 3334 ple; d=gmx.ch; s=s316634 00000108: 3137 3b20 743d 3137 3035 3235 3434 3332 3b20 783d 3137 3035 17; t=1705254432; x=1705 00000120: 3835 3932 3332 3b20 693d 6361 7269 6e69 4067 6d78 2e63 683b 859232; i=carini@gmx.ch; 00000138: 2062 683d 712f 3239 3166 6367 5157 6670 4e37 6876 4138 4c33 bh=q/291fcgQWfpN7hvA8L3 00000150: 7949 4246 7679 3269 6b70 792f 3574 6368 6a74 4930 3064 453d yIBFvy2ikpy/5tchjtI00dE= 00000168: 3b20 683d 582d 5549 2d53 656e 6465 722d 436c 6173 733a 4672 ; h=X-UI-Sender-Class:Fr 00000180: 6f6d 3a54 6f3a 5375 626a 6563 743a 4461 7465 3b20 623d om:To:Subject:Date; b=
Verifica
La verifica manuale, ponendo di avere:
- La chiave pubblica nel file
s31663417._domainkey.gmx.ch.pem
in formato PEM - La firma RSA in binario nel file
signature.bin
- Gli header normalizzati nel file
headers.txt
Verrà semplicemente fatta con il comando
host:~> openssl dgst -sha256 -verify ./s31663417._domainkey.gmx.ch.pem -signature ./signature.bin ./headers.txt Verified OK
Che restituisce Verified OK
in caso di verifica positiva o Verification Failure
in caso negativo.