[Risolto] Aruba key su Ubuntu server 22.04

Installazione, configurazione e uso di Ubuntu come server: web, ftp, mail, news, proxy, dns e altro.
Andspi
Prode Principiante
Messaggi: 1
Iscrizione: mercoledì 23 novembre 2022, 3:11

[Risolto] Aruba key su Ubuntu server 22.04

Messaggio da Andspi »

Ciao a tutti,
volevo gentilmente chiedere se era possibile usare la firma digitale di aruba key, tramite cmd su Ubuntu server 22.04 LTS, in modo da integrarla con il mio software gestionale, se si come posso fare?
Grazie mille a tutti per l’aiuto
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Aruba key su Ubuntu server 22.04

Messaggio da rai »

Ciao, questa possibilità interessa anche me. Hai già letto queste istruzioni?
Sono poco chiare per chi è al mio livello terra terra, forse tu te la cavi meglio se hai scritto un gestionale che funziona da CLI
Io ho provato in una ubuntu 22.04:

Codice: Seleziona tutto

rai@VirtualBox:~$ openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
rai@VirtualBox:~$
Dopo ho seguito i passi che in modalità grafica fanno funzionare la ArubaKey:
mi sono procurato i driver libbit4xpki.so e opensc-pkcs11 per la smart card installando il deb contenuto nel file MU_LINUX.zip che ho scaricato dal sito di Aruba
Inoltre ho installato i pacchetti necessari per riconoscere e usare il lettore della smartcard. Prima ho installato le dipendenze:

Codice: Seleziona tutto

sudo apt install pcscd libpcsclite1 pcsc-tools libccid
poi ho scaricato MINILECTOR30_LINUX.zip sempre dal sito di Aruba, ne ho estratto il deb contenuto e l'ho installato. Così ora questa è la situazione:

Codice: Seleziona tutto

rai@VirtualBox:~$ dpkg -l | grep -E "^ii.+libbit4xpki|pkcs11|libminilector"
ii  libbit4xpki                                   1.4.10-696                                  amd64        Bit4id.smartcards (Middleware PKCS#11)
ii  libminilector38u-ccid-bit4id                  1.0.0                                       all          PC/SC driver for the bit4id miniLector smart card readers family
ii  opensc-pkcs11:amd64                           0.22.0-1ubuntu2                             amd64        Smart card utilities with support for PKCS#15 compatible cards
rai@VirtualBox:~$
rai@VirtualBox:~$ locate pkcs11.so
/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
[...]
rai@VirtualBox:~$ locate libbit4xpki.so
/usr/lib/bit4id/libbit4xpki.so
[...]
rai@VirtualBox:~$ 
Queste sono le righe che ho aggiunto al file /usr/lib/ssl/openssl.cnf che per il resto è "nativo"

Codice: Seleziona tutto

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/opensc-pkcs11.so
MODULE_PATH = /usr/lib/bit4id/libbit4xpki.so
ma a questo punto, con qualsiasi comando openssl ottengo questo errore:

Codice: Seleziona tutto

rai@VirtualBox:~$ openssl version
FATAL: Startup failure (dev note: apps_startup()) for openssl
4067014EED7F0000:error:1280006A:DSO support routines:dlfcn_bind_func:could not bind to the requested symbol name:../crypto/dso/dso_dlfcn.c:188:symname(bind_engine): /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so: undefined symbol: bind_engine
4067014EED7F0000:error:1280006A:DSO support routines:DSO_bind_func:could not bind to the requested symbol name:../crypto/dso/dso_lib.c:176:
4067014EED7F0000:error:13000068:engine routines:dynamic_load:DSO failure:../crypto/engine/eng_dyn.c:435:
4067014EED7F0000:error:13000066:engine routines:int_engine_configure:engine configuration error:../crypto/engine/eng_cnf.c:139:section=pkcs11_section, name=dynamic_path, value=/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
4067014EED7F0000:error:0700006D:configuration file routines:module_run:module initialization error:../crypto/conf/conf_mod.c:243:module=engines, value=engine_section retcode=-1      
rai@VirtualBox:~$
intravedo un riferimento ai driver che ho linkato nel file di configurazione ma non ho idea di quale sia il problema
Se ci legge qualche esperto di openssl...
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Aruba key su Ubuntu server 22.04

Messaggio da rai »

Up. Diamo più visibilità a questa discussione.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Aruba key su Ubuntu server 22.04

Messaggio da rai »

Ok a questo punto, invio una richiesta di aiuto all'autore (che tra l'altro è italiano) del codice che integra in OpenSSL il supporto CAdES . Vediamo che cosa mi rispondono. Magari, se riesco a farcela con openssl e la firma digitale, posso offrirmi di scrivergli un How To più alla portata di utenti normali (per ora dichiarono che si tratta di istruzioni "per esperti o sviluppatori") :p
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

[Risolto] Aruba key su Ubuntu server 22.04

Messaggio da rai »

Sono riuscito a fare funzionare da linea di comando la firma digitale con i certificati sulla ArubaKey.
Antonio, il gentile e disponibile estensore della pagina www.blia.it/firmadigitale/ e sviluppatore della integrazione del supporto CAdES in openssl, mi ha chiarito che le istruzioni di quella pagina sono da aggiornare e che i link a github che contiene sono superati.

Per *ubuntu 22.04 o superiore, come richiesto nel primo post da @Andspi, le cose sono semplificate perchè non è necessario patchare né compilare niente: si scarica tutto dai repo ufficiali, tranne i driver per la smart card e per il suo lettore.
Ecco i passaggi per firmare con openssl e la ArubaKey (anche se non posso fare le prove, penso che il sistema funzioni con qualsiasi provider di firma digitale, adattando i driver)

Installare i pacchetti necessari

Codice: Seleziona tutto

sudo apt install pcscd libpcsclite1 pcsc-tools libccid # dipendenze dei driver del lettore
sudo apt install opensc # servirà per estrarre il certificato dalla smart card
sudo apt install libengine-pkcs11-openssl # è il motore openssl per crittografia con moduli pkcs11

Scaricare e installare i driver
· per la smart card # in base al formato del proprio chip
· per il lettore della smart card


Le tre operazioni seguenti (prelevare il certificato dalla smart card; creare un certificato binario; convertirlo in formato PEM) vanno ripetute ogni volta che che i certificati contenuti nella smart cart (o la stessa smart card) vengono rinnovati o sostituiti.

Prelevare dalla smart card il certificato tramite OpenSC
N.B. personalizzare il percorso dopo --module in base al driver per la propria smart card [il mio è Incard, per cui libbit4xpki.so]

Codice: Seleziona tutto

rai@VirtualBox:~$ pkcs11-tool -O --module /usr/lib/bit4id/libbit4xpki.so --login
Using slot 0 with a present token (0x0)
Logging in to "CNS".
Please enter User PIN: 
Certificate Object; type = X.509 cert
  label:      CNS0
  subject:    DN: CN=..., ...
  ID:         4...
Data object 1002
  label:          'PDATA'
  application:    'PDATA'
  app_id:         2.0.68.65.84.65
  flags:           modifiable
Public Key Object; RSA 1024 bits
  label:      CNS0
  ID:         4...
  Usage:      encrypt, verify
  Access:     none
Private Key Object; RSA 
  label:      CNS0
  ID:         4...
  Usage:      decrypt, sign
  Access:     sensitive, always sensitive, never extractable
Certificate Object; type = X.509 cert
  label:      DS User Certificate3
  subject:    DN: C=IT, ...
  ID:         123456789
Private Key Object; RSA 
  label:      DS User Private Key 3
  ID:         123456789
  Usage:      sign
  Access:     always authenticate, sensitive, always sensitive, never extractable, local
Public Key Object; RSA 2048 bits
  label:      DS User Public Key3
  ID:         123456789
  Usage:      encrypt, verify
  Access:     none
rai@VirtualBox:~$ 
dal precedente output prendere l'ID del certificato della Firma Digitale (qui: 123456789) per usarlo nel passaggio successivo



Creare un certificato in formato binario
N.B. sostituire 123456789 con l'ID del certificato appena ottenuto e personalizzare il percorso dopo --module in base al driver per la propria smart card [il mio è Incard, per cui libbit4xpki.so]

Codice: Seleziona tutto

rai@VirtualBox:~$ pkcs11-tool -r -y cert -d 123456789 --module /usr/lib/bit4id/libbit4xpki.so --login -o $HOME/certificato.der
Using slot 0 with a present token (0x0)
Logging in to "CNS".
Please enter User PIN: 
rai@VirtualBox:~$


Convertire il certificato dal formato DER al formato PEM

Codice: Seleziona tutto

rai@VirtualBox:~$ openssl x509 -inform der -in $HOME/certificato.der > $HOME/certificato.pem
rai@VirtualBox:~$


Creare un file di configurazione alternativo

Codice: Seleziona tutto

rai@VirtualBox:~$ sudo cp /etc/ssl/openssl.cnf /etc/ssl/openssl+pkcs11.cnf
rai@VirtualBox:~$


Aggiungere le seguenti righe in fondo al file /etc/ssl/openssl+pkcs11.cnf
N.B. personalizzare il percorso del driver se non è libbit4xpki.so

Codice: Seleziona tutto

# per firmare con la ArubaKey
#¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
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-3/pkcs11.so
MODULE_PATH = /usr/lib/bit4id/libbit4xpki.so

A questo punto possiamo firmare con il seguente comando

Codice: Seleziona tutto

export OPENSSL_CONF=/etc/ssl/openssl+pkcs11.cnf; openssl cms -nosmimecap -md sha256 -nodetach -binary -cades -stream -outform DER -sign -signer $HOME/certificato.pem -inkey 123456789 -keyform engine -in nostro_file_da_firmare -out file_firmato.p7m -engine pkcs11
che non è comodissimo da usare, per cui conviene metterlo in uno script.
Io ho creato il seguente in cui basta personalizzare le variabili ID e cert

Codice: Seleziona tutto

#!/bin/bash

doc="
Appone su file_da_firmare la firma digitale con modalità CAdES (formato .p7m)
Il file viene creato nella stessa cartella di quello originario, con estensione .p7m
Se nella cartella c'è un file con lo stesso nome ed estensione, non viene
sovrascritto perchè il file firmato prende un nuovo suffisso numerico.

Funziona solo con openssl 3.0.0 o superiore 
Dipende da libengine-pkcs11-openssl; inoltre
richiede un file alternativo di configurazione di openssl per caricare
l'engine pkcs#11       per esempio:  /etc/ssl/openssl+pkcs11.cnf

USO:        $(basename "$0") file_da_firmare [file_da_firmare ...]
Opzioni:    -h --help   mostra questo help
"

# file di configurazione alternativo che importa in openssl l'engine pkcs#11
OPENSSL_CONF=/etc/ssl/openssl+pkcs11.cnf
NB="
Questa configurazione non può diventare quella default di openssl perchè
l'engine pkcs#11 va bene per firmare cades ma non per altri scopi,
come generare chiavi RSA"

if [[ $# -lt 1 || $1 = '-h' || $1 = '--help' || ! -e $OPENSSL_CONF ]]; then
    echo "${doc}"
    exit
fi

# questo valore va estratto a ogni rinnovo di certificati o di smart-card
ID=445334                   # può essere ricavato con pkcs11-tool

# anche il certificato digitale può essere creato con pkcs11-tool
# e bisogna rifarlo a ogni rinnovo di certificati o di smart-card
cert=$HOME/certificato.pem  # convertito con openssl x509 da un certificato digitale

export OPENSSL_CONF
for f in "$@"; do
    if [ -f "$f" ]; then
        outfile="$f.p7m"
        num=""
        while [ -f "$outfile" ]; do  # se esiste già un file $outfile
            ((num++))
            outfile="$f.$num.p7m"    # aggiunge un suffisso numerico
        done
        openssl cms -nosmimecap -md sha256 -nodetach -binary -cades       \
                    -stream -outform DER -sign -signer $cert -inkey $ID   \
                    -keyform engine -in "$f" -out "$outfile" -engine pkcs11 &&
        echo "Creato il file '$outfile'" || echo "ERRORE con il file '$f'"
        echo
    else
        echo -e "ERRORE: $f non è un file\n"
    fi
done

Sarebbe interessante che qualcuno provasse questo metodo con altre firme digitali. Se funziona si può fare una pagina wiki, che mi pare manchi
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

[Risolto] Aruba key su Ubuntu server 22.04

Messaggio da rai »

In seguito alla discussione
[Openssl] [engine pkcs11] Impossibile generare coppia di chiavi

ho assodato che importando l'engine pkcs#11 si modifica a basso livello "il motore" di openssl in un modo che non consente alcune operazioni, per esempio la generazione di chiavi RSA.
Pertanto ho corretto il post precedente. Ho lievemente modificato la procedura e lo script finale per lasciare che openssl usi sempre il suo file predefinito di configurazione, tranne quando lo si vuole usare per firmare digitalmente: solo in questo caso openssl leggerà un file di configurazione alternativo che contiene le personalizzazioni che fanno caricare l'engine pkcs11
Scrivi risposta

Ritorna a “Ubuntu su server”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 15 ospiti