Firma digitale su Linux con smart card ATe e doppio PIN
Fino a oggi, per firmare digitalmente un documento, utilizzavo una macchina virtuale Windows all’interno di Linux Mint. Una soluzione funzionante ma poco pratica, perchè ero costretto a mantenere un intero sistema operativo da 10 GB soltanto per utilizzare un software di firma di qualche MB.
Il problema riguarda alcune smart card ATe con doppio PIN che richiedono due codici distinti:
- PIN Carta, per accedere alla smart card.
- PIN Firma, per autorizzare la firma digitale.
Linux riconosce correttamente il lettore e la smart card, ma diversi software di firma non gestiscono questa doppia autenticazione. Il risultato è che il certificato viene riconosciuto ma puntualmente la firma fallisce.
Come ho risolto
La soluzione è arrivata combinando due componenti:
- Bit4id Universal Middleware 1.4.11.836: permette a Linux di comunicare con la smart card e utilizzare le chiavi crittografiche attraverso lo standard PKCS#11.
- JSignPdf 3.2.1: è una applicazione gratuita e open source che permette di firmare digitalmente documenti PDF.
Perché due software
Perché svolgono compiti differenti. Bit4id gestisce la comunicazione con la smart card, mentre JSignPdf si occupa di produrre il PDF firmato. Il problema principale era far gestire correttamente a entrambi i componenti i due PIN distinti.
La configurazione che ha funzionato
Il primo passaggio è stato modificare la configurazione di Bit4id (libbit4xpki.so.conf) nel seguente modo:
DSPinIsCnsPin=false
DSPinUseGui=true
HideCacheDsPinCheck=false
nomadic=false
I due parametri fondamentali sono:
DSPinIsCnsPin=false: indica al middleware che PIN Carta e PIN Firma sono differenti.DSPinUseGui=true: abilita la modalità di gestione del PIN Firma tramite l’interfaccia del middleware, anziché considerarlo coincidente con il PIN Carta.
Il secondo passaggio è stato quello di collegare JSignPdf alla libreria Bit4id attraverso il file pkcs11.cfg con la seguente configurazione:
name = CardATe
library = "/percorso/alla/libreria/libbit4xpki.so"
slotListIndex = 0
In JSignPdf occorre successivamente selezionare JSIGNPKCS11, anziché il normale PKCS11. Questo provider supporta l’autenticazione aggiuntiva della chiave privata tramite CKU_CONTEXT_SPECIFIC, consentendo di utilizzare il PIN Firma separatamente dal PIN Carta.
In pratica, JSignPdf utilizza il PIN Carta per accedere alla smart card e il PIN Firma per autorizzare l’operazione crittografica.
Uno script per automatizzare tutto
Per evitare di ripetere manualmente questi passaggi, si può usare uno script bash che in ordine:
- Scarica e installa i componenti necessari.
- Configura Bit4id per gestire separatamente i due PIN.
- Collega automaticamente JSignPdf al middleware tramite
JSIGNPKCS11. - Aggiunge JSignPdf al menu applicazioni, esegue i controlli e rimuove i file temporanei.
Lo script non memorizza i PIN, che vengono richiesti durante l’utilizzo della smart card.
La soluzione è stata testata su Linux Mint 22.3 con smart card ATe IDEMIA. La compatibilità con altri dispositivi va verificata.
Download dello script: install_cardate.sh