Istruzioni per firmare digitalmente (CAdES compatibile)

in ambiente Linux e Windows con Openssl e smartcard (per esperti o sviluppatori)
Istruzioni per Openssl 1.1.0 e 1.0.1g
Attenzione, le istruzioni per la versione in OpenSSL 3 sono disponibili su blia.it/firmadigitale

Software da scaricare:
  • Sorgenti di Openssl v.1.0.1g
    Patch realizzata da noi per il supporto CAdES di Openssl
    Engine PKCS11 per Openssl (sudo apt-get install libengine-pkcs11-openssl)

    oppure, su openssl 1.1.0
    sorgenti di Openssl v.1.1.0
    patch per openssl 1.1.0

  • Engine PKCS11 per Openssl 1.1.0 (sudo apt-get install libp11-3)

  • Opensc (sudo apt-get install opensc)

  • Driver PKCS11 del produttore della smart card (quello usato in questo esempio, libbit4xpki.so, lo potete scaricare da qui: www.pec.it/download-software-driver.aspx), c'è da aggiungere che non sempre è facile trovare online il driver pkcs11, anzi, facciamo un appello ai produttori di smart card affinché rendano disponibili nei loro siti internet i driver PKCS11 (in fondo alla pagina i nomi di alcuni di questi driver o librerie o middleware, vari nomi con cui potete trovarli).

  1. Per prima cosa dobbiamo applicare la patch e compilare openssl
    - patch -Np1 -r /dev/null < cades.patch
    - ./config && make && sudo make install

  2. assicuriamoci che la versione di openssl con la patch sia stata compilata correttamente eseguendo il comando /usr/local/ssl/bin/openssl cms ? tra le varie opzioni dovremmo trovare -cades, se sì, openssl è pronto

  3. procuriamoci alcuni dati che ci serviranno successivamente:
    - pkcs11-tool --module libbit4xpki.so -O (elenca gli oggetti presenti nella smart card), dovremmo trovarci qualcosa del genere:
    Certificate Object, type = X.509 cert
    label: DS User Certificate1
    ID: 123456
    - prendiamo nota dell'ID della chiave/certificato 123456
    - scarichiamo il certificato con pkcs11-tool --module libbit4xpki.so -r --type cert --id 123456 > certificato.der
    - convertiamo il certificato dal formato binario (DER) al formato test (PEM) con openssl x509 -in certificato.der -inform der -text -out certificato.pem

  4. Creiamo un file di configurazione per openssl, ad esempio openssl.cnf in cui scriviamo
    openssl_conf = openssl_init
    [openssl_init]
    engines = engine_section
    [engine_section]
    pkcs11 = pkcs11_section
    [pkcs11_section]
    engine_id = pkcs11
    dynamic_path = /usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so
    MODULE_PATH = /usr/lib/libbit4xpki.so
    (ovviamente i percorsi dei file possono cambiare)

  5. creiamo un file con comandi bash, ad esempio firma.sh in cui mettiamo:
    OPENSSL_CONF=./openssl.cnf
    export OPENSSL_CONF
    openssl cms -nosmimecap -md sha256 -nodetach -binary -cades -stream -outform DER -sign -signer certificato.pem -inkey 123456 -keyform engine -in $1 -out $1.p7m -engine pkcs11
    (N.B. se si tratta di aggiungere una firma ad un documento precedentemente firmato, quindi nel caso di controfirma o firme multiple occorre sostituire la terza riga dello script con:
    openssl cms -nosmimecap -md sha256 -nodetach -binary -cades -stream -outform DER -resign -signer certificato.pem -inkey 123456 -keyform engine -inform der -in $1 -out $1.p7m -engine pkcs11 )

  6. siamo pronti per firmare: firma.sh miotesto.txt

Su Windows la procedura di firma è molto simile.
  1. Su sites.google.com/site/antiac/openssl.zip c'è il file zippato contenente l'eseguibile (con supporto CAdES) e le librerie .dll

  2. Creiamo il solito file openssl.cnf dove inseriremo queste righe:
    openssl_conf = openssl_def
    [openssl_def]
    engines = engine_section
    [engine_section]
    pkcs11 = pkcs11_section
    [pkcs11_section]
    engine_id = pkcs11
    dynamic_path = pkcs11
    MODULE_PATH = bit4ipki
    p.s. non mettere l'estensione .dll, openssl l'aggiunge al file, quindi per l'engine pkcs11.dll inserire solo pkcs11 e cosí pure per bit4ipki

  3. nel file firma.cmd scriviamo:
    set OPENSSL_CONF=openssl.cnf
    openssl cms -nosmimecap -md sha256 -nodetach -binary -cades -stream -outform DER -sign -signer certificato.pem -inkey 123456 -keyform engine -in %1 -out %1.p7m -engine pkcs11

Driver PKCS#11

incryptoki2.dll (Incard)
bit4ipki.dll (Incard)
bit4opki.dll (Oberthur)
bit4xpki.dll (Incard e Oberthur)
bit4cpki.dll (HID)
bit4tpki.dll (HID)
OCSCryptoki.dll (Oberthur)
Cryptoki.dll (Oberthur)
asepkcs.dll (Athena)
SI_PKCS11.dll (Siemens)
CardOS_PKCS11.dll (Siemens)
cmP11.dll (CryptoVision)
cvP11_M4.dll (CryptoVision)
IpmPki32.dll (Siemens)
IPMpkiLC.dll (Siemens)
IpmPkiLU.dll (Siemens)
eTPKCS11.dll (SafeNet)
stPKCS11.dll (SafeNet)
inp11lib.dll (Incard)
opensc-pkcs11.dll (OpenSC)
SissP11.dll (Siemens)
aetpkss1.dll (Gemalto)
bit4p11.dll (Athena)
siecap11.dll (Siemens)

libbit4opki.so (Oberthur)
libbit4ipki.so (Incard)
libbit4xpki.so (Incard e Oberthur)
opensc-pkcs11.so (OpenSC)
libASEP11.so (Athena)
libeTPkcs11.so (SafeNet)
stPKCS11.so (SafeNet)
libsiecap11.so (Siemens)

libopensc.dylib (OpenSC)
libbit4xpki.dylib (Incard e Oberthur)
libbit4ipki.dylib (Incard)
libbit4opki.dylib (Oberthur)
libASEP11.dylib (Athena)
libeTPkcs11.dylib (SafeNet)
libaetpkss.dylib (Gemalto)
libOcsCryptoki.dylib (Oberthur)

Per riconoscere che tipo di carta avete guardate la forma del chip, qui di sotto i chip della carte più diffuse in Italia:

Chip Athena

Chip Incard

Chip Oberthur


Per dubbi, commenti e proposte potete usare l'email in fondo alla pagina.

lo staff di Blia.it


Blia.it NON utilizza cookie (v. informativa)
Per contattare la redazione di Blia.it potete scrivere a: info@blia.it (attenzione, blia.it non ha nessun rapporto con banche, scuole o altri enti/aziende, i cui indirizzi sono visualizzati al solo scopo di rendere un servizio agli utenti del sito)