link-it / govway

API Gateway per la Pubblica Amministrazione italiana
https://govway.org
GNU General Public License v3.0
55 stars 11 forks source link

Supporto per device pkcs11 #87

Closed tflagella closed 3 years ago

tflagella commented 3 years ago

Necessità: Verificare la compatibilità di GovWay con hardware pkcs11, come smart-cart e dispositivi HSM.

Soluzione: Java supporta in maniera trasparente keystore pkcs11 tramite il provider built-in sun.security.pkcs11.SunPKCS11 che può essere configurato per qualunque dispositivo che supporti pkcs11, tramite un parametro con un file di configurazione che punti alla libreria pkcs11 del dispositivo.

Per mettere a punto uno scenario d'uso si può utilizzare softhsm, il simulatore pkcs11 di dnssec. Di seguito le istruzione per l'uso su fedora:

1) installare softhm tramite:

yum install opensc softhsm

2) predisporre il file /etc/softhsm_java.conf come:

name = softhsm library = /usr/lib64/libsofthsm2.so

3) inizializzare softhsm come segue, fornendo i due pin di gestione e di uso:

softhsm2-util --init-token --slot 0 --label "Token-1"

4) testare il device virtuale con:

pkcs11-tool --module /usr/lib64/libsofthsm2.so -l -t

5) A questo punto il dispositivo può essere usato come un normale keystore java:

keytool -list -keystore NONE -storetype PKCS11 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg /etc/softhsm_java.conf

NOTA: Per default l'accesso al device funziona solo da superutente

andreapoli commented 3 years ago

Inizializzando il token come non-root user viene provato ad accedere il file di default /etc/softhsm2.conf che punta ai token salvati sotto la directory /var/lib/softhsm/tokens/ i cui ownership/permission sono limitati all'utente di root e ai suoi gruppi associati. Cambiare ownership/permission della directory /var/lib/softhsm/tokens non risolve il problema.

Una soluzione può essere: cd $HOME mkdir -p $HOME/lib/softhsm/tokens cd $HOME/lib/softhsm/ echo "directories.tokendir = $PWD/tokens" > softhsm2.conf export SOFTHSM2_CONF=$HOME/lib/softhsm/softhsm2.conf echo "name = softhsm" > softhsm_java.conf echo "library = /usr/lib64/libsofthsm2.so" >> softhsm_java.conf

Inizializzare poi softhsm come segue, fornendo i due pin di gestione e di uso: $ softhsm2-util --init-token --slot 0 --label "Token-1" --so-pin 1234 --pin 123456

A questo punto il dispositivo può essere usato come un normale keystore java: keytool -list -keystore NONE -storetype PKCS11 -storepass 123456 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg $HOME/lib/softhsm/softhsm_java.conf

Keystore type: PKCS11 Keystore provider: SunPKCS11-softhsm Your keystore contains 0 entries

Si deve poi creare una chiave privata attraverso la creazione di una CSR. A titolo di esempio si può usare il seguente comando per creare una coppia di chiavi selfsigned: keytool -genkey -keyalg RSA -alias esempio_selfsigned -keystore NONE -storepass 123456 -validity 3650 -keysize 2048 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg $HOME/lib/softhsm/softhsm_java.conf -storetype PKCS11

Riutilizzando il comando keytool -list precedente si può verificare la creazione della coppia di chiavi.

andreapoli commented 3 years ago

Usare opzione -Djava.security.debug=sunpkcs11 per avere i log di debug