Loading...

Approfondimento Tech

MIME e S/MIME: email sicure a confronto

Scopri cosa sono MIME e S/MIME, le differenze, la struttura interna e le alternative per la protezione delle email nel contesto della cyber security.

Multipurpose Internet Mail Extensions

Indice dei contenuti

  • Cos’è MIME
  • Cos’è S/MIME
  • Differenze tra MIME e S/MIME
  • La struttura tecnica di MIME
  • La struttura tecnica di S/MIME
  • Limiti e problemi di compatibilità
  • Alternative a S/MIME

La sicurezza delle comunicazioni via email è diventata una priorità assoluta. Tra gli standard più utilizzati per formattare e proteggere i messaggi troviamo MIME e S/MIME, spesso confusi tra loro ma con funzionalità molto diverse.

Questo articolo approfondisce cosa sono, come funzionano, quali sono le differenze principali, le rispettive strutture interne, e presenta alcune valide alternative per la protezione dei messaggi email.

Cos’è MIME

MIME (acronimo di Multipurpose Internet Mail Extensions) è uno standard Internet definito nei RFC 2045–2049, nato per estendere il protocollo SMTP (Simple Mail Transfer Protocol), originariamente limitato al solo testo ASCII.

Perché è nato MIME?

Fino all’inizio degli anni ’90, il protocollo SMTP gestiva solo messaggi in testo semplice. Questo limitava fortemente la comunicazione moderna: nessun supporto per immagini, documenti, formattazione, né alfabeti non latini. MIME è stato ideato per superare questi limiti.

Con MIME è possibile:

  • Inviare file allegati di qualsiasi tipo (PDF, JPG, ZIP, MP3…)
  • Includere contenuti HTML nei messaggi (es. email con layout grafico)
  • Supportare caratteri Unicode per scrivere in lingue con alfabeti diversi (es. cinese, russo, arabo)

Struttura di un messaggio MIME

Un messaggio MIME è costituito da:

  • Header MIME, che definisce le informazioni tecniche sul messaggio
  • Boundary, un delimitatore testuale che separa le varie sezioni
  • Body, diviso in una o più parti (testo, allegati…)

Esempio completo:

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="ABC123"

Corpo del messaggio:

--ABC123
Content-Type: text/plain; charset="utf-8"

Questo è il corpo del messaggio in formato testo.

--ABC123
Content-Type: text/html; charset="utf-8"

<html><body><p><strong>Email in HTML</strong></p></body></html>

--ABC123
Content-Type: application/pdf
Content-Disposition: attachment; filename="documento.pdf"
Content-Transfer-Encoding: base64

JVBERi0xLjQKJcfs... (contenuto base64)
--ABC123--

In questo esempio abbiamo tre sezioni:

  1. Testo semplice
  2. HTML
  3. PDF allegato

L’intestazione Content-Type serve per dire al client cosa aspettarsi: testo, HTML, o un file binario. Il contenuto binario, come il PDF, è codificato in Base64 per renderlo compatibile con i protocolli testuali.

Esempio pratico con Python

Per creare un’email MIME in Python possiamo usare la libreria email della standard library.

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

# Creazione del messaggio
msg = MIMEMultipart()
msg['From'] = 'mittente@example.com'
msg['To'] = 'destinatario@example.com'
msg['Subject'] = 'Email con MIME'

# Parte testuale
text_part = MIMEText('Questo è il corpo del messaggio.', 'plain', 'utf-8')
msg.attach(text_part)

# Parte HTML
html_part = MIMEText('<html><body><h1>Messaggio HTML</h1></body></html>', 'html', 'utf-8')
msg.attach(html_part)

# Allegato PDF
with open('documento.pdf', 'rb') as f:
    pdf_part = MIMEApplication(f.read(), _subtype='pdf')
    pdf_part.add_header('Content-Disposition', 'attachment', filename='documento.pdf')
    msg.attach(pdf_part)

# Invio (opzionale)
# with smtplib.SMTP('smtp.example.com') as server:
#     server.send_message(msg)

Cos’è S/MIME

S/MIME (acronimo di Secure/Multipurpose Internet Mail Extensions) è un’estensione dello standard MIME, che introduce firma digitale e crittografia nei messaggi email. È stato sviluppato da RSA Data Security nel 1995 per garantire una comunicazione sicura in ambienti aziendali, sanitari, legali e pubblici.

A cosa serve S/MIME?

S/MIME si basa su due tecnologie fondamentali:

  1. Certificati digitali X.509
  2. PKI – Public Key Infrastructure

Con questi strumenti, S/MIME fornisce tre garanzie fondamentali:

  • Autenticità
    Il destinatario può verificare che il messaggio provenga effettivamente dal mittente indicato (firma digitale)
  • Integrità
    Assicura che il contenuto non sia stato alterato durante la trasmissione
  • Riservatezza
    Impedisce che soggetti terzi leggano il contenuto del messaggio (crittografia)

Come funziona S/MIME?

Quando un utente invia una mail con S/MIME:

  1. Firma il contenuto con la chiave privata del proprio certificato (firma digitale)
  2. Cifra il messaggio con la chiave pubblica del destinatario (crittografia)
  3. Invia il messaggio, che sarà visibile solo al destinatario in possesso della chiave privata corrispondente

Il risultato è un file con estensione .p7m (messaggio cifrato) o .p7s (firma separata), che incapsula il messaggio originale MIME.

Esempio di intestazione S/MIME

Content-Type: application/pkcs7-mime; smime-type=enveloped-data;
 name="smime.p7m"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7m"

Questa intestazione indica che il messaggio è cifrato e contenuto nel file smime.p7m, codificato in Base64.

All’interno del file si trova il pacchetto PKCS#7, che racchiude:

  • Il messaggio MIME originale
  • L’eventuale firma digitale
  • I dati crittografici

Esempio pratico con Python (firma + cifratura)

In questo esempio usiamo OpenSSL da riga di comando (Python wrapper disponibile, ma più complesso):

1. Genera un certificato self-signed (per test)

openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out cert.pem

2. Firma e cifra un messaggio

Salva un messaggio in mail.txt, poi:

openssl smime -encrypt -in mail.txt -out mail.p7m -outform DER cert.pem

Requisiti per usare S/MIME

  • Un certificato X.509 (gratuito o a pagamento)
  • Un client email compatibile (Outlook, Apple Mail, Thunderbird)
  • Lo scambio iniziale della chiave pubblica con i destinatari

Vantaggi e limiti di S/MIME

Vantaggi:

  • Standardizzato, interoperabile
  • Alta sicurezza (PKI, crittografia forte)
  • Protezione totale del contenuto e degli allegati

Svantaggi:

  • Complessità nella gestione dei certificati
  • Supporto limitato su webmail (Gmail non lo supporta nativamente)
  • Lentezza nell’adozione in ambito mobile

Differenze tra MIME e S/MIME

La distinzione fondamentale è che MIME si occupa del formato del contenuto, mentre S/MIME aggiunge sicurezza al messaggio.

AspettoMIMES/MIME
FunzioneFormattazioneSicurezza (firma + crittografia)
StandardRFC 2045-2049RFC 5751
ProtezioneNessunaCrittografia + firma digitale
RequisitiNessunoCertificati X.509 + PKI
Estensione dei fileNessuna.p7s (firma), .p7m (messaggio cifrato)

MIME è sempre presente nelle email moderne, mentre S/MIME è opzionale ma altamente consigliato in contesti che richiedono confidenzialità e autenticazione, come ambiti legali, sanitari o aziendali.

La struttura tecnica di MIME

Un messaggio email conforme allo standard MIME si basa su una struttura ben definita, che permette di impacchettare diversi tipi di contenuti (testo, HTML, allegati, immagini) in un solo messaggio. Questa struttura è alla base della moderna posta elettronica, ed è ciò che consente a un’email di apparire come un messaggio graficamente ricco con file annessi.

1. Header MIME

L’intestazione MIME fornisce informazioni al client su come interpretare il messaggio. Gli header più comuni includono:

  • MIME-Version: 1.0 → indica che il messaggio è conforme a MIME
  • Content-Type → specifica il tipo di contenuto (testo, HTML, allegato, multipart…)
  • Content-Disposition → definisce se il contenuto va mostrato inline o come allegato
  • Content-Transfer-Encoding → specifica la codifica (es. Base64 per contenuti binari)

2. Corpo principale (Body)

Il corpo può contenere:

  • Testo semplice
  • HTML
  • Allegati binari
  • Oppure più di uno in modalità multipart

Il tipo multipart permette di includere più parti, ciascuna con il proprio tipo MIME. Le varianti più comuni sono:

  • multipart/alternative → testo + HTML
  • multipart/mixed → corpo + allegati
  • multipart/related → HTML + immagini incorporate

3. Boundary

Il boundary è una stringa delimitatrice definita dal mittente, che separa le diverse sezioni del messaggio. Deve essere univoca, e va dichiarata nell’header Content-Type.

Esempio

Content-Type: multipart/alternative; boundary="XYZ"

4. Codifica (Encoding)

I contenuti binari, come allegati o HTML, devono essere codificati in Base64 per viaggiare correttamente nei protocolli email (che sono testuali).

Esempio completo di struttura MIME

MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="XYZ"


--XYZ
Content-Type: text/plain; charset="utf-8"

Testo semplice dell'email.

--XYZ
Content-Type: text/html; charset="utf-8"

<html><body><p>Testo <b>HTML</b> dell'email</p></body></html>

--XYZ--

Questa struttura invia lo stesso messaggio in due formati:

  • Plain text → per client più semplici o a scopo di compatibilità
  • HTML → per un layout grafico più evoluto

Esempio Python (costruzione email multipart/alternative)

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

msg = MIMEMultipart('alternative')
msg['Subject'] = 'Email con testo e HTML'
msg['From'] = 'mittente@example.com'
msg['To'] = 'destinatario@example.com'

text = "Questo è il corpo del messaggio in testo semplice."
html = "<html><body><p>Questo è il corpo del <b>messaggio HTML</b>.</p></body></html>"

msg.attach(MIMEText(text, 'plain', 'utf-8'))
msg.attach(MIMEText(html, 'html', 'utf-8'))

La struttura tecnica di S/MIME

Un messaggio S/MIME è un messaggio email basato su MIME, ma arricchito da firma digitale e crittografia, per garantire autenticità, integrità e riservatezza. Tecnicamente, la struttura S/MIME incapsula uno o più messaggi MIME all’interno di un contenitore PKCS#7 (ora definito come CMS – Cryptographic Message Syntax).

Tipologie di messaggi S/MIME

Esistono due strutture principali in S/MIME:

  1. Messaggi firmati
    Usano la chiave privata del mittente per creare una firma digitale. Il contenuto è leggibile, ma autenticato.
  2. Messaggi cifrati
    Il contenuto è cifrato con la chiave pubblica del destinatario, leggibile solo da chi ha la chiave privata corrispondente.
  3. Messaggi firmati + cifrati
    Combinano entrambe le tecniche.

Header S/MIME: esempio reale

Messaggio firmato (firma digitale):

Content-Type: multipart/signed;
 protocol="application/pkcs7-signature";
 micalg=sha-256; boundary="signed_boundar

Contiene due parti:

  • Il messaggio originale (in chiaro)
  • La firma digitale (Content-Type: application/pkcs7-signature)

Messaggio cifrato (contenuto inaccessibile):

Content-Type: application/pkcs7-mime; smime-type=enveloped-data;
 name="smime.p7m"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7m"

In questo caso, l’intero messaggio MIME originale è stato cifrato e incapsulato in un file .p7m.

Struttura interna del messaggio cifrato

  • Il messaggio MIME originale (es. multipart con testo e allegati)
  • Il file smime.p7m che contiene:
    • Il contenuto cifrato
    • Il certificato X.509 del mittente (facoltativo)
    • L’algoritmo usato (es. AES-256)
    • Eventualmente la firma digitale

Tutto è racchiuso in una struttura PKCS#7/CMS serializzata, solitamente in DER e Base64-encoded per compatibilità.

Esempio pratico: firma e cifratura con OpenSSL

1. Crea un messaggio firmato

openssl smime -sign -in messaggio.txt \
  -signer cert.pem -inkey key.pem \
  -out messaggio_signed.eml -outform PEM

2. Cifra un messaggio firmato

openssl smime -encrypt -in messaggio_signed.eml \
  -out messaggio_cifrato.p7m -outform DER \
  cert_destinatario.pem

Risultato: un messaggio .p7m completamente protetto.

Visualizzazione della struttura S/MIME con Python (solo parsing)

from email import message_from_file
import base64

with open('messaggio.eml', 'r') as f:
    msg = message_from_file(f)

print("Tipo contenuto:", msg.get_content_type())
print("Content-Disposition:", msg.get("Content-Disposition"))

if msg.get_content_type() == 'application/pkcs7-mime':
    payload = msg.get_payload()
    print("Payload base64:", payload[:60], '...')

Client compatibili con S/MIME

  • Outlook (firma e cifratura native)
  • Apple Mail (iOS/macOS)
  • Thunderbird (tramite gestione certificati)
  • Zimbra, Lotus Notes, Evolution

Gmail web non supporta nativamente S/MIME, ma lo fa tramite Google Workspace Enterprise + configurazione CA.

Limiti e problemi di compatibilità

Nonostante la robustezza, S/MIME presenta diverse criticità:

  • Richiede certificati validi, spesso a pagamento
  • Poco supportato sui client mobili e app di terze parti
  • Difficoltà di interoperabilità tra sistemi di posta elettronica
  • Alcune webmail non supportano nativamente .p7m

Inoltre, se il certificato del destinatario non è noto, non è possibile inviare messaggi cifrati.

Alternative a S/MIME

Esistono diverse alternative a S/MIME, ognuna con vantaggi e svantaggi:

PGP / OpenPGP

Pretty Good Privacy (PGP) e la sua versione open source OpenPGP sono le principali alternative. Usano anch’esse la crittografia a chiave pubblica, ma con gestione decentralizzata delle chiavi.

Vantaggi:

  • Non richiede CA
  • Compatibile con molte app e plugin (es. Thunderbird + Enigmail)

Svantaggi:

  • Richiede gestione autonoma delle chiavi
  • Meno integrato nei client email aziendali

STARTTLS e TLS

Alcuni provider usano TLS per cifrare la trasmissione dell’email, ma non il contenuto. Soluzione più semplice, ma meno sicura se i server sono compromessi.

ProtonMail e Tutanota

Servizi email cifrati end-to-end, molto usati in ambito privacy:

  • ProtonMail usa PGP trasparente all’utente
  • Tutanota ha un suo schema crittografico proprietario

Svantaggi:

  • Non compatibili con client esterni
  • Richiedono entrambi l’uso della propria piattaforma

Domande e risposte

  1. Cos’è MIME e a cosa serve?
    MIME è uno standard che consente l’invio di contenuti multimediali tramite email, come allegati, HTML e testi codificati.
  2. Cos’è S/MIME?
    S/MIME è un’estensione di MIME che aggiunge firma digitale e crittografia per aumentare la sicurezza delle email.
  3. Qual è la differenza tra MIME e S/MIME?
    MIME serve per formattare, S/MIME per proteggere. Solo S/MIME aggiunge crittografia e firma digitale.
  4. S/MIME è sicuro?
    Sì, ma la sua sicurezza dipende dalla corretta gestione dei certificati digitali e delle chiavi.
  5. Quali client email supportano S/MIME?
    Outlook, Apple Mail e alcuni client Android lo supportano nativamente; Gmail no.
  6. Serve un certificato per usare S/MIME?
    Sì, è necessario un certificato X.509, spesso rilasciato da un’autorità di certificazione.
  7. S/MIME funziona con Gmail?
    Solo in parte, e non su webmail standard. È necessaria una configurazione avanzata o l’uso di client esterni.
  8. Quali sono le alternative a S/MIME?
    Le principali sono PGP/OpenPGP, TLS/STARTTLS, e servizi come ProtonMail o Tutanota.
  9. S/MIME protegge anche gli allegati?
    Sì, se il messaggio è crittografato, anche gli allegati lo sono.
  10. Posso usare S/MIME su mobile?
    Dipende dal client. Apple Mail su iOS lo supporta, ma Android richiede app specifiche.
To top