
En la parte 1, hicimos un rápido 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. Los mensajes S/MIME pueden ser firmados (dando prueba de la identidad del remitente), cifrados (manteniendo el contenido del mensaje en secreto) o ambos.
Business in a box.
Descubre nuestras soluciones.
Habla con nuestro equipo de ventas

En esta entrega, vamos a:
Instalar algunas herramientas simples de línea de comandos para firmar y encriptar correos electrónicos
Obtener tu clave/certificado de remitente para firmar
Enviar un mensaje firmado a través de SparkPost, y mirar el mensaje recibido
Opcionalmente, obtener el certificado del destinatario para encriptar
Enviar un mensaje firmado y encriptado a través de SparkPost, y mirar el mensaje recibido
Probar una herramienta independiente útil "mimeshow" para ver los internos del archivo de correo electrónico.
¡OK – comencemos!
1. Instala las herramientas
Las herramientas de demostración están en Github aquí, completas con instrucciones de instalación. Puede que notes el logo de “build passing” – Travis y pytest comprueban automáticamente el estado de la compilación. Nota que estas herramientas no están oficialmente soportadas por SparkPost, pero he intentado hacerlas robustas y fáciles de usar.
Si tienes algo de conocimiento con Python y pip, la instalación debería ser bastante familiar. El Pipfile se encarga de las dependencias externas automáticamente por ti. Una vez que termine, puedes verificar que todo está instalado ejecutando
./sparkpostSMIME.py -h
Deberías ver el texto de ayuda amigable. A continuación, necesitamos…
2. Obtenga su clave / certificado del remitente para firmar
3. Enviar un mensaje firmado a través de SparkPost
Ahora usemos un dominio de envío real, configurado según la Guía para Nuevos Usuarios de SparkPost. Tenemos el certificado de remitente y los archivos clave en el directorio actual:
steve@thetucks.com.crt steve@thetucks.com.pem
El archivo tests/declaration.eml está incluido en el proyecto. Es solo un archivo de texto, por lo que puedes personalizar la dirección De: para adaptarla a tu propio dominio de envío y la dirección Para: para adaptarla a tu destinatario de prueba. El comienzo del archivo se ve así:
Para: Bob <bob.lumreeker@gmail.com> De: Steve <steve@thetucks.com> Asunto: Aquí está nuestra declaración MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-GB Cuando en el transcurso de los acontecimientos humanos se hace necesario …
Configura tu clave API:
export SPARKPOST_API_KEY=<<Introduce tu clave API aquí>>
Envía el correo electrónico:
./sparkpostSMIME.py tests/declaration.eml --sign --send_api
Verás:
Conexión abierta a https://api.sparkpost.com/api/v1 Enviando tests/declaration.eml De: Steve <steve@thetucks.com> Para: Bob <bob.lumreeker@gmail.com> OK - en 1.15 segundos
Un segundo después, el correo electrónico llega al inbox de Bob. Thunderbird lo muestra con un punto rojo en el sobre, indicando una firma de remitente válida.

¡Éxito! Termina ese café, te lo has ganado. Si tienes problemas, verifica que la dirección De: en el archivo de correo coincida con el nombre de tus archivos .crt y .pem.
4. Cifrado de mensajes
Para cifrar un mensaje, necesitas la clave pública de tu destinatario en formato de certificado. Este es un archivo de texto que se ve así:
Atributos de Bolsa 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----- parece caracteres aleatorios aquí -----END CERTIFICATE-----
Hay un certificado de destinatario de prueba para bob@example.com en el directorio de pruebas, así que puedes practicar con él antes de tener un certificado real:
cd tests ../sparkpostSMIME.py example_email1.eml --sign --encrypt
Verás:
Para: Bob <bob@example.com> De: Alice <alice@example.com> Asunto: Un mensaje MIME-Version: 1.0 Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=smime.p7m MIIRwQYJKoZIhvcNAQcDoIIRsjCCEa4CAQAxggKlMIICoQIBADCBijCBhDELMAkG :
Notarás que la longitud de la salida es bastante más larga que con un mensaje cifrado porque lleva mucha información adicional además del mensaje encriptado en sí.
4.1 Envío de un mensaje cifrado y firmado a través de SparkPost
Enviemos un mensaje cifrado a una dirección de correo electrónico real. Puedes seguir el mismo proceso que antes (autofirmado o un proveedor como Comodo) para obtener una clave pública / certificado para tus propias direcciones de destinatarios. Solo necesitas el archivo .crt; el destinatario nunca necesita darte su clave privada (archivos .p12 y .pem).
Tengo el archivo bob.lumreeker@gmail.com.crt para mi destinatario previsto, que coincide con la dirección From: en mi archivo.
Aquí está el comando para enviar:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt --send_api
Veo:
Conexión abierta a https://api.sparkpost.com/api/v1 Enviando tests/declaration.eml De: Steve <steve@thetucks.com> Para: Bob <bob.lumreeker@gmail.com> OK - en 1.168 segundos
El correo aparece en Thunderbird con el icono de firma "punto rojo" y el icono de "candado" cifrado.

Puedes enviar correos electrónicos complejos basados en HTML con enlaces e imágenes con la misma facilidad, como el que se muestra en la Parte 1. Algunos clientes como Thunderbird piden permiso para mostrar enlaces externos e imágenes dentro de mensajes S/MIME cifrados, pero los mensajes solo firmados se muestran bien en clientes como Thunderbird y Gmail:


Nota que el menú desplegable muestra "Dirección de correo electrónico verificada".
Más pensamientos y cosas a las que prestar atención
Esta herramienta adopta un enfoque súper simple para reunir las claves necesarias: simplemente busca archivos con nombre en el directorio actual. Se podrían añadir arreglos más complejos, como tener todas las claves en una base de datos, pero quería que el código fuera lo más simple posible.
Puedes incluir otros destinatarios con Cc: y Bcc: y serán entregados; esto podría ser útil para fines de archivo. Los mensajes firmados son recibidos y pueden ser mostrados por otros destinatarios junto con la firma. La herramienta elimina el encabezado Bcc: del mensaje entregado (como lo haría un cliente de correo de escritorio).
Para asegurar que los mensajes pasen por SparkPost sin cambios (lo cual podría romper la firma), la herramienta establece opciones de API para correos “transaccionales”, con seguimiento de apertura y clics desactivado.
Si usas cifrado, ten en cuenta que la herramienta recoge la dirección única de To: para eso. Los otros destinatarios pueden descifrar el cuerpo del mensaje solo si tienen la clave privada del destinatario To:. Si solo estás usando destinatarios secundarios como un registro de las entregas realizadas, por ejemplo, eso puede estar bien de todos modos.
Firmado, sellado y entregado... soy tuyo
Esa es nuestra rápida visión general de cómo firmar, sellar y entregar mensajes S/MIME a través de SparkPost. Recordatorio rápido: el proyecto de demostración está en Github aquí, he intentado hacer que sea fácil de instalar y usar.
Función adicional: mostrar partes MIME con “mimeshow”
Los archivos multipart RFC822 MIME son bastante complejos de leer para los humanos. El proyecto incluye una herramienta independiente para facilitar esto, llamada mimeshow.
Esto toma cualquier archivo de correo electrónico que tengas (no solo los S/MIME) y muestra la estructura interna. Aquí tienes un ejemplo:
./mimeshow.py testcases/img_and_attachment.eml
Verás:
Para Bob <bob.lumreeker@gmail.com>
De Steve <steve@thetucks.com>
Asunto Probando anexos etcétera
Versión MIME 1.0
Tipo de contenido multipart/mixed; boundary="------------7D48652042860D0098C65210"
Idioma del contenido en-GB
Tipo de contenido multipart/alternative; boundary="------------58C0BF87598336550D70EB95"
Tipo de contenido text/plain; charset=utf-8; format=flowed
Codificación de transferencia de contenido 7bit
Codificación de transferencia de contenido quoted-printable
Tipo de contenido text/html; charset="utf-8"
Tipo de contenido application/pdf; name="sparkpost-datasheet-tam-technical-account-management.pdf"
Codificación de transferencia de contenido base64
Disposición de contenido attachment; filename="sparkpost-datasheet-tam-technical-account-management.pdf"
También puedes usarlo como filtro para dar un resumen legible del output de sparkpostSMIME:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py
Verás:
Para Bob <bob.lumreeker@gmail.com>
De Steve <steve@thetucks.com>
Asunto Aquí está nuestra declaración
Idioma del contenido en-GB
Versión MIME 1.0
Tipo de contenido application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m
Codificación de transferencia de contenido base64
Disposición de contenido attachment; filename=smime.p7m
Finalmente…
Para recapitular: hemos instalado algunas herramientas simples de línea de comandos para firmar y cifrar correos electrónicos (el repositorio de Github está aquí, completo con instrucciones de instalación).
Obtuvimos nuestra clave/certificado del remitente para firmar y enviamos un mensaje firmado a través de SparkPost. Obtuvimos un certificado de destinatario para el cifrado y luego enviamos un mensaje firmado y cifrado a través de SparkPost.
Por último, probamos la práctica herramienta independiente "mimeshow" para ver los internos de archivos de correo electrónico.
¡Eso es todo por ahora! ¡Nos vemos pronto!