In questo capitolo, faremo:
Installare alcuni semplici strumenti da riga di comando per firmare e crittografare e-mail
Ottenere la chiave / certificato del mittente per la firma
Inviare un messaggio firmato tramite SparkPost e guardare il messaggio ricevuto
Facoltativamente, ottenere il certificato del destinatario per la crittografia
Inviare un messaggio firmato e crittografato tramite SparkPost e guardare il messaggio ricevuto
Provare un utile strumento autonomo “mimeshow” per guardare gli interni del file e-mail.
OK – iniziamo!
1. Installare gli strumenti
Gli strumenti di dimostrazione si trovano su Github qui, completi di istruzioni per l’installazione. Potresti notare il logo “build passing” – Travis e pytest controllano automaticamente lo stato della build. Nota che questi strumenti non sono ufficialmente supportati da SparkPost, ma ho cercato di renderli robusti e facili da usare.
Se hai un po' di familiarità con Python e pip, l’installazione dovrebbe sembrarti piuttosto familiare. Il Pipfile gestisce automaticamente le dipendenze esterne per te. Una volta completato, puoi controllare che tutto sia installato eseguendo
./sparkpostSMIME.py -h
Dovresti vedere il messaggio di aiuto amichevole. Ora dobbiamo…
2. Ottenere la chiave / certificato del mittente per la firma
Se hai già un file chiave per la tua identità di invio, puoi andare avanti. Altrimenti, ecco due opzioni tra cui scegliere:
a) Chiave / certificato di test auto-firmato (non valido esternamente)
Se stai solo testando, puoi creare certificati e chiavi “auto-firmati” per un indirizzo e-mail usando lo strumento da riga di comando openssl su Linux, seguendo una procedura come questa. Alla fine di quel processo, avrai un file smime.p12 . Rinomina questo file per corrispondere alla tua identità di invio, incluso il segno @, per esempio, alice@example.com.p12 .
oppure
b) Chiavi / certificati validi esternamente
Se desideri ottenere chiavi / certificati validi esternamente che ti permettano di firmare, c'è un elenco di fornitori qui. Ho scoperto che Comodo funziona bene (gratuito per uso non commerciale), ed è più semplice rispetto alla procedura di auto-firma sopra. Segui il processo di registrazione, ricevi la tua mail di convalida e assicurati di aprire il link in Firefox. Vai su Preferenze di Firefox / Privacy e Sicurezza. Scorri verso Certificati / Visualizza certificati:
Seleziona il tuo certificato e utilizza l’opzione “Backup” per salvarlo come file in formato PKCS12 (aggiungi l'estensione del file .p12 al tuo nome file) che contiene la chiave privata e la catena di certificati pubblici.
Fornisci una password per proteggere il file .p12:
Generare file chiave pubblica (.crt) e privata (.pem) separati
Se hai utilizzato a) o b), ora avrai un file .p12 per la tua identità di mittente. Questo è un grande passo avanti – prendi un caffè adesso!
Ora dobbiamo generare file chiave pubblica e privata separati in questo modo – sostituendo con il tuo indirizzo e-mail per quello di esempio. (Mac OSX e Linux):
openssl pkcs12 -in alice\@example.com.p12 -clcerts -nokeys -out alice\@example.com.crt openssl pkcs12 -in alice\@example.com.p12 -nocerts -nodes -out alice\@example.com.pem
Dovrai inserire la password fornita in precedenza. Nota che quelle barre inverse \ sono utilizzate per escludere il segno @ – non separano i nomi di un percorso di directory (quella è una barra in avanti / su Mac OSX e Linux).
Se stai usando Windows, ci sono implementazioni di openssl disponibili come quella MINGW64 integrata negli strumenti da riga di comando Git, ma ho scoperto che tendeva semplicemente a bloccarsi. Probabilmente troverai più facile e veloce farlo su Linux e poi copiare i tuoi file. Quegli stessi strumenti Git per Windows vengono forniti con un bel client ssh che puoi usare per accedere a un sistema Linux, come un'istanza Amazon EC2.
2.1 Firmare un messaggio
C'è già una chiave/certificato fittizio e un file sorgente e-mail nella directory dei test per alice@example.com, quindi puoi ottenere un output anche prima di avere le tue chiavi. Basta digitare quanto segue:
cd tests ../sparkpostSMIME.py example_email1.eml --sign
E otterrai:
To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: Un messaggio MIME-Version: 1.0 Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" MIIKXAYJKoZIhvcNAQcCoIIKTTCCCkkCAQExDzANBglghkgBZQMEAgEFADCCAQoGCSqGSIb3DQEH AaCB/ASB+VRvOiBCb2IgPGJvYkBleGFtcGxlLmNvbT4NCkZyb206IEFsaWNlIDxhbGljZUBleGFt : :
Non puoi effettivamente inviare e-mail da example.com via SparkPost a meno che tu non possieda quel dominio, quindi il passo successivo è utilizzare la tua chiave e inviare un messaggio firmato dal tuo dominio.
3. Inviare un messaggio firmato tramite SparkPost
Ora utilizziamo un dominio di invio reale, impostato secondo la Guida per nuovi utenti di SparkPost. Abbiamo i file di certificato e chiave del mittente nella directory corrente:
steve@thetucks.com.crt steve@thetucks.com.pem
Il file tests/declaration.eml è incluso nel progetto. È solo un file di testo, quindi puoi personalizzare l'indirizzo Da: per adattarlo al tuo dominio di invio e l'indirizzo A: per adattarlo al tuo destinatario di prova. L'inizio del file appare così:
To: Bob <bob.lumreeker@gmail.com> From: Steve <steve@thetucks.com> Subject: Ecco la nostra dichiarazione MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-GB Quando nel corso degli eventi umani diventa necessario …
Imposta la tua chiave API:
export SPARKPOST_API_KEY=<<Inserisci qui la tua chiave API>>
Invia l'e-mail:
./sparkpostSMIME.py tests/declaration.eml --sign --send_api
Vedrai:
Connessione aperta a https://api.sparkpost.com/api/v1 Invio tests/declaration.eml Da: Steve <steve@thetucks.com> A: Bob <bob.lumreeker@gmail.com> OK - in 1.15 secondi
Un secondo dopo, l'e-mail arriva nella casella di posta di Bob. Thunderbird la visualizza con un punto rosso sulla busta, che indica una firma di mittente valida.
Successo! Finisci quel caffè, te lo sei guadagnato. Se hai problemi, controlla che il tuo indirizzo Da: nel file e-mail corrisponda al nome dei tuoi file .crt e .pem.
4. Crittografare i messaggi
Per crittografare un messaggio, hai bisogno della chiave pubblica del tuo destinatario in forma di certificato. Questo è un file di testo che appare così:
Bag Attributes friendlyName: s COMODO CA Limited ID #2 localKeyID: 32 84 AB 9C 56 5C 80 C6 89 4D 40 46 DD D4 7C 71 E8 CD ED C1 subject=/emailAddress=bob.lumreeker@gmail.com issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Client Authentication and Secure Email CA -----BEGIN CERTIFICATE----- sembra contenere caratteri casuali qui -----END CERTIFICATE-----
C'è un certificato destinatario fittizio per bob@example.com nella directory dei test, così puoi esercitarti con esso prima di avere un certificato reale:
cd tests ../sparkpostSMIME.py example_email1.eml --sign --encrypt
Vedrai:
To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: Un messaggio MIME-Version: 1.0 Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=smime.p7m MIIRwQYJKoZIhvcNAQcDoIIRsjCCEa4CAQAxggKlMIICoQIBADCBijCBhDELMAkG :
Noterai che la lunghezza dell'output è piuttosto maggiore rispetto a un messaggio crittografato perché porta un sacco di informazioni extra oltre al messaggio stesso scrambolato.
4.1 Inviare un messaggio crittografato e firmato tramite SparkPost
Inviamo un messaggio crittografato a un vero indirizzo e-mail. Puoi seguire lo stesso processo di prima (auto-firmato o di un fornitore come Comodo) per ottenere una chiave pubblica / certificato per i propri indirizzi destinatari. Hai solo bisogno del file .crt – il destinatario non deve mai darti la propria chiave privata (file .p12 e .pem).
Ho il file bob.lumreeker@gmail.com.crt per il mio destinatario previsto – corrispondente all'indirizzo Da: nel mio file.
Ecco il comando per inviare:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt --send_api
Vedo:
Connessione aperta a https://api.sparkpost.com/api/v1 Invio tests/declaration.eml Da: Steve <steve@thetucks.com> A: Bob <bob.lumreeker@gmail.com> OK - in 1.168 secondi
La mail appare in Thunderbird con l'icona di firma “punto rosso” e l'icona “lucchetto” crittografata.
Puoi inviare email HTML complesse con link e immagini altrettanto facilmente, come quella mostrata nella Parte 1. Alcuni client come Thunderbird chiedono il permesso di visualizzare link e immagini esterni all'interno di messaggi crittografati S/MIME, ma i messaggi solo firmati vengono visualizzati bene in client tra cui Thunderbird e Gmail:
Nota che il menu a discesa mostra “Indirizzo email verificato”.
Ulteriori riflessioni & cose di cui essere consapevoli
Questo strumento adotta un approccio super semplice per raccogliere le chiavi necessarie – cerca semplicemente file nominati nella directory corrente. Arrangiamenti più complessi, come detenere tutte le chiavi in un database, potrebbero facilmente essere aggiunti, ma ho voluto che il codice fosse il più semplice possibile.
Puoi includere altri destinatari con Cc: e Bcc: e verranno consegnati; questo potrebbe essere utile per scopi di archiviazione. I messaggi firmati vengono ricevuti e possono essere visualizzati da altri destinatari completi di firma. Lo strumento rimuove l'intestazione Bcc: dal messaggio consegnato (come farebbe un client di posta desktop).
Per garantire che i messaggi passino attraverso SparkPost invariati (cosa che potrebbe compromettere la firma), lo strumento imposta opzioni API per l'invio di messaggi “transazionali”, con il tracking di apertura e clic disabilitato.
Se utilizzi la crittografia, tieni presente che lo strumento raccoglie l'unico indirizzo A: per questo. Gli altri destinatari possono decodificare il corpo del messaggio solo se possiedono la chiave privata del destinatario A:. Se stai solo utilizzando destinatari secondari come registrazione delle consegne effettuate, ad esempio, potrebbe andare bene comunque.
Firmato, sigillato, consegnato... sono tuo
Questa è la nostra rapida panoramica su come firmare, sigillare e consegnare messaggi S/MIME tramite SparkPost. Un rapido promemoria: il progetto di dimostrazione è su Github qui, ho cercato di renderlo facile da installare e utilizzare.
Funzione bonus: visualizzare parti MIME con “mimeshow”
I file multiparte MIME RFC822 sono piuttosto complessi da leggere per gli esseri umani. Il progetto include uno strumento autonomo per rendere questo più facile, chiamato mimeshow.
Questo prende tutti i file e-mail che hai (non solo quelli S/MIME) e mostra la struttura interna. Ecco un esempio:
./mimeshow.py testcases/img_and_attachment.eml
Vedrai:
To Bob <bob.lumreeker@gmail.com> From Steve <steve@thetucks.com> Subject Testare gli allegati ecc MIME-Version 1.0 Content-Type multipart/mixed; boundary="------------7D48652042860D0098C65210" Content-Language en-GB Content-Type multipart/alternative; boundary="------------58C0BF87598336550D70EB95" Content-Type text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding 7bit Content-Transfer-Encoding quoted-printable Content-Type text/html; charset="utf-8" Content-Type application/pdf; name="sparkpost-datasheet-tam-technical-account-management.pdf" Content-Transfer-Encoding base64 Content-Disposition attachment; filename="sparkpost-datasheet-tam-technical-account-management.pdf"
Puoi anche usarlo come filtro per fornire un riepilogo leggibile dell'output sparkpostSMIME :
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py
Vedrai:
To Bob <bob.lumreeker@gmail.com> From Steve <steve@thetucks.com> Subject Ecco la nostra dichiarazione Content-Language en-GB MIME-Version 1.0 Content-Type application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m Content-Transfer-Encoding base64 Content-Disposition attachment; filename=smime.p7m
Infine…
Per riassumere – abbiamo installato alcuni semplici strumenti da riga di comando per firmare e crittografare e-mail (il repository Github è qui, completo di istruzioni per l’installazione).
Abbiamo ottenuto la chiave / certificato del mittente per la firma, e inviato un messaggio firmato tramite SparkPost. Abbiamo ottenuto un certificato destinatario per la crittografia, poi inviato un messaggio firmato e crittografato tramite SparkPost.
Infine, abbiamo provato l'utile strumento autonomo “mimeshow” per guardare gli interni del file e-mail.
Questo è tutto per ora! A presto!.