Working DKIM example

From Carini MediaWiki
Jump to navigation Jump to search

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.