S/MIME Parte 2: Firmado, Sellado y Entregado a través de SparkPost

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.

Author

Pájaro

Categoría

Correo electrónico

S/MIME Parte 2: Firmado, Sellado y Entregado a través de SparkPost

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.

Author

Pájaro

Categoría

Correo electrónico

S/MIME Parte 2: Firmado, Sellado y Entregado a través de SparkPost

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.

Author

Pájaro

Categoría

Correo electrónico

En esta entrega, haremos:

  • Instalar algunas herramientas simples de línea de comandos para firmar y cifrar correos electrónicos

  • Obtener su clave / certificado de remitente para firmar

  • Enviar un mensaje firmado a través de SparkPost y observar el mensaje recibido

  • Opcionalmente, obtener su certificado de destinatario para cifrado

  • Enviar un mensaje firmado y cifrado a través de SparkPost y observar el mensaje recibido

  • Probar una herramienta independiente útil llamada “mimeshow” para examinar los internos de los archivos de correo electrónico.

¡OK, empecemos!

1. Instalar las herramientas

Las herramientas de demostración están en Github aquí, completas con instrucciones de instalación. Puede que note el logo de “build passing” – Travis y pytest comprueban automáticamente el estado de la construcción. Tenga en cuenta que estas herramientas no están oficialmente soportadas por SparkPost, pero he tratado de hacerlas robustas y fáciles de usar.

Si tiene algo de experiencia con Python y pip, la instalación deberá resultar bastante familiar. El Pipfile se encarga automáticamente de las dependencias externas por usted. Una vez que haya terminado, puede comprobar que todo está instalado ejecutando

./sparkpostSMIME.py -h

Debería ver el texto de ayuda amigable. 

A continuación, necesitamos…

2. Obtener su clave / certificado de remitente para firmar

Si ya tiene un archivo de clave para su identidad de envío, puede avanzar. De lo contrario, aquí tiene dos opciones para elegir:

a) Clave / certificado de prueba autofirmado (no válidos externamente)



Si solo está probando, puede crear certificados y claves “autofirmados” para una dirección de correo electrónico usando la herramienta de línea de comandos openssl en Linux, siguiendo un procedimiento como este. Al final de ese proceso, tendrá un archivo smime.p12 . Cambie el nombre de este archivo para que coincida con su identidad de envío, incluyendo el signo @, por ejemplo, alice@example.com.p12 .

o

b) Claves / certificados válidos externamente



Si desea obtener claves / certificados válidos externamente que le permitan firmar, hay una lista de proveedores aquí. Encontré que Comodo funciona bien (gratis para uso no comercial), y es más fácil que el procedimiento de autofirma anterior. Siga el proceso de registro, reciba su correo de validación y asegúrese de abrir el enlace en Firefox. Vaya a Preferencias de Firefox / Privacidad y Seguridad. Desplácese hasta Certificados / Ver Certificados:


Seleccione su certificado y use la opción “Backup” para guardarlo como un archivo en formato PKCS12 (agregue la extensión de archivo .p12 a su nombre de archivo) que lleve la clave privada y la cadena de certificados públicos.


Proporcione una contraseña para asegurar el archivo .p12:

Generar archivos de clave pública (.crt) y privada (.pem) separados

Ya sea que haya usado a) o b), ahora tendrá un archivo .p12 para su identidad de remitente. Ese es un gran paso adelante: ¡tómese un café ahora!

Ahora necesitamos generar archivos de clave pública y privada separados como este, sustituyendo su propia dirección de correo electrónico por la del ejemplo. (Mac OSX y 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

Necesitará ingresar la contraseña que proporcionó anteriormente. Tenga en cuenta que esas barras invertidas \ se utilizan para escapar el signo @ – no para separar los nombres de una ruta de directorio (ese es un slash hacia adelante / en Mac OSX y Linux).

Si está usando Windows, hay implementaciones de openssl disponibles como la de MINGW64 que está integrada en las herramientas de línea de comandos de Git, pero encontré que tendía a bloquearse. Probablemente le resulte más fácil y más rápido hacer esto en Linux y luego copiar sus archivos. Esas mismas herramientas de Git para Windows vienen con un buen cliente ssh que puede usar para iniciar sesión en una máquina Linux, como una instancia de Amazon EC2.


2.1 Firmar un mensaje

Ya hay una clave/certificado ficticio y un archivo fuente de correo electrónico en el directorio de pruebas para alice@example.com, por lo que puede obtener algo de salida incluso antes de tener sus propias claves. Simplemente escriba lo siguiente:

cd tests ../sparkpostSMIME.py example_email1.eml --sign

Y obtendrá:

Para: Bob <bob@example.com> De: Alice <alice@example.com> Asunto: Un mensaje MIME-Version: 1.0 Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" MIIKXAYJKoZIhvcNAQcCoIIKTTCCCkkCAQExDzANBglghkgBZQMEAgEFADCCAQoGCSqGSIb3DQEH AaCB/ASB+VRvOiBCb2IgPGJvYkBleGFtcGxlLmNvbT4NCkZyb206IEFsaWNlIDxhbGljZUBleGFt : :

En realidad no puede enviar correos electrónicos desde example.com a través de SparkPost a menos que posea ese dominio, así que el siguiente paso es usar su propia clave y enviar un mensaje firmado desde su propio dominio.


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 los archivos de certificado y clave del remitente 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, así que puede personalizar la dirección De: para adaptarla a su propio dominio de envío y la dirección Para: para acomodar a su destinatario de prueba. El comienzo del archivo se vería 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: es-ES Cuando, en el curso de los acontecimientos humanos, se vuelve necesario …


Establezca su clave API:

export SPARKPOST_API_KEY=<<Coloque su clave API aquí>>

Envía el correo electrónico:

./sparkpostSMIME.py tests/declaration.eml --sign --send_api


Verá:

Se abrió conexión con 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 a la bandeja de entrada 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 tiene problemas, compruebe que su dirección De: en el archivo de correo electrónico coincida con el nombre de sus archivos .crt y .pem.


4. Cifrando mensajes

Para cifrar un mensaje, necesita la clave pública de su destinatario en forma de certificado. Este es un archivo de texto que se ve así:

Atributos del paquete   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----- se ve como caracteres aleatorios aquí -----END CERTIFICATE-----

Hay un certificado ficticio de destinatario para bob@example.com en el directorio de pruebas, por lo que puede practicar con él antes de tener un certificado real:

cd tests ../sparkpostSMIME.py example_email1.eml --sign --encrypt


Verá:


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á que la longitud de la salida es considerablemente mayor que con un mensaje cifrado porque lleva una gran cantidad de información extra además del mensaje encriptado en sí.


4.1 Enviar un mensaje cifrado y firmado a través de SparkPost

Vamos a enviar un mensaje cifrado a una dirección de correo electrónico real. Puede seguir el mismo proceso que antes (autofirmado o un proveedor como Comodo) para obtener una clave pública / certificado para sus propias direcciones de destinatario. Solo necesita el archivo .crt – el destinatario no necesita nunca darle 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 De: en mi archivo.

Aquí está el comando para enviar:

./sparkpostSMIME.py tests/declaration.eml --sign --encrypt --send_api


Veo:

Se abrió conexión con 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 “candado” cifrado.


Puede 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 e imágenes externas dentro de los mensajes cifrados S/MIME, pero los mensajes solo firmados se muestran bien en clientes como Thunderbird y Gmail:


Tenga en cuenta que el menú desplegable muestra “Dirección de correo electrónico verificada”.


Reflexiones adicionales y cosas a tener en cuenta

Esta herramienta adopta un enfoque súper simple para obtener las claves necesarias: solo busca archivos con nombres en el directorio actual. Se podrían agregar arreglos más complejos, como mantener todas las claves en una base de datos, pero quería que el código fuera lo más simple posible.

Puede incluir otros destinatarios con Cc: y Bcc: y se entregarán; esto podría ser útil para fines de archivo. Los mensajes firmados son recibidos y pueden ser mostrados por otros destinatarios completos 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 a través de SparkPost sin cambios (lo que podría romper la firma), la herramienta establece opciones de API para mailing “transaccional”, con el seguimiento de apertura y clics deshabilitado.

Si utiliza cifrado, tenga en cuenta que la herramienta recoge la única dirección Para: para eso. Los otros destinatarios pueden decodificar el cuerpo del mensaje solo si tienen la clave privada del destinatario. Si está utilizando destinatarios secundarios como un registro de entregas realizadas, por ejemplo, eso puede estar bien de todos modos.


Firmado, sellado, entregado... Soy tuyo

Este es nuestro rápido resumen de cómo firmar, sellar y entregar mensajes S/MIME a través de SparkPost. Recuerde: el proyecto de demostración está en Github aquí, he intentado hacerlo fácil de instalar y usar.


Función adicional: mostrar partes MIME con “mimeshow”

Los archivos de varias partes MIME RFC822 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 tenga (no solo los S/MIME) y muestra la estructura interna. Aquí hay un ejemplo:

./mimeshow.py testcases/img_and_attachment.eml


Verás:



Para Bob <bob.lumreeker@gmail.com>

 De Steve <steve@thetucks.com> 

Asunto Probando archivos adjuntos etc. 

MIME-Version 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"

También puede usarlo como un filtro para dar un resumen legible por humanos de la salida 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 

Content-Language es-GB

 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


Finalmente…

Para resumir: 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 de remitente para firmar y enviamos un mensaje firmado a través de SparkPost. Obtuvimos un certificado de destinatario para cifrado y luego enviamos un mensaje firmado y cifrado a través de SparkPost.


Por último, probamos la útil herramienta independiente “mimeshow” para observar los internos de los archivos de correo electrónico.


¡Eso es todo por ahora! ¡Hasta pronto!.

Sign up

La plataforma potenciada por IA para Marketing, Soporte y Finanzas

Al hacer clic en "Obtener una demostración" aceptas los términos de Bird's

Sign up

La plataforma potenciada por IA para Marketing, Soporte y Finanzas

Al hacer clic en "Obtener una demostración" aceptas los términos de Bird's

Sign up

La plataforma potenciada por IA para Marketing, Soporte y Finanzas

Al hacer clic en "Obtener una demostración" aceptas los términos de Bird's

Channels

Grow

Engage

Automate

APIs

Resources

Company

Socials

Crecer

Gestionar

Automatizar

Crecer

Gestionar

Automatizar