S/MIME Parte 4: Raccolta di chiavi pubbliche del destinatario in modo semplice – con le webhook di SparkPost Inbound Relay
Uccello
1 feb 2019
1 min read

Conclusioni principali
Premessa: Inviare email crittografate S/MIME non è difficile una volta che si può raccogliere automaticamente la chiave pubblica di ciascun destinatario. Questo post chiude quella lacuna utilizzando i SparkPost Inbound Relay Webhooks per ricevere email firmate, estrarre i certificati e conservarli per una crittografia successiva.
Obiettivo: Costruire un servizio webhook basato su Flask che ascolta i messaggi firmati in arrivo, li convalida (controlli DKIM + certificato), e scrive ogni chiave pubblica su disco in modo sicuro per l'uso nella posta sicura in uscita.
Punti salienti:
Problema: Lo scambio manuale di chiavi non è scalabile per email generate da app.
Soluzione: Invitare gli utenti a inviare un'email firmata; il webhook in entrata analizza e archivia automaticamente il loro certificato PEM.
Passi di configurazione:
Configurare un Inbound Domain e i record MX (ad esempio, inbound.yourdomain.com).
Creare un Inbound Relay Webhook tramite API SparkPost puntando al tuo endpoint dell'app.
Distribuire una piccola app Flask (webapp.py) utilizzando la configurazione da webapp.ini.
Registrare ampiamente per trasparenza; integrare Pytest + Travis CI per la convalida automatica.
Misure di sicurezza:
Verificare le firme DKIM e l'autenticità dei messaggi.
Convalidare la catena di fiducia del certificato prima della memorizzazione.
Utilizzare un token di autenticazione segreto nell'intestazione del webhook.
Risultato:
Ogni messaggio in entrata valido crea un file di certificato come bob.lumreeker@gmail.com.crt.
Una volta memorizzate, queste chiavi consentono risposte crittografate utilizzando gli script precedenti dalle parti 2 e 3.
Q&A Highlights
Perché è così fondamentale raccogliere le chiavi del destinatario per S/MIME?
Poiché la crittografia richiede la chiave pubblica di ciascun destinatario, automatizzare questo passaggio consente a qualsiasi app di inviare posta sicura senza scambio manuale.
Come semplifica la raccolta delle chiavi il webhook Inbound Relay di SparkPost?
Converte qualsiasi email in entrata firmata in un payload JSON strutturato, consentendo alla tua app di analizzare e memorizzare i certificati in modo programmato.
Quali misure di sicurezza prevengono lo spoofing o le invii di spam?
Il servizio convalida le firme DKIM, applica i token di autenticazione e rifiuta i messaggi malformati o non firmati.
Dove sono memorizzati i certificati e in quale formato?
Sono scritti su disco in formato PEM (
.crtfile), pronti per l'uso dalla catena di strumenti di firma/crittografia costruita nelle parti precedenti.Qual è il flusso di lavoro del developer?
Esegui l'app Flask, verifica con Postman utilizzando il payload di esempio fornito, quindi collegalo al webhook live di SparkPost per un funzionamento continuo.
Considerazioni generali?
La gestione delle chiavi S/MIME può essere completamente automatizzata con poche righe di Python e le API di SparkPost—portando la crittografia scalabile a qualsiasi flusso di lavoro email generato da app.
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 part 1, abbiamo fatto un breve tour di S/MIME, osservando la firma e la crittografia dei nostri flussi di messaggi attraverso una gamma di client di posta. Part 2 ci ha guidato attraverso un semplice strumento da riga di comando per firmare e crittografare le email, quindi inviarle tramite SparkPost. Part 3 ha mostrato come iniettare flussi di posta sicuri in piattaforme locali come Port25 PowerMTA e Momentum.
In questa serie, abbiamo visto come includere una firma S/MIME sia abbastanza semplice. Inviare posta crittografata S/MIME è più complesso perché è necessario ottenere le chiavi pubbliche dei destinatari. È una cosa quando si utilizza un client di posta per gli umani come Thunderbird - ma come può funzionare con flussi di email generati da app? Le email generate da app, come quelle utilizzate dalle piattaforme di incontri, richiedono strategie attente per massimizzare il coinvolgimento. Scopri come le app di incontri creano esperienze di email generate automaticamente irresistibili.
Ma aspetta – c'è un altro modo per entrare in Mordor per ottenere quelle chiavi. Il tuo servizio può invitare i tuoi clienti (via email, naturalmente) a rimandare una mail firmata a un indirizzo di servizio clienti noto. Usando i poteri magici dei webhooks SparkPost Inbound Relay, estrarremo e memorizzeremo quella chiave pubblica per te da 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 le email possano essere inviate a me in forma crittografata S/MIME.
Da questo, deriviamo 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 posta, a parte il fatto che dovrebbe avere una firma S/MIME.
Perché chiunque può provare a inviare una mail a questo servizio, dovrebbe essere progettato in modo difensivo, ad esempio, per respingere messaggi "spoof" da attori malevoli. Ci saranno diversi livelli di controllo.
Se tutto risulta in ordine, il servizio memorizzerà il certificato in un file, utilizzando il conosciuto formato testuale Privacy-Enhanced Mail (PEM).
Ci sono alcuni requisiti non funzionali:
I servizi webhook macchina-to-macchina possono essere difficili da vedere solo dalle risposte a ciò che sta accadendo all'interno. Il servizio dovrebbe fornire ampi log dell'applicazione leggibili dall'uomo. In particolare, l'analisi e il controllo del certificato dovrebbero essere loggati.
Aggiungiamo casi di test per gli interni dell'app, utilizzando il bel framework Pytest, e eseguiamo automaticamente questi test in fase di check-in tramite l'integrazione Travis CI con GitHub.
OK – iniziamo!
1. Panoramica della soluzione
Ecco come apparirà la soluzione complessiva.

2. Installazione, configurazione e avvio dell'app web
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. Imposta il tuo dominio seguendo questa guida. Ecco i passaggi che ho utilizzato nel dettaglio:
3.1 Aggiungi Records MX
Avrai bisogno di accedere al tuo account specifico del provider di servizi Internet. Una volta fatto, puoi verificarli con dig – ecco il comando per il mio dominio.
Dovresti vedere:
3.2 Crea un Dominio Inbound
Usa la Postman API collection di SparkPost, selezionando la chiamata Inbound Domains / Create.. Il corpo della richiesta POST contiene il tuo dominio, per esempio:

3.3 Crea un Relay Webhook
Crea un relay webhook inbound utilizzando la chiamata relevante in Postman. Il corpo del messaggio nel mio caso contiene:
Come menzionato prima, raccomando di impostare un auth_token al tuo valore segreto, come impostato nel file webapp.ini sul tuo host.
Il valore “target” deve corrispondere al tuo indirizzo host e alla porta TCP in cui ospiterai l'app web.
Il valore “domain” deve corrispondere ai record MX configurati nel passaggio 1.

Ecco fatto! L'impianto è finito. Ora dovresti essere in grado di inviare certificati al tuo indirizzo inbound, verranno processati e appariranno sul tuo host dell'applicazione web – in questo caso, un file chiamato bob.lumreeker@gmail.com.crt.
Ora puoi inviare email criptate a Bob, utilizzando gli strumenti descritti nelle parti 2 & 3 di questa serie.
Puoi esaminare il contenuto di un certificato utilizzando:
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.



