Come si firma con una smartcard

La domanda che tutti si fanno la prima volta è: se il computer firma il documento, la mia chiave privata finisce nella memoria del computer? La risposta è no, ed è l'intera ragione per cui esiste la smartcard. La chiave non esce mai dalla carta. È la carta che firma.

Il gesto fondamentale

Una smartcard di firma non è una chiavetta USB. È un piccolo calcolatore con un proprio processore crittografico, che custodisce la chiave privata in una memoria fisicamente non leggibile dall'esterno. Non c'è comando, driver o software che possa chiederle «dammi la chiave»: quel comando semplicemente non esiste nel suo firmware.

Il comando che esiste è un altro: «ecco un'impronta di 32 byte, trasformala con la chiave che custodisci e restituiscimi il risultato». La carta chiede il PIN, esegue l'operazione al suo interno, e consegna la firma. Il computer riceve un blocco di byte firmati e non ha mai visto la chiave.

il computer contratto.pdf SHA-256 → 32 byte assembla la busta CMS l'impronta + il PIN la firma dentro la smartcard processore crittografico chiave privata non leggibile dall'esterno C_Sign(impronta) la firma avviene qui dentro cosa attraversa il cavo → l'impronta del documento → il PIN ← la firma calcolata ← il certificato pubblico mai la chiave privata Nemmeno il documento attraversa il cavo: la carta vede 32 byte di impronta e non sa cosa stia firmando. È anche il motivo per cui bisogna fidarsi del software che calcola l'impronta: la carta non può controllarlo.
Il confine tratteggiato è la frontiera di sicurezza. Tutto ciò che è a destra è inaccessibile al sistema operativo, ai driver e a qualunque malware.

Corollario scomodo, e poco discusso: la carta firma quello che le dai. Se un software malevolo le passasse l'impronta di un documento diverso da quello che vedi a schermo, la carta firmerebbe senza obiezioni. La sicurezza della chiave è assoluta; quella di ciò che firmi dipende dal software.

PKCS#11: la lingua franca

Perché un programma possa dire «firma questa impronta» a una carta di un produttore qualsiasi, serve un linguaggio comune. Quel linguaggio è PKCS#11, uno standard che definisce un insieme di funzioni — fra cui la C_Sign del diagramma — che ogni carta deve esporre.

Chi traduce dallo standard al dialetto della singola carta è il middleware: una libreria che il produttore distribuisce e che va installata sul computer. Probatio non parla con la carta direttamente: cerca il middleware già presente sul sistema e lo interroga.

I moduli riconosciuti automaticamente comprendono Bit4id (le carte di Aruba, InfoCert e molti ordini professionali), OpenSC, A.E.T. SafeSign, Gemalto/Thales IDPrime, SafeNet eToken, IDEMIA/Oberthur AWP, Athena/ASE e il middleware della CIE, la carta d'identità elettronica.

Se la tua carta usa un middleware che non è nell'elenco, il modulo si indica a mano: è un file .dylib su macOS, .dll su Windows.

La firma remota, quando la carta non c'è

Esiste un'alternativa in cui la chiave privata vive in un dispositivo sicuro presso il prestatore di servizi, non nella tua tasca. Firmi autenticandoti da remoto, tipicamente con una password e un codice OTP.

Il protocollo si chiama CSC (Cloud Signature Consortium) e Probatio lo supporta. Il meccanismo è identico: viaggia l'impronta, torna la firma. Cambia solo dove abita la chiave — e cambia il modello di fiducia, perché a custodirla è un terzo.

Cosa puoi produrre

CAdES-BES busta .p7m attached firma qualsiasi file con signingCertificateV2 PAdES-BES PDF, resta un PDF incremental update firma visibile o invisibile XAdES XML firmato nodo ds:Signature con canonicalizzazione JAdES token JWS solo RS256/384/512 niente ECDSA né Ed25519 + marca temporale RFC 3161 (opzionale) la firma passa da livello -BES a livello -T Senza marca, la firma vale finché il certificato è valido. Con la marca, sopravvive alla sua scadenza.
Il livello -BES è la firma nuda. Aggiungere una marca la porta a -T, e le dà una data opponibile: è la differenza fra un documento che invecchia bene e uno che invecchia male.

Una nota sui nomi dei livelli

Probatio etichetta le firme che produce e verifica come -BES e -T. È la nomenclatura delle specifiche ETSI storiche (TS 101 733 per CAdES). Gli standard attualmente in vigore — ETSI EN 319 122-1 per CAdES ed EN 319 142-1 per PAdES — chiamano gli stessi livelli B-B (firma base) e B-T (firma con marca temporale), e ne aggiungono altri due per la conservazione a lungo termine, B-LT e B-LTA.

Chi legge una relazione tecnica riconosce entrambe le diciture. Se devi citarle, la coppia corretta è: «livello -T secondo TS 101 733, corrispondente al livello baseline B-T di EN 319 122-1».

PAdES e l'incremental update

Firmare un PDF non significa riscriverlo. Probatio appende una nuova sezione in coda al file, lasciando intatti i byte precedenti — è la tecnica dell'incremental update prevista dallo standard PDF. Le firme già presenti continuano a verificare, perché gli intervalli che coprono non sono stati toccati.

È così che due persone firmano lo stesso contratto in sequenza, e ciascuna delle due firme resta verificabile.

La procedura, passo per passo

  1. Inserisci la carta e verifica che il middleware sia installato. Probatio elenca i certificati che trova sulla carta.
  2. Scegli il certificato giusto. Una carta ne contiene spesso due: uno di autenticazione e uno di firma. Solo il secondo porta il flag nonRepudiation, ed è l'unico che produce una firma opponibile.
  3. Scegli il formato in base a chi riceve. CAdES e PAdES sono entrambi formati pienamente riconosciuti. Se il destinatario o la normativa applicabile impongono la busta .p7m — accade nel processo civile telematico, in molte procedure della pubblica amministrazione e nelle fatture elettroniche — si firma in CAdES, anche un PDF. Se non c'è un vincolo, su un PDF il PAdES è più comodo, perché il file resta apribile con qualunque lettore.
  4. Decidi se marcare. Se il documento deve sopravvivere alla scadenza del certificato — e quasi sempre deve — aggiungi la marca temporale.
  5. Digita il PIN. Da qui in avanti lavora la carta.
  6. Verifica il risultato. Riapri il file firmato e verificalo, come farebbe la controparte. Una firma che il tuo stesso software non conferma non va consegnata.

Errori che si vedono spesso

  • Firmare col certificato di autenticazione. Tecnicamente riesce; giuridicamente non è una firma. Controlla il nonRepudiation.
  • Dimenticare la marca temporale. Fra tre anni quel certificato sarà scaduto, e senza marca la verifica ricadrà sulla data odierna, con esito negativo.
  • Scegliere il formato senza chiedersi chi riceve. Non esiste un formato «giusto» in assoluto: un .p7m inviato a chi si aspetta un PAdES crea attrito, ma un PAdES inviato a un sistema che pretende la busta .p7m viene rifiutato. La domanda giusta è sempre: cosa richiede il destinatario?
  • Bloccare il PIN. Tre tentativi errati e la carta si blocca; serve il PUK. Non è un problema di Probatio, ma capita a tutti almeno una volta.

La firma digitale è, dal punto di vista dell'utente, un gesto di pochi secondi. Vale la pena sapere che in quei secondi la parte più delicata dell'operazione avviene in un chip che non ti obbedisce: si limita a firmare ciò che gli passi, e a non consegnare mai la chiave. Il resto della fiducia sta nel software.