S/MIME Parte 4: Recopilación de claves públicas de destinatario de forma sencilla - con SparkPost Inbound Relay Webhooks

S/MIME Parte 4: Recopilación de claves públicas de destinatario de forma sencilla - con SparkPost Inbound Relay Webhooks

S/MIME Parte 4: Recopilación de claves públicas de destinatario de forma sencilla - con SparkPost Inbound Relay Webhooks

Feb 1, 2019

Publicado por

Publicado por

Bird

Bird

-

Categoría:

Categoría:

Email

Email

Ready to see Bird
in action?

Ready to see Bird
in action?

S/MIME Part 4: Collecting Recipient Public Keys the Easy Way – with SparkPost Inbound Relay Webhooks

In parte 1, we had a quick tour of S/MIME, looking at signing and encryption of our message streams across a range of mail clients. Parte 2 took us through a simple command-line tool to sign and encrypt emails, then send them through SparkPost. Part 3 showed how to inject secure mail streams into on-premises platforms such as Puerto25 PowerMTA and Momentum.

En esta serie, hemos visto cómo incluir una firma S/MIME es bastante sencillo. Enviar correo cifrado S/MIME es más complejo porque necesitas obtener las claves públicas del destinatario. Una cosa es cuando usas un cliente de correo para humanos como Thunderbird, pero ¿cómo puede funcionar con flujos de correo generados por aplicaciones?


Pero espera: hay otra forma de entrar en Mordor para conseguir esas llaves. Su servicio puede invitar a sus clientes (por correo electrónico, por supuesto) a que le envíen un correo firmado a una dirección conocida del servicio de atención al cliente. Usando los poderes mágicos de SparkPost Inbound Relay webhooks, extraeremos y almacenaremos esa clave pública para que la uses.


Podemos resumirlo en un sencillo caso práctico:


  • Como destinatario de mensajes, pongo a disposición de su servicio mi firma personal de correo electrónico para que, en el futuro, se me puedan enviar correos electrónicos cifrados S/MIME.


A partir de ahí, deduzcamos algunos requisitos más detallados:


  • Necesitamos un servicio de correo electrónico entrante fiable y siempre activo para recibir esos mensajes firmados.

  • No debería haber requisitos especiales sobre el formato del correo, aparte de que debe llevar una firma S/MIME.

  • Dado que cualquiera puede intentar enviar un correo a este servicio, debe diseñarse de forma defensiva, por ejemplo, para rechazar mensajes "spoof" de malos actores. Deberá haber varias capas de comprobación.

  • If everything checks out OK, the service will store the certificate in a file, using the well-known plain-text Privacidad-Enhanced Mail (PEM) format.


Hay algunos requisitos no funcionales:


  • Los servicios webhook de máquina a máquina pueden ser difíciles de ver sólo a partir de las respuestas a lo que está sucediendo en su interior. El servicio debe proporcionar registros extensos a nivel de aplicación legibles por humanos. En particular, debe registrarse el análisis y la comprobación del certificado.

  • We add test cases for the app internals, using the nice Pytest framework, and run those tests automatically on check-in using Travis CI integration with GitHub.


Bien, empecemos.


1. Resumen de la solución

Este es el aspecto que tendrá la solución global.


2. Instalación, configuración e inicio de la aplicación web

Empezaremos con esta parte, para tenerla completamente probada antes de conectar los webhooks de retransmisión entrantes.


En web app is included in the same Proyecto GitHub as parts 1 – 3, so if you’ve followed those parts, you already have it. Here are the new bits:


  • Programa readSMIMEsig.py - lee un correo electrónico y analiza los certificados intermedios y de usuario.

  • Programa webapp.py - sencilla aplicación web compatible con Flask para su uso con SparkPost Inbound Relay Webhooks.

  • webapp.ini - archivo de configuración para lo anterior. Un archivo de configuración permite pasar fácilmente los mismos valores tanto a la línea de comandos como a las aplicaciones web.


You need to ensure your host has the correct TCP port number open to inbound requests from the outside world so that SparkPost can POST messages to your app. If you’re hosted on AWS EC2, for example, you’ll need to configure the Grupo de seguridad of your instance.


Instructions for configuring and starting the web app are given here – it’s quite easy. To check your app is running and accessible from the outside world, you can send (blank) requests from another host using curl, for example:

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

Debería ver una respuesta del tipo:

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

Esto es bueno: ¡tu aplicación está funcionando!


En webapp.log en su host, verá una salida similar a esta:

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: Ninguno


To help you play with real data in your app straight away, you can import this specific Solicitud de cartero from the project repo. This simulates what your SparkPost account will be doing, i.e. it sends an https POST containing an email with a specific, valid certificate (belonging to a test account of mine) to your app.


Sólo tienes que cambiar la dirección de destino en la solicitud (en el cuadro gris de arriba) para que coincida con tu instalación. Si cambiaste el valor del token en webapp.ini, ajusta el valor del encabezado en Postman para que coincida.


Si tu aplicación funciona, verás una respuesta "200 OK" en Postman. Tu archivo host webapp.log contendrá una salida como esta:

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,| written file ./bob.lumreeker@gmail.com.crt,bytes=1870,ok=True


Para una comprobación rápida, busque la última línea: si dice "archivo escrito", entonces está bien. El resto muestra la comprobación DKIM y el proceso de validación del certificado.


3. Configuración de webhooks de retransmisión de entrada de SparkPost

Firstly, we select a domain to use as our inbound message address –  here, it will be inbound.thetucks.com. Set your domain up following this guide. Here are the steps I used in detail:


3.1 Añadir registros MX

Necesitarás acceder a la cuenta específica de tu proveedor de servicios de Internet. Una vez hecho esto, puede comprobarlos con dig - aquí está el comando para mi dominio.

dig +short MX inbound.thetucks.com

Deberías verlo:

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


3.2 Crear un dominio de entrada

Use the SparkPost Colección de API Postman, selecting the Inbound Domains / Create .. call. En body of the POST request contains your domain, for example:

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


3.3 Crear un Webhook de retransmisión

Cree un webhook de retransmisión entrante utilizando la llamada Postman correspondiente. El cuerpo del mensaje en mi caso contiene:

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

As mentioned before, I recommend establecer un auth_token to your own secret value, as set in the webapp.ini file on your host.

El valor de "destino" debe coincidir con la dirección del host y el puerto TCP donde se alojará la aplicación web.

El valor de su "dominio" debe coincidir con los registros MX configurados en el paso 1.



¡Ya está! La fontanería está hecha. Ahora debería ser capaz de enviar certificados a su dirección de entrada, serán procesados y aparecerán en el host de su aplicación web - en este caso, un archivo llamado bob.lumreeker@gmail.com.crt.

Now you can send encrypted emails to Bob, using the tools described in parts 2 & 3 of this series.

Puede examinar el contenido de un certificado utilizando:

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


4. Internos: Comprobación DKIM, validación de certificados

The app checks received emails have valid DKIM and checks that the certificates themselves are valid, as described here. There are implementation notes in there too, and ideas for further work.


Resumiendo...

Hemos visto cómo las claves públicas de los destinatarios se pueden recopilar fácilmente utilizando un correo electrónico a una dirección webhooks de retransmisión entrante. Una vez hecho esto, los destinatarios pueden recibir sus mensajes en formato cifrado S/MIME.

Eso es todo por ahora. Feliz envío.

Your new standard in Marketing, Pay & Sales. It's Bird

The right message -> a la right person -> en el right time.

Your new standard in Marketing, Pay & Sales. It's Bird

The right message -> a la right person -> en el right time.