Zasięg

Grow

Manage

Automate

Zasięg

Grow

Manage

Automate

S/MIME Część 4: Łatwe zbieranie kluczy publicznych odbiorców – z webhookami SparkPost Inbound Relay

Email

1 min read

S/MIME Część 4: Łatwe zbieranie kluczy publicznych odbiorców – z webhookami SparkPost Inbound Relay

Email

1 min read

S/MIME Część 4: Łatwe zbieranie kluczy publicznych odbiorców – z webhookami SparkPost Inbound Relay

W tej serii widzieliśmy, że dołączenie podpisu S/MIME jest stosunkowo proste. Wysyłanie zaszyfrowanej poczty S/MIME jest bardziej skomplikowane, ponieważ musisz uzyskać klucze publiczne odbiorców. To jedna rzecz, gdy korzystasz z klienta pocztowego dla ludzi, takiego jak Thunderbird – ale jak to może działać w przypadku generowanych przez aplikację strumieni e-mailowych?

W części 1 odbyliśmy szybką wycieczkę po S/MIME, przyglądając się podpisywaniu i szyfrowaniu naszych strumieni wiadomości w różnych klientach pocztowych. Część 2 przeprowadziła nas przez proste narzędzie wiersza poleceń do podpisywania i szyfrowania e-maili, a następnie wysyłania ich przez SparkPost. Część 3 pokazała, jak wprowadzać bezpieczne strumienie poczty do platform lokalnych takich jak Port25 PowerMTA i Momentum.

W tej serii widzieliśmy, że dołączanie podpisu S/MIME jest dość proste. Wysyłanie szyfrowanej poczty S/MIME jest bardziej skomplikowane, ponieważ trzeba uzyskać klucze publiczne odbiorców. To jedno, gdy używasz klienta pocztowego dla ludzi, takiego jak Thunderbird - ale jak to może działać z generowanymi przez aplikację strumieniami e-mail?

Ale czekaj – jest inny sposób na dotarcie do Mordoru, aby zdobyć te klucze. Twoja usługa może zaprosić klientów (oczywiście przez e-mail) do odesłania podpisanej wiadomości na znany adres obsługi klienta. Korzystając z magicznych mocy SparkPost Inbound Relay webhooks, wyodrębnimy i przechowamy ten klucz publiczny, abyś mógł go użyć.

Możemy to podsumować w prostym przypadku użycia:

  • Jako odbiorca wiadomości, dostarczam Twojej usłudze mój osobisty podpis e-mailowy poprzez e-mail, aby w przyszłości wiadomości można było do mnie wysyłać w postaci zaszyfrowanej S/MIME.

Z tego wyprowadźmy bardziej szczegółowe wymagania:

  • Potrzebujemy zawsze dostępnej, niezawodnej usługi odbierania e-maili, aby odbierać te podpisane wiadomości.

  • Nie powinny być wymagane żadne specjalne formaty poczty, poza tym, że powinny zawierać podpis S/MIME.

  • Ponieważ każdy może spróbować wysłać maila do tej usługi, powinna być zaprojektowana defensywnie, na przykład, aby odrzucać „podszyte się” wiadomości od złych aktorów. Konieczne będzie kilka warstw sprawdzania.

  • Jeśli wszystko zostanie prawidłowo zweryfikowane, usługa zapisze certyfikat w pliku, używając dobrze znanego formatu tekstowego Privacy-Enhanced Mail (PEM).

Istnieją pewne wymagania niefunkcjonalne:

  • Usługi webhook maszynowo-maszynowe mogą być trudno widoczne tylko z odpowiedzi na to, co dzieje się wewnątrz. Usługa powinna dostarczać obszerne, zrozumiałe dla ludzi logi aplikacyjne. W szczególności, parsowanie i sprawdzanie certyfikatów powinno być logowane.

  • Dodajemy przypadki testowe dla wewnętrznych elementów aplikacji, używając przydatnego frameworku Pytest i automatycznie uruchamiamy te testy przy zameldowaniu przy użyciu integracji Travis CI z GitHub.

OK – zacznijmy!

1. Przegląd rozwiązania

Oto jak będzie wyglądało ogólne rozwiązanie.

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

2. Instalacja, konfiguracja i uruchamianie aplikacji webowej

Zaczniemy od tej części, aby mieć ją w pełni przetestowaną przed przygotowaniem webhooków do przychodzących wiadomości.

Aplikacja webowa jest zawarta w tym samym projekcie GitHub co części 1 – 3, więc jeśli śledziłeś te części, już ją masz. Oto nowe elementy:

  • Program readSMIMEsig.py – odczytaj email i wyodrębnij certyfikaty pośrednie i użytkowników.

  • Program webapp.py – prosta aplikacja webowa kompatybilna z Flask do użycia z SparkPost Inbound Relay Webhooks.

  • webapp.ini – plik konfiguracyjny dla powyższego. Plik konfiguracyjny umożliwia łatwe przekazywanie tych samych wartości zarówno do aplikacji wiersza poleceń, jak i aplikacji webowych.

Musisz upewnić się, że twój host ma otwarty poprawny numer portu TCP na przychodzące żądania z zewnątrz, aby SparkPost mógł przesyłać wiadomości do twojej aplikacji. Jeśli jesteś hostowany na przykład na AWS EC2, będziesz musiał skonfigurować Security Group swojej instancji.

Instrukcje dotyczące konfigurowania i uruchamiania aplikacji webowej znajdują się tutaj – jest to dość proste. Aby sprawdzić, czy twoja aplikacja działa i jest dostępna z zewnątrz, możesz wysłać (puste) żądania z innego hosta używając na przykład curl:

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

Powinieneś zobaczyć odpowiedź taką jak:

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

To jest dobra rzecz – twoja aplikacja działa!

W webapp.log na twoim hoście zobaczysz informacje podobne do tych:

2019-01-15 00:11:07,575,root,INFO,Request from 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

Aby od razu zacząć pracę z rzeczywistymi danymi w swojej aplikacji, możesz zaimportować to konkretne żądanie Postman z repozytorium projektu. Symuluje ono to, co robi twój konto SparkPost, tj. wysyła https POST zawierający email z konkretnym, ważnym certyfikatem (należącym do mojego konta testowego) do twojej aplikacji.

Musisz tylko zmienić docelowy adres w żądaniu (w szarym polu powyżej), aby pasował do twojej instalacji. Jeśli zmieniłeś wartość tokenu w webapp.ini, dostosuj wartość nagłówka w Postman, aby pasowała.

Jeśli twoja aplikacja działa poprawnie, zobaczysz zwrotną odpowiedź „200 OK” w Postman. Plik webapp.log twojego hosta zawierać będzie takie dane wyjściowe:

2019-01-15 00:11:48,554,root,INFO,Request from 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 passed 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,| Certificate: 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,| Certificate: 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,| napisana plik ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Dla szybkiej kontroli sprawdzenia, poszukaj ostatniej linii – jeśli mówi „napisana plik”, to jesteś bezpieczny. Reszta pokazuje proces kontroli DKIM i walidacji certyfikatu.

Zaczniemy od tej części, aby mieć ją w pełni przetestowaną przed przygotowaniem webhooków do przychodzących wiadomości.

Aplikacja webowa jest zawarta w tym samym projekcie GitHub co części 1 – 3, więc jeśli śledziłeś te części, już ją masz. Oto nowe elementy:

  • Program readSMIMEsig.py – odczytaj email i wyodrębnij certyfikaty pośrednie i użytkowników.

  • Program webapp.py – prosta aplikacja webowa kompatybilna z Flask do użycia z SparkPost Inbound Relay Webhooks.

  • webapp.ini – plik konfiguracyjny dla powyższego. Plik konfiguracyjny umożliwia łatwe przekazywanie tych samych wartości zarówno do aplikacji wiersza poleceń, jak i aplikacji webowych.

Musisz upewnić się, że twój host ma otwarty poprawny numer portu TCP na przychodzące żądania z zewnątrz, aby SparkPost mógł przesyłać wiadomości do twojej aplikacji. Jeśli jesteś hostowany na przykład na AWS EC2, będziesz musiał skonfigurować Security Group swojej instancji.

Instrukcje dotyczące konfigurowania i uruchamiania aplikacji webowej znajdują się tutaj – jest to dość proste. Aby sprawdzić, czy twoja aplikacja działa i jest dostępna z zewnątrz, możesz wysłać (puste) żądania z innego hosta używając na przykład curl:

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

Powinieneś zobaczyć odpowiedź taką jak:

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

To jest dobra rzecz – twoja aplikacja działa!

W webapp.log na twoim hoście zobaczysz informacje podobne do tych:

2019-01-15 00:11:07,575,root,INFO,Request from 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

Aby od razu zacząć pracę z rzeczywistymi danymi w swojej aplikacji, możesz zaimportować to konkretne żądanie Postman z repozytorium projektu. Symuluje ono to, co robi twój konto SparkPost, tj. wysyła https POST zawierający email z konkretnym, ważnym certyfikatem (należącym do mojego konta testowego) do twojej aplikacji.

Musisz tylko zmienić docelowy adres w żądaniu (w szarym polu powyżej), aby pasował do twojej instalacji. Jeśli zmieniłeś wartość tokenu w webapp.ini, dostosuj wartość nagłówka w Postman, aby pasowała.

Jeśli twoja aplikacja działa poprawnie, zobaczysz zwrotną odpowiedź „200 OK” w Postman. Plik webapp.log twojego hosta zawierać będzie takie dane wyjściowe:

2019-01-15 00:11:48,554,root,INFO,Request from 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 passed 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,| Certificate: 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,| Certificate: 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,| napisana plik ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Dla szybkiej kontroli sprawdzenia, poszukaj ostatniej linii – jeśli mówi „napisana plik”, to jesteś bezpieczny. Reszta pokazuje proces kontroli DKIM i walidacji certyfikatu.

Zaczniemy od tej części, aby mieć ją w pełni przetestowaną przed przygotowaniem webhooków do przychodzących wiadomości.

Aplikacja webowa jest zawarta w tym samym projekcie GitHub co części 1 – 3, więc jeśli śledziłeś te części, już ją masz. Oto nowe elementy:

  • Program readSMIMEsig.py – odczytaj email i wyodrębnij certyfikaty pośrednie i użytkowników.

  • Program webapp.py – prosta aplikacja webowa kompatybilna z Flask do użycia z SparkPost Inbound Relay Webhooks.

  • webapp.ini – plik konfiguracyjny dla powyższego. Plik konfiguracyjny umożliwia łatwe przekazywanie tych samych wartości zarówno do aplikacji wiersza poleceń, jak i aplikacji webowych.

Musisz upewnić się, że twój host ma otwarty poprawny numer portu TCP na przychodzące żądania z zewnątrz, aby SparkPost mógł przesyłać wiadomości do twojej aplikacji. Jeśli jesteś hostowany na przykład na AWS EC2, będziesz musiał skonfigurować Security Group swojej instancji.

Instrukcje dotyczące konfigurowania i uruchamiania aplikacji webowej znajdują się tutaj – jest to dość proste. Aby sprawdzić, czy twoja aplikacja działa i jest dostępna z zewnątrz, możesz wysłać (puste) żądania z innego hosta używając na przykład curl:

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

Powinieneś zobaczyć odpowiedź taką jak:

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

To jest dobra rzecz – twoja aplikacja działa!

W webapp.log na twoim hoście zobaczysz informacje podobne do tych:

2019-01-15 00:11:07,575,root,INFO,Request from 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

Aby od razu zacząć pracę z rzeczywistymi danymi w swojej aplikacji, możesz zaimportować to konkretne żądanie Postman z repozytorium projektu. Symuluje ono to, co robi twój konto SparkPost, tj. wysyła https POST zawierający email z konkretnym, ważnym certyfikatem (należącym do mojego konta testowego) do twojej aplikacji.

Musisz tylko zmienić docelowy adres w żądaniu (w szarym polu powyżej), aby pasował do twojej instalacji. Jeśli zmieniłeś wartość tokenu w webapp.ini, dostosuj wartość nagłówka w Postman, aby pasowała.

Jeśli twoja aplikacja działa poprawnie, zobaczysz zwrotną odpowiedź „200 OK” w Postman. Plik webapp.log twojego hosta zawierać będzie takie dane wyjściowe:

2019-01-15 00:11:48,554,root,INFO,Request from 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 passed 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,| Certificate: 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,| Certificate: 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,| napisana plik ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True

Dla szybkiej kontroli sprawdzenia, poszukaj ostatniej linii – jeśli mówi „napisana plik”, to jesteś bezpieczny. Reszta pokazuje proces kontroli DKIM i walidacji certyfikatu.

3. SparkPost inbound relay webhooks konfiguracja

Po pierwsze, wybieramy domenę do użycia jako nasz adres przychodzącej wiadomości – tutaj będzie to inbound.thetucks.com. Skonfiguruj swoją domenę według tego przewodnika. Oto kroki, które użyłem szczegółowo:

3.1 Dodaj Rekordy MX

Będziesz potrzebować dostępu do swojego konta konkretnego dostawcy usług internetowych. Po zakończeniu, możesz je sprawdzić za pomocą dig – oto polecenie dla mojej domeny.

dig +short MX inbound.thetucks.com

Powinieneś zobaczyć:

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

3.2 Utwórz Domena Przychodząca

Użyj kolekcji Postman API SparkPost, wybierając Inbound Domains / Create .. wywołanie. Treść żądania POST zawiera twoją domenę, na przykład:

{    "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 Utwórz Przekaźnikowy Webhook

Utwórz przychodzący webhook przekaźnikowy, używając odpowiedniego wywołania w Postman. Treść wiadomości w moim przypadku zawiera:

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

Jak wspomniano wcześniej, zalecam ustawienie auth_token na własną tajną wartość, jak określono w pliku webapp.ini na twoim hoście.

Wartość „target” musi odpowiadać adresowi hosta i portowi TCP, gdzie będziesz hostować aplikację.

Wartość „domain” musi odpowiadać rekordu MX skonfigurowanego w kroku 1.

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


To wszystko! Instalacja jest zakończona. Powinieneś teraz móc wysyłać certyfikaty na swój adres przychodzący, będą one przetwarzane i pojawią się na twoim hoście aplikacji webowej – w tym przypadku, w pliku o nazwie bob.lumreeker@gmail.com.crt.

Teraz możesz wysyłać zaszyfrowane e-maile do Boba, używając narzędzi opisanych w częściach 2 i 3 tej serii.

Możesz zbadać zawartość certyfikatu używając:

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

4. Wewnętrzności: sprawdzanie DKIM, walidacja certyfikatu

Aplikacja sprawdza, czy otrzymane e-maile mają ważny DKIM i czy same certyfikaty są ważne, jak opisano tutaj. Znajdują się tam również notatki dotyczące wdrożenia oraz pomysły na dalsze działania.

Podsumowując…

Widzieliśmy, jak klucze publiczne odbiorców mogą być łatwo gromadzone za pomocą wiadomości e-mail na adres webhooks dla przychodzącej wiadomości. Po wykonaniu tego, ci odbiorcy mogą otrzymywać swoje wiadomości w szyfrowanej formie S/MIME.

To wszystko na teraz! Udanych wysyłek.

Połączmy Cię z ekspertem Bird.
Zobacz pełną moc Bird w 30 minut.

Przesyłając, zgadzasz się, że Bird może kontaktować się z Tobą w sprawie naszych produktów i usług.

Możesz zrezygnować z subskrypcji w dowolnym momencie. Zobacz Privacy Statement firmy Bird, aby uzyskać szczegóły dotyczące przetwarzania danych.

Company

Biuletyn

Bądź na bieżąco z Bird dzięki cotygodniowym aktualizacjom do Twojej skrzynki odbiorczej.

Połączmy Cię z ekspertem Bird.
Zobacz pełną moc Bird w 30 minut.

Przesyłając, zgadzasz się, że Bird może kontaktować się z Tobą w sprawie naszych produktów i usług.

Możesz zrezygnować z subskrypcji w dowolnym momencie. Zobacz Privacy Statement firmy Bird, aby uzyskać szczegóły dotyczące przetwarzania danych.

Company

Biuletyn

Bądź na bieżąco z Bird dzięki cotygodniowym aktualizacjom do Twojej skrzynki odbiorczej.

Połączmy Cię z ekspertem Bird.
Zobacz pełną moc Bird w 30 minut.

Przesyłając, zgadzasz się, że Bird może kontaktować się z Tobą w sprawie naszych produktów i usług.

Możesz zrezygnować z subskrypcji w dowolnym momencie. Zobacz Privacy Statement firmy Bird, aby uzyskać szczegóły dotyczące przetwarzania danych.

R

Reach

G

Grow

M

Manage

A

Automate

Company

Biuletyn

Bądź na bieżąco z Bird dzięki cotygodniowym aktualizacjom do Twojej skrzynki odbiorczej.