S/MIME Parte 2: Firmado, Sellado y Entregado a través de SparkPost
Pájaro
31 dic 2018
Correo electrónico
1 min read

Puntos clave
Premisa: La Parte 2 pasa de la teoría de S/MIME a la práctica, demostrando cómo firmar digitalmente y encriptar correos electrónicos utilizando SparkPost como la plataforma de entrega.
Objetivo: Equipar a los desarrolladores con un flujo de trabajo ligero y de línea de comandos para firmar mensajes salientes, verificar firmas y (opcionalmente) encriptar contenido para destinatarios específicos.
Destaques:
Configuración: Instalar las herramientas de demostración de código abierto desde GitHub (con comprobaciones automáticas de Travis + pytest). El Pipfile maneja todas las dependencias de Python.
Claves del remitente:
Crear un certificado autofirmado o emitido por CA (
.p12) para tu identidad de correo electrónico.Divídelo en archivos privados (
.pem) y públicos (.crt) para que los use la herramienta de firma.
Firmar:
Usar el script
sparkpostSMIME.pyincluido para firmar mensajes de prueba (e.g.,tests/declaration.eml).Confirmar firmas visualmente en clientes como Thunderbird (ícono de punto rojo).
Encriptación:
Obtener el certificado público (
.crt) de cada destinatario.Ejecutar la herramienta nuevamente para producir un mensaje firmado y encriptado.
Los destinatarios pueden verificar y desencriptar usando sus claves privadas.
Entrega a través de SparkPost:
Configurar un dominio de envío válido y una clave API.
Enviar mensajes a través de la API de SparkPost con el seguimiento desactivado para preservar la integridad.
Utilidad adicional – mimeshow:
Muestra la estructura MIME RFC822 legible para humanos para depuración o inspección.
Consejos prácticos:
Mantener los nombres de archivo alineados con la dirección De:
Evitar modificar los cuerpos de mensajes después de firmar.
Usar Cco solo para copias de archivo: esos destinatarios no pueden desencriptar si el correo está encriptado a una única dirección Para.
Destacados de Q&A
¿Por qué usar S/MIME signing?
Autentica al remitente y asegura la integridad del mensaje — los clientes como Thunderbird muestran un indicador visual cuando la firma es válida.
¿Cómo obtengo mi certificado de remitente?
O bien, autografiar con OpenSSL (para pruebas) u obtener un certificado confiable de proveedores como Comodo (gratuito para uso no comercial).
¿Puedo encriptar mensajes para múltiples destinatarios?
Solo si tienes la clave pública de cada destinatario. El script de demostración cifra a la única dirección To por defecto.
¿Qué medidas de seguridad evitan que las firmas se rompan durante el tránsito?
La herramienta establece las opciones de SparkPost API para el envío transaccional y desactiva el seguimiento de apertura/clic, por lo que la carga útil pasa sin cambios.
¿Cuál es el papel de mimeshow?
Analiza archivos de correo electrónico en bruto y muestra su estructura multipartes — útil para inspeccionar firmas S/MIME, archivos adjuntos y encabezados.
¿Qué sigue en la serie?
La parte 3 extiende estas capacidades de S/MIME a plataformas de correo electrónico seguro en las instalaciones como PowerMTA y Momentum.
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.

En esta entrega, vamos a:
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 ver el mensaje recibido
Opcionalmente, obtener su certificado de destinatario para cifrar
Enviar un mensaje firmado y cifrado a través de SparkPost, y ver el mensaje recibido
Probar una herramienta independiente útil “mimeshow” para ver los internos del archivo de correo electrónico.
¡Bien, empecemos!

En esta entrega, vamos a:
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 ver el mensaje recibido
Opcionalmente, obtener su certificado de destinatario para cifrar
Enviar un mensaje firmado y cifrado a través de SparkPost, y ver el mensaje recibido
Probar una herramienta independiente útil “mimeshow” para ver los internos del archivo de correo electrónico.
¡Bien, empecemos!

En esta entrega, vamos a:
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 ver el mensaje recibido
Opcionalmente, obtener su certificado de destinatario para cifrar
Enviar un mensaje firmado y cifrado a través de SparkPost, y ver el mensaje recibido
Probar una herramienta independiente útil “mimeshow” para ver los internos del archivo de correo electrónico.
¡Bien, empecemos!
Función adicional: mostrar partes MIME con “mimeshow”
Los archivos multiparte 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 tengas (no solo los de S/MIME) y muestra la estructura interna. Aquí hay un ejemplo:
./mimeshow.py testcases/img_and_attachment.eml
Verás:
To Bob <bob.lumreeker@gmail.com> From Steve <steve@thetucks.com> Subject Testing attachments 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 puedes usarlo como un filtro para dar un resumen legible por humanos del output de sparkpostSMIME:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py
Verás:
To Bob <bob.lumreeker@gmail.com> From Steve <steve@thetucks.com> Subject Here is our declaration Content-Language en-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
Los archivos multiparte 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 tengas (no solo los de S/MIME) y muestra la estructura interna. Aquí hay un ejemplo:
./mimeshow.py testcases/img_and_attachment.eml
Verás:
To Bob <bob.lumreeker@gmail.com> From Steve <steve@thetucks.com> Subject Testing attachments 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 puedes usarlo como un filtro para dar un resumen legible por humanos del output de sparkpostSMIME:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py
Verás:
To Bob <bob.lumreeker@gmail.com> From Steve <steve@thetucks.com> Subject Here is our declaration Content-Language en-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
Los archivos multiparte 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 tengas (no solo los de S/MIME) y muestra la estructura interna. Aquí hay un ejemplo:
./mimeshow.py testcases/img_and_attachment.eml
Verás:
To Bob <bob.lumreeker@gmail.com> From Steve <steve@thetucks.com> Subject Testing attachments 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 puedes usarlo como un filtro para dar un resumen legible por humanos del output de sparkpostSMIME:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py
Verás:
To Bob <bob.lumreeker@gmail.com> From Steve <steve@thetucks.com> Subject Here is our declaration Content-Language en-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
1. Instala las herramientas
Las herramientas de demostración están disponibles en GitHub, completas con instrucciones de instalación. Puede que note el logo “build passing” – Travis y pytest verifican automáticamente el estado de la construcción. Note que estas herramientas no están oficialmente respaldadas por SparkPost, pero he intentado hacerlas robustas y fáciles de usar.
Si tiene algún conocimiento de Python y pip, la instalación debería resultar bastante familiar. El Pipfile se encarga automáticamente de las dependencias externas por usted. Una vez que se haya completado, puede verificar que todo esté instalado ejecutando
./sparkpostSMIME.py -hDebería ver el texto de ayuda amigable. A continuación, necesitamos…
Las herramientas de demostración están disponibles en GitHub, completas con instrucciones de instalación. Puede que note el logo “build passing” – Travis y pytest verifican automáticamente el estado de la construcción. Note que estas herramientas no están oficialmente respaldadas por SparkPost, pero he intentado hacerlas robustas y fáciles de usar.
Si tiene algún conocimiento de Python y pip, la instalación debería resultar bastante familiar. El Pipfile se encarga automáticamente de las dependencias externas por usted. Una vez que se haya completado, puede verificar que todo esté instalado ejecutando
./sparkpostSMIME.py -hDebería ver el texto de ayuda amigable. A continuación, necesitamos…
Las herramientas de demostración están disponibles en GitHub, completas con instrucciones de instalación. Puede que note el logo “build passing” – Travis y pytest verifican automáticamente el estado de la construcción. Note que estas herramientas no están oficialmente respaldadas por SparkPost, pero he intentado hacerlas robustas y fáciles de usar.
Si tiene algún conocimiento de Python y pip, la instalación debería resultar bastante familiar. El Pipfile se encarga automáticamente de las dependencias externas por usted. Una vez que se haya completado, puede verificar que todo esté instalado ejecutando
./sparkpostSMIME.py -hDebería ver el texto de ayuda amigable. A continuación, necesitamos…
2. Obtenga su clave / certificado del remitente para firmar
Si ya tienes un archivo de clave para tu identidad de envío, puedes avanzar. De lo contrario, aquí hay dos opciones para elegir:
a) Clave de prueba autofirmada / certificado (no válido externamente)
Si solo estás probando, puedes 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ás un archivo smime.p12. Renombra este archivo para que coincida con tu identidad de envío, incluyendo el signo @, por ejemplo, alice@example.com.p12.
o
b) Claves / certificados válidos externamente
Si deseas obtener claves / certificados válidos externamente que te 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. Sigue el proceso de registro, recibe tu correo de validación y asegúrate de abrir el enlace en Firefox. Ve a Preferencias de Firefox / Privacidad y Seguridad. Desplázate hasta Certificados / Ver Certificados:

Selecciona tu certificado y usa la opción "Backup" para guardar como un archivo en formato PKCS12 (agrega la extensión de archivo .p12 a tu nombre de archivo) que lleva la clave privada y la cadena de certificados públicos.

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

Generar archivos de clave pública (.crt) y privada (.pem) separados
Ya sea que usaste a) o b), ahora tendrás un archivo .p12 para tu identidad de remitente. Eso es un gran avance: ¡tómate un café ahora!
Ahora necesitamos generar archivos de clave pública y privada separados así – sustituyendo tu 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ás ingresar la contraseña que proporcionaste antes. Nota que esas barras invertidas \ se utilizan para escapar el signo @ – no para separar los nombres de una ruta de directorio (eso es una barra inclinada / en Mac OSX y Linux).
Si estás usando Windows, hay implementaciones de openssl disponibles como la de MINGW64 integrada en las herramientas de línea de comandos Git, pero encontré que tendía a bloquearse. Probablemente te resulte más fácil y rápido hacer esto en Linux y luego copiar tus archivos. Esas mismas herramientas de Git para Windows vienen con un buen cliente ssh que puedes utilizar para iniciar sesión en una máquina Linux, como una instancia Amazon EC2.
2.1 Firmar un mensaje
Ya hay un archivo de clave/certificado dummy y un archivo de fuente de correo electrónico en el directorio de pruebas para alice@example.com, por lo que puedes obtener alguna salida incluso antes de tener tus propias claves. Solo escribe lo siguiente:
cd tests ../sparkpostSMIME.py example_email1.eml --sign
Y obtendrás:
To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: A message 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 : :
No puedes realmente enviar correos electrónicos desde example.com via SparkPost a menos que seas propietario de ese dominio, por lo que el siguiente paso es usar tu propia clave y enviar un mensaje firmado desde tu propio dominio.
Si ya tienes un archivo de clave para tu identidad de envío, puedes avanzar. De lo contrario, aquí hay dos opciones para elegir:
a) Clave de prueba autofirmada / certificado (no válido externamente)
Si solo estás probando, puedes 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ás un archivo smime.p12. Renombra este archivo para que coincida con tu identidad de envío, incluyendo el signo @, por ejemplo, alice@example.com.p12.
o
b) Claves / certificados válidos externamente
Si deseas obtener claves / certificados válidos externamente que te 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. Sigue el proceso de registro, recibe tu correo de validación y asegúrate de abrir el enlace en Firefox. Ve a Preferencias de Firefox / Privacidad y Seguridad. Desplázate hasta Certificados / Ver Certificados:

Selecciona tu certificado y usa la opción "Backup" para guardar como un archivo en formato PKCS12 (agrega la extensión de archivo .p12 a tu nombre de archivo) que lleva la clave privada y la cadena de certificados públicos.

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

Generar archivos de clave pública (.crt) y privada (.pem) separados
Ya sea que usaste a) o b), ahora tendrás un archivo .p12 para tu identidad de remitente. Eso es un gran avance: ¡tómate un café ahora!
Ahora necesitamos generar archivos de clave pública y privada separados así – sustituyendo tu 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ás ingresar la contraseña que proporcionaste antes. Nota que esas barras invertidas \ se utilizan para escapar el signo @ – no para separar los nombres de una ruta de directorio (eso es una barra inclinada / en Mac OSX y Linux).
Si estás usando Windows, hay implementaciones de openssl disponibles como la de MINGW64 integrada en las herramientas de línea de comandos Git, pero encontré que tendía a bloquearse. Probablemente te resulte más fácil y rápido hacer esto en Linux y luego copiar tus archivos. Esas mismas herramientas de Git para Windows vienen con un buen cliente ssh que puedes utilizar para iniciar sesión en una máquina Linux, como una instancia Amazon EC2.
2.1 Firmar un mensaje
Ya hay un archivo de clave/certificado dummy y un archivo de fuente de correo electrónico en el directorio de pruebas para alice@example.com, por lo que puedes obtener alguna salida incluso antes de tener tus propias claves. Solo escribe lo siguiente:
cd tests ../sparkpostSMIME.py example_email1.eml --sign
Y obtendrás:
To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: A message 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 : :
No puedes realmente enviar correos electrónicos desde example.com via SparkPost a menos que seas propietario de ese dominio, por lo que el siguiente paso es usar tu propia clave y enviar un mensaje firmado desde tu propio dominio.
Si ya tienes un archivo de clave para tu identidad de envío, puedes avanzar. De lo contrario, aquí hay dos opciones para elegir:
a) Clave de prueba autofirmada / certificado (no válido externamente)
Si solo estás probando, puedes 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ás un archivo smime.p12. Renombra este archivo para que coincida con tu identidad de envío, incluyendo el signo @, por ejemplo, alice@example.com.p12.
o
b) Claves / certificados válidos externamente
Si deseas obtener claves / certificados válidos externamente que te 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. Sigue el proceso de registro, recibe tu correo de validación y asegúrate de abrir el enlace en Firefox. Ve a Preferencias de Firefox / Privacidad y Seguridad. Desplázate hasta Certificados / Ver Certificados:

Selecciona tu certificado y usa la opción "Backup" para guardar como un archivo en formato PKCS12 (agrega la extensión de archivo .p12 a tu nombre de archivo) que lleva la clave privada y la cadena de certificados públicos.

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

Generar archivos de clave pública (.crt) y privada (.pem) separados
Ya sea que usaste a) o b), ahora tendrás un archivo .p12 para tu identidad de remitente. Eso es un gran avance: ¡tómate un café ahora!
Ahora necesitamos generar archivos de clave pública y privada separados así – sustituyendo tu 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ás ingresar la contraseña que proporcionaste antes. Nota que esas barras invertidas \ se utilizan para escapar el signo @ – no para separar los nombres de una ruta de directorio (eso es una barra inclinada / en Mac OSX y Linux).
Si estás usando Windows, hay implementaciones de openssl disponibles como la de MINGW64 integrada en las herramientas de línea de comandos Git, pero encontré que tendía a bloquearse. Probablemente te resulte más fácil y rápido hacer esto en Linux y luego copiar tus archivos. Esas mismas herramientas de Git para Windows vienen con un buen cliente ssh que puedes utilizar para iniciar sesión en una máquina Linux, como una instancia Amazon EC2.
2.1 Firmar un mensaje
Ya hay un archivo de clave/certificado dummy y un archivo de fuente de correo electrónico en el directorio de pruebas para alice@example.com, por lo que puedes obtener alguna salida incluso antes de tener tus propias claves. Solo escribe lo siguiente:
cd tests ../sparkpostSMIME.py example_email1.eml --sign
Y obtendrás:
To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: A message 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 : :
No puedes realmente enviar correos electrónicos desde example.com via SparkPost a menos que seas propietario de ese dominio, por lo que el siguiente paso es usar tu propia clave y enviar un mensaje firmado desde tu 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 el certificado del remitente y los archivos de 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 que se adapte a tu propio dominio de envío y la dirección Para: para que se adapte 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 curso de los eventos humanos se vuelve necesario …
Configura tu clave API:
export SPARKPOST_API_KEY=<<Put your API key here>
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 más tarde, 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.
Ahora usemos un dominio de envío real, configurado según la Guía para Nuevos Usuarios de SparkPost. Tenemos el certificado del remitente y los archivos de 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 que se adapte a tu propio dominio de envío y la dirección Para: para que se adapte 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 curso de los eventos humanos se vuelve necesario …
Configura tu clave API:
export SPARKPOST_API_KEY=<<Put your API key here>
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 más tarde, 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.
Ahora usemos un dominio de envío real, configurado según la Guía para Nuevos Usuarios de SparkPost. Tenemos el certificado del remitente y los archivos de 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 que se adapte a tu propio dominio de envío y la dirección Para: para que se adapte 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 curso de los eventos humanos se vuelve necesario …
Configura tu clave API:
export SPARKPOST_API_KEY=<<Put your API key here>
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 más tarde, 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 forma 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 ficticio 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:
To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: A message 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 del resultado es bastante más larga que con un mensaje cifrado porque lleva mucha información adicional así como el mensaje encriptado en sí mismo.
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 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 destinatario. Solo necesitas el archivo .crt - el destinatario no necesita nunca darte su clave privada (.p12 y .pem archivos).
Tengo el archivo bob.lumreeker@gmail.com.crt para mi destinatario previsto – coincidiendo 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 From: Steve <steve@thetucks.com> To: 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 cifrado "candado".

Puedes enviar correos electrónicos complejos basados en HTML con enlaces e imágenes tan fácilmente como el mostrado 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 sólo firmados se muestran bien en clientes incluyendo Thunderbird y Gmail:


Nota que el desplegable muestra "Dirección de correo verificada".
Para cifrar un mensaje, necesitas la clave pública de tu destinatario en forma 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 ficticio 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:
To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: A message 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 del resultado es bastante más larga que con un mensaje cifrado porque lleva mucha información adicional así como el mensaje encriptado en sí mismo.
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 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 destinatario. Solo necesitas el archivo .crt - el destinatario no necesita nunca darte su clave privada (.p12 y .pem archivos).
Tengo el archivo bob.lumreeker@gmail.com.crt para mi destinatario previsto – coincidiendo 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 From: Steve <steve@thetucks.com> To: 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 cifrado "candado".

Puedes enviar correos electrónicos complejos basados en HTML con enlaces e imágenes tan fácilmente como el mostrado 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 sólo firmados se muestran bien en clientes incluyendo Thunderbird y Gmail:


Nota que el desplegable muestra "Dirección de correo verificada".
Para cifrar un mensaje, necesitas la clave pública de tu destinatario en forma 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 ficticio 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:
To: Bob <bob@example.com> From: Alice <alice@example.com> Subject: A message 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 del resultado es bastante más larga que con un mensaje cifrado porque lleva mucha información adicional así como el mensaje encriptado en sí mismo.
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 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 destinatario. Solo necesitas el archivo .crt - el destinatario no necesita nunca darte su clave privada (.p12 y .pem archivos).
Tengo el archivo bob.lumreeker@gmail.com.crt para mi destinatario previsto – coincidiendo 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 From: Steve <steve@thetucks.com> To: 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 cifrado "candado".

Puedes enviar correos electrónicos complejos basados en HTML con enlaces e imágenes tan fácilmente como el mostrado 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 sólo firmados se muestran bien en clientes incluyendo Thunderbird y Gmail:


Nota que el desplegable muestra "Dirección de correo 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.
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.
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. Rápido recordatorio: el proyecto de demostración está disponible en GitHub, y he intentado hacerlo fácil de instalar y usar.
Esa es nuestra rápida visión general de cómo firmar, sellar y entregar mensajes S/MIME a través de SparkPost. Rápido recordatorio: el proyecto de demostración está disponible en GitHub, y he intentado hacerlo fácil de instalar y usar.
Esa es nuestra rápida visión general de cómo firmar, sellar y entregar mensajes S/MIME a través de SparkPost. Rápido recordatorio: el proyecto de demostración está disponible en GitHub, y he intentado hacerlo fácil de instalar y usar.
Otras noticias
Leer más de esta categoría

Correo electrónico
S/MIME Parte 3: Conectar y jugar para correo electrónico seguro en las instalaciones

Correo electrónico
S/MIME Parte 4: Recopilación de Claves Públicas de Destinatarios de la Manera Fácil – con los Webhooks de Relé Entrante de SparkPost

Correo electrónico
Validación DKIM: Una mejor práctica de autenticación de correo electrónico
