In deze aflevering zullen we:
Een paar eenvoudige command-line tools installeren voor het ondertekenen en versleutelen van e-mails
Uw verzendersleutel/certificaat verkrijgen voor ondertekening
Een ondertekend bericht via SparkPost verzenden en het ontvangen bericht bekijken
Optioneel het certificaat van uw ontvanger verkrijgen voor versleuteling
Een ondertekend en versleuteld bericht via SparkPost verzenden en het ontvangen bericht bekijken
Een handige standalone tool "mimeshow" proberen om de interne structuur van e-mailbestanden te bekijken.
OK - laten we beginnen!
1. Installeer de tools
De demonstratietools staan op Github hier, compleet met installatie-instructies. U ziet misschien het "build passing" logo – Travis en pytest controleren automatisch de buildstatus. Let op: deze tools worden niet officieel ondersteund door SparkPost, maar ik heb ze robuust en gebruiksvriendelijk gemaakt.
Als u enige bekendheid met Python en pip hebt, zou de installatie aardig vertrouwd moeten aanvoelen. De Pipfile zorgt automatisch voor de externe afhankelijkheden voor u. Zodra dit klaar is, kunt u controleren of alles is geïnstalleerd door het volgende te draaien
./sparkpostSMIME.py -h
U zou de vriendelijke helptekst moeten zien. Vervolgens moeten we...
2. Verkrijg uw verzendersleutel/certificaat voor ondertekening
Als u al een sleutelbestand voor uw zendende identiteit hebt, kunt u verder gaan. Anders zijn hier twee opties om uit te kiezen:
a) Zelf ondertekende testsleutel/certificaat (niet extern geldig)
Als u alleen aan het testen bent, kunt u "zelf ondertekende" certificaten en sleutels maken voor een e-mailadres met behulp van de command-line tool openssl op Linux, volgens een procedure zoals deze. Aan het einde van dat proces heeft u een smime.p12-bestand. Hernoem dit bestand zodat het overeenkomt met uw zendende identiteit, inclusief het @-teken, bijvoorbeeld alice@example.com.p12.
of
b) Extern geldige sleutels/certificaten
Als u extern geldige sleutels/certificaten wilt verkrijgen die u in staat stellen te ondertekenen, is er een lijst van aanbieders hier. Ik vond Comodo goed werken (gratis voor niet-commercieel gebruik), en het is gemakkelijker dan de hierboven genoemde zelf-ondertekeningsprocedure. Volg het aanmeldproces, ontvang uw validatie-e-mail, en zorg ervoor dat u de link opent in Firefox. Ga naar Firefox Voorkeuren / Privacy en Beveiliging. Scroll naar Certificaten / Bekijk Certificaten:
Selecteer uw certificaat en gebruik de "Back-up" optie om het als een bestand in PKCS12 formaat op te slaan (voeg de bestandsextensie .p12 toe aan uw bestandsnaam) die de privésleutel en de openbare certificaatketen bevat.
Geef een wachtwoord op om het .p12-bestand te beveiligen:
Genereer afzonderlijke publieke (.crt) en private (.pem) sleutelbestanden
Of u nu a) of b) hebt gebruikt, u heeft nu een .p12-bestand voor uw zenderidentiteit. Dat is een grote stap vooruit - neem gerust een kop koffie!
Nu moeten we afzonderlijke openbare en private sleutelbestanden genereren zoals dit - vervang uw eigen e-mailadres voor het voorbeeld e-mailadres. (Mac OSX en 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
U moet het wachtwoord invoeren dat u eerder hebt opgegeven. Let op, de backslashes \ worden gebruikt om het @-teken te escaperen - ze scheiden geen namen van een directorypad (dat is een schuine streep / op Mac OSX en Linux).
Als u Windows gebruikt, zijn er openssl-implementaties beschikbaar zoals de MINGW64, die is ingebouwd in de Git-command-line tools, maar ik vond dat deze de neiging had om vast te lopen. U zult het waarschijnlijk gemakkelijker en sneller vinden om dit op Linux te doen en vervolgens uw bestanden over te kopiëren. Diezelfde Git-tools voor Windows hebben een goede ssh-client, waarmee u kunt inloggen op een Linux-box, zoals een Amazon EC2-instantie.
2.1 Een bericht ondertekenen
Er is al een dummy sleutel/certificaat en e-mailbronbestand in de tests map voor alice@example.com, zodat u enige output kunt krijgen zelfs voordat u uw eigen sleutels hebt. Typ gewoon het volgende:
cd tests ../sparkpostSMIME.py example_email1.eml --sign
En u krijgt:
Aan: Bob <bob@example.com> Van: Alice <alice@example.com> Onderwerp: Een bericht MIME-versie: 1.0 Content-Type: application/x-pkcs7-mime; smime-type=signed-data; naam="smime.p7m" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" MIIKXAYJKoZIhvcNAQcCoIIKTTCCCkkCAQExDzANBglghkgBZQMEAgEFADCCAQoGCSqGSIb3DQEH AaCB/ASB+VRvOiBCb2IgPGJvYkBleGFtcGxlLmNvbT4NCkZyb206IEFsaWNlIDxhbGljZUBleGFt : :
U kunt geen e-mails verzenden vanaf example.com via SparkPost tenzij u dat domein bezit, dus de volgende stap is om uw eigen sleutel te gebruiken en een ondertekend bericht vanaf uw eigen domein te verzenden.
3. Verstuur een ondertekend bericht via SparkPost
Laten we nu een echt zendend domein gebruiken, opgezet volgens de SparkPost Nieuwegebruikersgids. We hebben het zendercertificaat en de sleutelbestanden in de huidige directory:
steve@thetucks.com.crt steve@thetucks.com.pem
Het bestand tests/declaration.eml is inbegrepen in het project. Het is gewoon een tekstbestand, dus u kunt het Van: adres aanpassen aan uw eigen zendend domein en het Aan: adres aan uw testontvanger. Het begin van het bestand ziet er als volgt uit:
Aan: Bob <bob.lumreeker@gmail.com> Van: Steve <steve@thetucks.com> Onderwerp: Hier is onze verklaring MIME-versie: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-GB When in the Course of human events it becomes necessary …
Stel uw API-sleutel in:
export SPARKPOST_API_KEY=<<Plaats hier uw API-sleutel>>
Verzend de e-mail:
./sparkpostSMIME.py tests/declaration.eml --sign --send_api
U ziet:
Verbinding geopend naar https://api.sparkpost.com/api/v1 Verzending tests/declaration.eml Van: Steve <steve@thetucks.com> Aan: Bob <bob.lumreeker@gmail.com> OK - in 1,15 seconden
Een seconde later komt de e-mail aan in Bob's inbox. Thunderbird toont het met een rode stip op de envelop, die een geldige zenderhandtekening aangeeft.
Succes! Maak die koffie af, u heeft het verdiend. Als u problemen heeft, controleer dan of uw Van: adres in het e-mailbestand overeenkomt met de naam van uw .crt- en .pem-bestanden.
4. Versleutelen van berichten
Om een bericht te versleutelen, heeft u de openbare sleutel van uw ontvanger nodig in certificaatvorm. Dit is een tekstbestand dat er als volgt uitziet:
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----- lijkt op willekeurige tekens hier -----END CERTIFICATE-----
Er is een dummy-ontvangerscertificaat voor bob@example.com in de tests map, dus u kunt ermee oefenen voordat u een daadwerkelijk certificaat hebt:
cd tests ../sparkpostSMIME.py example_email1.eml --sign --encrypt
U ziet:
Aan: Bob <bob@example.com> Van: Alice <alice@example.com> Onderwerp: Een bericht MIME-versie: 1.0 Content-Type: application/pkcs7-mime; smime-type=enveloped-data; naam=smime.p7m Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=smime.p7m MIIRwQYJKoZIhvcNAQcDoIIRsjCCEa4CAQAxggKlMIICoQIBADCBijCBhDELMAkG :
U zult merken dat de lengte van de output aanzienlijk langer is dan bij een versleuteld bericht omdat het veel extra informatie bevat, evenals het gescramblede bericht zelf.
4.1 Versturen van een versleuteld, ondertekend bericht via SparkPost
Laten we een versleuteld bericht sturen naar een echt e-mailadres. U kunt hetzelfde proces volgen als voorheen (zelfondertekend of een provider zoals Comodo) om een openbare sleutel/certificaat te verkrijgen voor uw eigen ontvangersadressen. U hebt alleen het .crt-bestand nodig – de ontvanger hoeft u nooit hun privésleutel (.p12 en .pem-bestanden) te geven.
Ik heb het bestand bob.lumreeker@gmail.com.crt voor mijn bedoelde ontvanger – dat overeenkomt met het Van: adres in mijn bestand.
Hier is de opdracht om te verzenden:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt --send_api
Ik zie:
Verbinding geopend naar https://api.sparkpost.com/api/v1 Verzending tests/declaration.eml Van: Steve <steve@thetucks.com> Aan: Bob <bob.lumreeker@gmail.com> OK - in 1.168 seconden
De e-mail verschijnt in Thunderbird met het "rode stip" handtekeningpictogram en het "hangslot" versleuteld pictogram.
U kunt net zo eenvoudig complexe HTML-gebaseerde e-mails met links en afbeeldingen verzenden, zoals deze in Deel 1 is getoond. Sommige clients, zoals Thunderbird, vragen om toestemming om externe links en afbeeldingen weer te geven binnen versleutelde S/MIME-berichten, maar alleen ondertekende berichten worden goed weergegeven in clients zoals Thunderbird en Gmail:
Let op de drop-down die "Geverifieerd e-mailadres" toont.
Verdere gedachten & dingen om op te letten
Deze tool volgt een super-eenvoudige aanpak om de benodigde sleutels binnen te halen – deze zoekt gewoon naar benoemde bestanden in de huidige directory. Complexere regelingen, zoals het bewaren van alle sleutels in een database, kunnen makkelijk worden toegevoegd, maar ik wilde de code zo simpel mogelijk maken.
U kunt andere ontvangers toevoegen met Cc: en Bcc: en deze worden geleverd; dit kan nuttig zijn voor archiveringsdoeleinden. Ondertekende berichten worden ontvangen en kunnen door andere ontvangers worden weergegeven, compleet met de handtekening. De tool verwijdert de Bcc: header uit het geleverde bericht (zoals een desktop e-mailclient zou doen).
Om te zorgen dat berichten ongewijzigd door SparkPost worden verzonden (wat het ondertekenen kan verbreken), stelt de tool API-opties in voor "transactionele" mailing, met open en klik tracking uitgeschakeld.
Als u versleuteling gebruikt, houd er dan rekening mee dat de tool het enkele Aan: adres hiervoor selecteert. De andere ontvangers kunnen de berichttekst alleen decoderen als ze de privésleutel van de Aan: ontvanger hebben. Als u alleen secundaire ontvangers gebruikt als een melding van leveringen die zijn gedaan, is dat misschien toch acceptabel.
Ondertekend, verzegeld geleverd... Ik ben van jou
Dat is ons snelle overzicht van het ondertekenen, verzegelen en leveren van S/MIME-berichten via SparkPost. Een snelle herinnering: het demoproject staat op Github hier, ik heb geprobeerd het eenvoudig te installeren en te gebruiken.
Bonusfunctie: het weergeven van MIME-onderdelen met "mimeshow"
RFC822 MIME-multipart-bestandsinternals zijn vrij complex om te lezen voor mensen. Het project bevat een standalone tool om dit gemakkelijker te maken, genaamd mimeshow.
Dit neemt alle e-mailbestanden die u hebt (niet alleen S/MIME-bestanden) en toont de interne structuur. Hier is een voorbeeld:
./mimeshow.py testcases/img_and_attachment.eml
U ziet:
Aan Bob <bob.lumreeker@gmail.com> Van Steve <steve@thetucks.com> Onderwerp Testen van bijlagen enz MIME-versie 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"
U kunt ook gebruiken als een filter om een menselijk leesbare samenvatting van sparkpostSMIME output te geven:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py
U ziet:
Aan Bob <bob.lumreeker@gmail.com> Van Steve <steve@thetucks.com> Onderwerp Hier is onze verklaring Content-Language en-GB MIME-versie 1.0 Content-Type application/pkcs7-mime; smime-type=enveloped-data; naam=smime.p7m Content-Transfer-Encoding base64 Content-Disposition attachment; filename=smime.p7m
Tot slot...
Samenvattend – we hebben enkele eenvoudige command-line tools geïnstalleerd voor het ondertekenen en versleutelen van e-mails (de Github-repo is hier, compleet met installatie-instructies).
We hebben onze verzendersleutel/certificaat voor ondertekening gekregen en een ondertekend bericht via SparkPost verzonden. We hebben een ontvangerscertificaat voor versleuteling verkregen en vervolgens een ondertekend en versleuteld bericht via SparkPost verzonden.
Ten slotte hebben we de handige standalone tool "mimeshow" geprobeerd om de interne structuur van e-mailbestanden te bekijken.
Dat was het voor nu! Tot snel!.