Reach

Grow

Manage

Automate

Reach

Grow

Manage

Automate

S/MIME Parte 4: Raccolta di chiavi pubbliche del destinatario in modo semplice – con le webhook di SparkPost Inbound Relay

Email

1 min read

S/MIME Parte 4: Raccolta di chiavi pubbliche del destinatario in modo semplice – con le webhook di SparkPost Inbound Relay

Email

1 min read

S/MIME Parte 4: Raccolta di chiavi pubbliche del destinatario in modo semplice – con le webhook di SparkPost Inbound Relay

In questa serie, abbiamo visto che includere una firma S/MIME è piuttosto semplice. Inviare email crittografate S/MIME è più complesso perché devi ottenere le chiavi pubbliche dei destinatari. È una cosa quando usi un client di posta per umani come Thunderbird, ma come può funzionare con flussi email generati da un'app?

In parte 1, abbiamo fatto un breve tour di S/MIME, esaminando la firma e la crittografia dei nostri flussi di messaggi attraverso una gamma di client di posta. Parte 2 ci ha guidato attraverso un semplice strumento da riga di comando per firmare e crittografare le email, quindi inviarle tramite SparkPost. Parte 3 ha mostrato come iniettare flussi di posta sicuri su piattaforme locali come Port25 PowerMTA e Momentum.

In questa serie, abbiamo visto come includere una firma S/MIME sia abbastanza semplice. Inviare mail crittografate S/MIME è più complesso perché è necessario ottenere le chiavi pubbliche dei destinatari. È una cosa quando si utilizza un client di posta per umani come Thunderbird – ma come può funzionare con flussi di email generati dalle app?

Ma aspetta – c'è un altro modo per entrare in Mordor e ottenere quelle chiavi. Il tuo servizio può invitare i tuoi clienti (via email, naturalmente) a inviarti una mail firmata a un indirizzo di servizio clienti noto. Utilizzando i poteri magici dei webhooks SparkPost Inbound Relay, estrarremo e memorizzeremo quella chiave pubblica per farti utilizzare.

Possiamo riassumere questo in un semplice caso d'uso:

  • Come destinatario di messaggi, fornisco al tuo servizio la mia firma email personale via email, in modo che in futuro mi possano essere inviate email in forma crittografata S/MIME.

Da questo, traiamo alcuni requisiti più dettagliati:

  • Abbiamo bisogno di un servizio email in entrata, sempre attivo e affidabile, per ricevere quelle email firmate.

  • Non ci dovrebbero essere requisiti speciali sul formato della mail, a parte il fatto che deve contenere una firma S/MIME.

  • Poiché chiunque può provare a inviare una mail a questo servizio, dovrebbe essere progettato in modo difensivo, ad esempio, per respingere i messaggi "spoof" da malintenzionati. Ci dovranno essere diversi livelli di controllo.

  • Se tutto va bene, il servizio memorizzerà il certificato in un file, utilizzando il formato di testo semplice Privacy-Enhanced Mail (PEM).

Ci sono alcuni requisiti non funzionali:

  • I servizi webhook macchina-a-macchina possono essere difficili da vedere solo dalle risposte a cosa sta succedendo all'interno. Il servizio dovrebbe fornire ampi log leggibili dall'uomo a livello di applicazione. In particolare, l'analisi e il controllo dei certificati dovrebbero essere registrati nei log.

  • Aggiungiamo casi di test per gli interni dell'app, utilizzando il bel framework Pytest, ed eseguiamo automaticamente quei test al check-in utilizzando l'integrazione Travis CI con GitHub.

OK – iniziamo!

1. Panoramica della soluzione

Ecco come apparirà la soluzione complessiva.

Diagram depicting a secure email flow illustrating how emails are verified using certificates for secure transmission.

2. Installazione, configurazione e avvio dell'app web

Inizieremo con questa parte, così avremo tutto testato prima di configurare i webhooks del relay inbound.

L'app web è inclusa nello stesso progetto GitHub delle parti 1 – 3, quindi se hai seguito quelle parti, già lo possiedi. Ecco le nuove sezioni:

  • Programma readSMIMEsig.py – leggere un'email ed estrarre certificati intermedi e utente.

  • Programma webapp.py – semplice applicazione web compatibile con Flask per l'uso con SparkPost Inbound Relay Webhooks.

  • webapp.ini – file di configurazione per i precedenti. Un file di configurazione consente di passare facilmente gli stessi valori sia ad applicazioni a riga di comando che web.

Devi assicurarti che il tuo host abbia il corretto numero di porta TCP aperto per le richieste inbound provenienti dal mondo esterno, così che SparkPost possa inviare messaggi alla tua app. Se sei ospitato su AWS EC2, ad esempio, dovrai configurare il gruppo di sicurezza della tua istanza.

Le istruzioni per configurare e avviare l'app web sono date qui – è davvero semplice. Per controllare che la tua app sia in esecuzione e accessibile dal mondo esterno, puoi inviare richieste (vuote) da un altro host usando curl, ad esempio:

curl -X POST https://app.trymsys.net:8855/

Dovresti vedere una risposta come questa:

{"message":"Unknown Content-Type in request headers"}

Questo è positivo – la tua app è in esecuzione!

In webapp.log sul tuo host, vedrai output simile a questo:

2019-01-15 00:11:07,575,root,INFO,Richiesta da 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Unknown Content-Type: None

Per aiutarti a giocare con dati reali nella tua app immediatamente, puoi importare questa specifica richiesta Postman dal repo del progetto. Questo simula ciò che farà il tuo account SparkPost, ovvero invia un POST https contenente un'email con un certificato specifico e valido (appartenente a un mio account di test) alla tua app.

Devi solo cambiare l'indirizzo di destinazione nella richiesta (nella casella grigia sopra) in modo che corrisponda alla tua installazione. Se hai cambiato il valore del token in webapp.ini, modifica il valore dell'intestazione in Postman per farlo corrispondere.

Se la tua app funziona, vedrai una risposta “200 OK” di ritorno in Postman. Il file webapp.log del tuo host conterrà output come questo:

2019-01-15 00:11:48,554,root,INFO,Richiesta da 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:48,554,root,INFO,| len(headers)=10,len(body)=14778 2019-01-15 00:11:48,555,root,INFO,| msg_from=bob.lumreeker@gmail.com,rcpt_to=secureme@inbound.thetucks.com,len(email_rfc822)=9223 2019-01-15 00:11:48,599,root,INFO,| from=bob.lumreeker@gmail.com,DKIM passato 2019-01-15 00:11:48,600,root,INFO,| content-type=multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="------------ms010908020707040304020406",content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=text/plain; charset=utf-8; format=flowed,content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=application/pkcs7-signature; name="smime.p7s",content-description=S/MIME Cryptographic Signature 2019-01-15 00:11:48,600,root,INFO,| filename=smime.p7s,bytes=3998 2019-01-15 00:11:48,601,root,INFO,| Certificato: subject email_address=['bob.lumreeker@gmail.com'],not_valid_before=2018-10-03 00:00:00,not_valid_after=2019-10-03 23:59:59,hash_algorithm=sha256,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Client Authentication and Secure Email CA'} 2019-01-15 00:11:48,602,root,INFO,| Certificato: subject email_address=[],not_valid_before=2013-01-10 00:00:00,not_valid_after=2028-01-09 23:59:59,hash_algorithm=sha384,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Certification Authority'} 2019-01-15 00:11:48,616,root,INFO,| file scritto ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Per un rapido controllo, cerca l'ultima riga – se dice “file scritto”, allora sei a posto. Il resto mostra il processo di verifica DKIM e validazione del certificato.

Inizieremo con questa parte, così avremo tutto testato prima di configurare i webhooks del relay inbound.

L'app web è inclusa nello stesso progetto GitHub delle parti 1 – 3, quindi se hai seguito quelle parti, già lo possiedi. Ecco le nuove sezioni:

  • Programma readSMIMEsig.py – leggere un'email ed estrarre certificati intermedi e utente.

  • Programma webapp.py – semplice applicazione web compatibile con Flask per l'uso con SparkPost Inbound Relay Webhooks.

  • webapp.ini – file di configurazione per i precedenti. Un file di configurazione consente di passare facilmente gli stessi valori sia ad applicazioni a riga di comando che web.

Devi assicurarti che il tuo host abbia il corretto numero di porta TCP aperto per le richieste inbound provenienti dal mondo esterno, così che SparkPost possa inviare messaggi alla tua app. Se sei ospitato su AWS EC2, ad esempio, dovrai configurare il gruppo di sicurezza della tua istanza.

Le istruzioni per configurare e avviare l'app web sono date qui – è davvero semplice. Per controllare che la tua app sia in esecuzione e accessibile dal mondo esterno, puoi inviare richieste (vuote) da un altro host usando curl, ad esempio:

curl -X POST https://app.trymsys.net:8855/

Dovresti vedere una risposta come questa:

{"message":"Unknown Content-Type in request headers"}

Questo è positivo – la tua app è in esecuzione!

In webapp.log sul tuo host, vedrai output simile a questo:

2019-01-15 00:11:07,575,root,INFO,Richiesta da 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Unknown Content-Type: None

Per aiutarti a giocare con dati reali nella tua app immediatamente, puoi importare questa specifica richiesta Postman dal repo del progetto. Questo simula ciò che farà il tuo account SparkPost, ovvero invia un POST https contenente un'email con un certificato specifico e valido (appartenente a un mio account di test) alla tua app.

Devi solo cambiare l'indirizzo di destinazione nella richiesta (nella casella grigia sopra) in modo che corrisponda alla tua installazione. Se hai cambiato il valore del token in webapp.ini, modifica il valore dell'intestazione in Postman per farlo corrispondere.

Se la tua app funziona, vedrai una risposta “200 OK” di ritorno in Postman. Il file webapp.log del tuo host conterrà output come questo:

2019-01-15 00:11:48,554,root,INFO,Richiesta da 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:48,554,root,INFO,| len(headers)=10,len(body)=14778 2019-01-15 00:11:48,555,root,INFO,| msg_from=bob.lumreeker@gmail.com,rcpt_to=secureme@inbound.thetucks.com,len(email_rfc822)=9223 2019-01-15 00:11:48,599,root,INFO,| from=bob.lumreeker@gmail.com,DKIM passato 2019-01-15 00:11:48,600,root,INFO,| content-type=multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="------------ms010908020707040304020406",content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=text/plain; charset=utf-8; format=flowed,content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=application/pkcs7-signature; name="smime.p7s",content-description=S/MIME Cryptographic Signature 2019-01-15 00:11:48,600,root,INFO,| filename=smime.p7s,bytes=3998 2019-01-15 00:11:48,601,root,INFO,| Certificato: subject email_address=['bob.lumreeker@gmail.com'],not_valid_before=2018-10-03 00:00:00,not_valid_after=2019-10-03 23:59:59,hash_algorithm=sha256,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Client Authentication and Secure Email CA'} 2019-01-15 00:11:48,602,root,INFO,| Certificato: subject email_address=[],not_valid_before=2013-01-10 00:00:00,not_valid_after=2028-01-09 23:59:59,hash_algorithm=sha384,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Certification Authority'} 2019-01-15 00:11:48,616,root,INFO,| file scritto ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Per un rapido controllo, cerca l'ultima riga – se dice “file scritto”, allora sei a posto. Il resto mostra il processo di verifica DKIM e validazione del certificato.

Inizieremo con questa parte, così avremo tutto testato prima di configurare i webhooks del relay inbound.

L'app web è inclusa nello stesso progetto GitHub delle parti 1 – 3, quindi se hai seguito quelle parti, già lo possiedi. Ecco le nuove sezioni:

  • Programma readSMIMEsig.py – leggere un'email ed estrarre certificati intermedi e utente.

  • Programma webapp.py – semplice applicazione web compatibile con Flask per l'uso con SparkPost Inbound Relay Webhooks.

  • webapp.ini – file di configurazione per i precedenti. Un file di configurazione consente di passare facilmente gli stessi valori sia ad applicazioni a riga di comando che web.

Devi assicurarti che il tuo host abbia il corretto numero di porta TCP aperto per le richieste inbound provenienti dal mondo esterno, così che SparkPost possa inviare messaggi alla tua app. Se sei ospitato su AWS EC2, ad esempio, dovrai configurare il gruppo di sicurezza della tua istanza.

Le istruzioni per configurare e avviare l'app web sono date qui – è davvero semplice. Per controllare che la tua app sia in esecuzione e accessibile dal mondo esterno, puoi inviare richieste (vuote) da un altro host usando curl, ad esempio:

curl -X POST https://app.trymsys.net:8855/

Dovresti vedere una risposta come questa:

{"message":"Unknown Content-Type in request headers"}

Questo è positivo – la tua app è in esecuzione!

In webapp.log sul tuo host, vedrai output simile a questo:

2019-01-15 00:11:07,575,root,INFO,Richiesta da 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:07,575,root,INFO,| len(headers)=3,len(body)=None 2019-01-15 00:11:07,575,root,INFO,| Unknown Content-Type: None

Per aiutarti a giocare con dati reali nella tua app immediatamente, puoi importare questa specifica richiesta Postman dal repo del progetto. Questo simula ciò che farà il tuo account SparkPost, ovvero invia un POST https contenente un'email con un certificato specifico e valido (appartenente a un mio account di test) alla tua app.

Devi solo cambiare l'indirizzo di destinazione nella richiesta (nella casella grigia sopra) in modo che corrisponda alla tua installazione. Se hai cambiato il valore del token in webapp.ini, modifica il valore dell'intestazione in Postman per farlo corrispondere.

Se la tua app funziona, vedrai una risposta “200 OK” di ritorno in Postman. Il file webapp.log del tuo host conterrà output come questo:

2019-01-15 00:11:48,554,root,INFO,Richiesta da 38.96.5.10,scheme=https,path=/ 2019-01-15 00:11:48,554,root,INFO,| len(headers)=10,len(body)=14778 2019-01-15 00:11:48,555,root,INFO,| msg_from=bob.lumreeker@gmail.com,rcpt_to=secureme@inbound.thetucks.com,len(email_rfc822)=9223 2019-01-15 00:11:48,599,root,INFO,| from=bob.lumreeker@gmail.com,DKIM passato 2019-01-15 00:11:48,600,root,INFO,| content-type=multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="------------ms010908020707040304020406",content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=text/plain; charset=utf-8; format=flowed,content-description=None 2019-01-15 00:11:48,600,root,INFO,| content-type=application/pkcs7-signature; name="smime.p7s",content-description=S/MIME Cryptographic Signature 2019-01-15 00:11:48,600,root,INFO,| filename=smime.p7s,bytes=3998 2019-01-15 00:11:48,601,root,INFO,| Certificato: subject email_address=['bob.lumreeker@gmail.com'],not_valid_before=2018-10-03 00:00:00,not_valid_after=2019-10-03 23:59:59,hash_algorithm=sha256,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Client Authentication and Secure Email CA'} 2019-01-15 00:11:48,602,root,INFO,| Certificato: subject email_address=[],not_valid_before=2013-01-10 00:00:00,not_valid_after=2028-01-09 23:59:59,hash_algorithm=sha384,key_size=2048 bytes, issuer={'countryName': 'GB', 'stateOrProvinceName': 'Greater Manchester', 'localityName': 'Salford', 'organizationName': 'COMODO CA Limited', 'commonName': 'COMODO RSA Certification Authority'} 2019-01-15 00:11:48,616,root,INFO,| file scritto ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Per un rapido controllo, cerca l'ultima riga – se dice “file scritto”, allora sei a posto. Il resto mostra il processo di verifica DKIM e validazione del certificato.

3. Configurazione di SparkPost inbound relay webhooks

Innanzitutto, selezioniamo un dominio da utilizzare come nostro indirizzo di messaggi in entrata –  qui sarà inbound.thetucks.com. Configura il tuo dominio seguendo questa guida. Ecco i passaggi che ho utilizzato in dettaglio:

3.1 Aggiungi i Record MX

Avrai bisogno di accesso al tuo account specifico del provider di servizi Internet. Una volta fatto, puoi controllarli con dig – ecco il comando per il mio dominio.

dig +short MX inbound.thetucks.com

Dovresti vedere:

10 rx3.sparkpostmail.com. 10 rx1.sparkpostmail.com. 10 rx2.sparkpostmail.com.

3.2 Crea un Dominio Inbound

Utilizza la SparkPost Postman API collection, selezionando il call Inbound Domains / Create... Il corpo della richiesta POST contiene il tuo dominio, per esempio:

{    "domain": "inbound.thetucks.com" }

Postman desktop application with an open tab displaying a 'Create an Inbound Domain' API request, featuring fields such as domain input, several header options, and a JSON payload, aimed at testing and automating API workflows.


3.3 Crea un Relay Webhook

Crea un relay webhook in entrata utilizzando la relativa chiamata Postman. Il corpo del messaggio nel mio caso contiene:

{ "name": "Certificate Collection Webhook", "target": "https://app.trymsys.net:8855/", "auth_token": "t0p s3cr3t t0k3n", "match": { "protocol": "SMTP", "domain": "inbound.thetucks.com" } }

Come menzionato in precedenza, consiglio di impostare un auth_token con il tuo valore segreto personale, come impostato nel file webapp.ini sul tuo host.

Il valore “target” deve corrispondere all'indirizzo e alla porta TCP dell'host in cui ospiterai l'applicazione web.

Il valore “domain” deve corrispondere ai record MX configurati nel passaggio 1.

Postman interface, showing the process of creating a relay webhook with detailed JSON configuration, with sections including request method, parameters, and code snippet.


Questo è tutto! L'installazione è completata. Ora dovresti essere in grado di inviare i certificati al tuo indirizzo in entrata, saranno elaborati e visualizzati sul tuo host dell'applicazione web – in questo caso, un file chiamato bob.lumreeker@gmail.com.crt.

Ora puoi inviare email crittografate a Bob, utilizzando gli strumenti descritti nelle parti 2 & 3 di questa serie.

Puoi esaminare il contenuto di un certificato usando:

openssl x509 -inform PEM -in bob.lumreeker\@gmail.com.crt -text -noout

4. Internals: Controllo DKIM, validazione dei certificati

L'app controlla che le email ricevute abbiano DKIM validi e verifica che i certificati stessi siano validi, come descritto qui. Ci sono anche note di implementazione lì, e idee per lavori futuri.

Ricapitolando…

Abbiamo visto come le chiavi pubbliche del destinatario possano essere raccolte facilmente utilizzando un'email a un indirizzo di webhook in entrata. Una volta fatto, quei destinatari possono ricevere i loro messaggi in forma crittografata S/MIME.

Questo è tutto per ora! Buon invio.

Connettiamoci con un esperto di Bird.
Scopri tutta la potenza del Bird in 30 minuti.

Inviando, accetti che Bird possa contattarti riguardo ai nostri prodotti e servizi.

Puoi annullare l'iscrizione in qualsiasi momento. Consulta la Informativa sulla Privacy di Bird per i dettagli sul trattamento dei dati.

Azienda

Newsletter

Rimani aggiornato con Bird attraverso aggiornamenti settimanali nella tua inbox.

Connettiamoci con un esperto di Bird.
Scopri tutta la potenza del Bird in 30 minuti.

Inviando, accetti che Bird possa contattarti riguardo ai nostri prodotti e servizi.

Puoi annullare l'iscrizione in qualsiasi momento. Consulta la Informativa sulla Privacy di Bird per i dettagli sul trattamento dei dati.

Azienda

Newsletter

Rimani aggiornato con Bird attraverso aggiornamenti settimanali nella tua inbox.

Connettiamoci con un esperto di Bird.
Scopri tutta la potenza del Bird in 30 minuti.

Inviando, accetti che Bird possa contattarti riguardo ai nostri prodotti e servizi.

Puoi annullare l'iscrizione in qualsiasi momento. Consulta la Informativa sulla Privacy di Bird per i dettagli sul trattamento dei dati.

R

Raggiungi

G

Grow

M

Manage

A

Automate

Azienda

Newsletter

Rimani aggiornato con Bird attraverso aggiornamenti settimanali nella tua inbox.