
En esta serie, hemos visto que incluir una firma S/MIME es bastante sencillo. Enviar correo electrónico cifrado con S/MIME es más complejo porque necesitas obtener las claves públicas de los destinatarios. Es una cosa cuando usas un cliente de correo para humanos como Thunderbird, pero ¿cómo puede funcionar eso con flujos de correo electrónico generados por aplicaciones?
En la parte 1, hicimos un breve recorrido por S/MIME, observando la firma y el cifrado de nuestros flujos de mensajes a través de una variedad de clientes de correo. Parte 2 nos llevó a través de una sencilla herramienta de línea de comandos para firmar y cifrar correos electrónicos, luego enviarlos a través de SparkPost. Parte 3 mostró cómo inyectar flujos de correo seguros en plataformas locales como Port25 PowerMTA y Momentum.
En esta serie, hemos visto cómo incluir una firma S/MIME es bastante sencillo. Enviar correo cifrado con S/MIME es más complejo porque necesitas obtener las claves públicas de los destinatarios. Es una cosa cuando usas un cliente de correo para humanos como Thunderbird, pero ¿cómo puede funcionar eso con flujos de correo generados por aplicaciones? Los correos electrónicos generados por aplicaciones, como los utilizados por plataformas de citas, requieren una estrategia cuidadosa para maximizar la participación. Vea cómo las aplicaciones de citas crean experiencias de correo electrónico provocativas.
Pero espera, hay otra manera de entrar a Mordor para obtener esas claves. Tu servicio puede invitar a tus clientes (por correo electrónico, por supuesto) a enviarte de vuelta un correo firmado a una dirección de servicio al cliente conocida. Usando los poderes mágicos de los webhooks de SparkPost Inbound Relay, extraeremos y guardaremos esa clave pública para que puedas usarla.
Podemos resumir esto en un caso de uso simple:
Como destinatario de mensajes, proporciono a tu servicio mi firma de correo electrónico personal a través del correo electrónico, para que en el futuro, los correos electrónicos puedan ser enviados a mí en forma cifrada S/MIME.
De esto, derivemos algunos requisitos más detallados:
Necesitamos un servicio de correo electrónico entrante siempre activo y confiable para recibir esos correos firmados.
No debe haber requisitos especiales sobre el formato del correo, aparte de que debe llevar una firma S/MIME.
Debido a que cualquiera puede intentar enviar un correo a este servicio, debe diseñarse de manera defensiva, por ejemplo, para rechazar mensajes "falsos" de actores malintencionados. Habrá la necesidad de varias capas de verificación.
Si todo está bien, el servicio almacenará el certificado en un archivo, usando el conocido formato de texto plano Privacy-Enhanced Mail (PEM).
Hay algunos requisitos no funcionales:
Los servicios de webhook de máquina a máquina pueden ser difíciles de ver solo desde las respuestas para lo que está sucediendo dentro. El servicio debe proporcionar registros a nivel de aplicación extensibles y legibles por humanos. En particular, se debería registrar el análisis y la verificación de certificados.
Añadimos casos de prueba para el interior de la aplicación, usando el agradable marco Pytest, y ejecutamos esas pruebas automáticamente al hacer check-in usando la integración de Travis CI con GitHub.
¡Bien, comencemos!
1. Resumen de la solución
Así es como se verá la solución general.

2. Instalación, configuración y puesta en marcha de la aplicación web
3. Configuración de webhooks de SparkPost inbound relay
Primero, seleccionamos un dominio para usar como nuestra dirección de mensajes entrantes – aquí, será inbound.thetucks.com. Configura tu dominio siguiendo esta guía. Aquí están los pasos que usé en detalle:
3.1 Añadir Registros MX
Necesitarás acceso a tu cuenta específica de Proveedor de Servicios de Internet. Cuando termines, puedes verificarlo con dig – aquí está el comando para mi dominio.
dig +short MX inbound.thetucks.com
Deberías ver:
10 rx3.sparkpostmail.com. 10 rx1.sparkpostmail.com. 10 rx2.sparkpostmail.com.
3.2 Crear un Dominio Entrante
Usa la colección de API de SparkPost en Postman, seleccionando el llamado Crear Dominios Entrantes. El cuerpo de la solicitud POST contiene tu dominio, por ejemplo:
{ "domain": "inbound.thetucks.com" }

3.3 Crear un Webhook de Redirección
Crea un webhook de redirección entrante usando la llamada relevante en Postman. 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" } }
Como se mencionó antes, recomiendo configurar un auth_token con tu propio valor secreto, tal como está configurado en el archivo webapp.ini en tu host.
Tu valor “target” necesita coincidir con la dirección de tu host y el puerto TCP donde estarás alojando la aplicación web.
Tu valor “domain” necesita coincidir con tus registros MX configurados en el paso 1.

¡Eso es todo! La integración está hecha. Deberías poder enviar certificados a tu dirección de entrada, serán procesados y aparecerán en el host de tu aplicación web – en este caso, un archivo llamado bob.lumreeker@gmail.com.crt.
Ahora puedes enviar correos electrónicos encriptados a Bob, usando las herramientas descritas en las partes 2 & 3 de esta serie.
Puedes examinar el contenido de un certificado usando:
openssl x509 -inform PEM -in bob.lumreeker\@gmail.com.crt -text -noout
4. Internals: DKIM checking, validación de certificados
La aplicación verifica que los correos electrónicos recibidos tengan DKIM válidos y verifica que los propios certificados sean válidos, como se describe aquí. También hay notas de implementación allí, e ideas para trabajo futuro.
Resumiendo…
Hemos visto cómo se pueden recopilar fácilmente las claves públicas de los destinatarios usando un correo electrónico a una dirección de webhook de retransmisión entrante. Una vez hecho, esos destinatarios pueden recibir sus mensajes en forma cifrada S/MIME.
¡Eso es todo por ahora! Felices envíos.