

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Integrazione di Java Keytool e Jarsigner con AWS CloudHSM
<a name="third_java-sdk_integration"></a>

AWS CloudHSM offre l'integrazione con le utilità Java Keytool e Jarsigner tramite Client SDK 3 e Client SDK 5. I passaggi per utilizzare questi strumenti variano a seconda della versione del client SDK in cui è attualmente stato scaricato. Le seguenti sezioni forniscono informazioni su ciascun SDK. 

**Topics**
+ [Client SDK 5 con Java Keytool e Jarsigner](keystore-third-party-tools_5.md)
+ [Client SDK 3 con Java Keytool e Jarsigner](keystore-third-party-tools.md)

# Usa Client SDK 5 per l'integrazione AWS CloudHSM con Java Keytool e Jarsigner
<a name="keystore-third-party-tools_5"></a>

AWS CloudHSM key store è un archivio di chiavi JCE per scopi speciali che utilizza certificati associati alle chiavi del modulo di sicurezza hardware (HSM) tramite strumenti di terze parti come e. `keytool` `jarsigner` AWS CloudHSM non archivia i certificati sull'HSM, poiché i certificati sono dati pubblici e non riservati. L'archivio delle AWS CloudHSM chiavi memorizza i certificati in un file locale e li associa alle chiavi corrispondenti sull'HSM. 

Quando si utilizza l'archivio AWS CloudHSM chiavi per generare nuove chiavi, non viene generata alcuna voce nel file dell'archivio chiavi locale: le chiavi vengono create sull'HSM. Allo stesso modo, quando si utilizza l'archivio chiavi AWS CloudHSM per cercare le chiavi, la ricerca viene passata all'HSM. Quando si archiviano i certificati nell'archivio delle AWS CloudHSM chiavi, il provider verifica che esista una coppia di chiavi con l'alias corrispondente sull'HSM, quindi associa il certificato fornito alla coppia di chiavi corrispondente. 

**Topics**
+ [Prerequisiti](keystore-prerequisites_5.md)
+ [Usa l'archivio delle chiavi con keytool](using_keystore_with_keytool_5.md)
+ [Usa l'archivio delle chiavi con Jarsigner](using_keystore_jarsigner_5.md)
+ [Problemi noti](known-issues-keytool-jarsigner_5.md)

# Prerequisiti per l'integrazione AWS CloudHSM con Java Keytool e Jarsigner utilizzando Client SDK 5
<a name="keystore-prerequisites_5"></a>

Per utilizzare l'archivio AWS CloudHSM chiavi, è necessario prima inizializzare e configurare l'SDK JCE. AWS CloudHSM Utilizza le fasi seguenti per farlo. 

## Fase 1: Installare JCE
<a name="prereq-step-one_5"></a>

[Per installare JCE, inclusi i prerequisiti del AWS CloudHSM client, seguite i passaggi per l'installazione della libreria Java.](java-library-install_5.md) 

## Passaggio 2: aggiungere le credenziali di accesso HSM alle variabili di ambiente
<a name="prereq-step-two_5"></a>

Imposta le variabili di ambiente per contenere le credenziali di accesso all'HSM. 

------
#### [ Linux ]

```
$ export HSM_USER=<HSM user name>
```

```
$ export HSM_PASSWORD=<HSM password>
```

------
#### [ Windows ]

```
PS C:\> $Env:HSM_USER=<HSM user name>
```

```
PS C:\> $Env:HSM_PASSWORD=<HSM password>
```

------

**Nota**  
 AWS CloudHSM JCE offre diverse opzioni di accesso. Per utilizzare l'archivio AWS CloudHSM chiavi con applicazioni di terze parti, è necessario utilizzare l'accesso implicito con variabili di ambiente. Se desideri utilizzare l'accesso esplicito tramite il codice dell'applicazione, devi creare la tua applicazione utilizzando l'archivio delle AWS CloudHSM chiavi. Per ulteriori informazioni, consulta l'articolo sull'[utilizzo di AWS CloudHSM Key Store](alternative-keystore_5.md). 

## Passaggio 3: Registrazione del provider JCE
<a name="prereq-step-three_5"></a>

Per registrare il provider JCE nella CloudProvider configurazione Java, procedi nel seguente modo: 

1. Apri il file di configurazione `java.security` nell'installazione Java, per la modifica.

1. Nel file di configurazione `java.security`, aggiungi `com.amazonaws.cloudhsm.jce.provider.CloudHsmProvider` come ultimo provider. Ad esempio, se sono presenti nove provider nel file `java.security`, aggiungi il seguente provider come ultimo provider nella sezione.

   `security.provider.10=com.amazonaws.cloudhsm.jce.provider.CloudHsmProvider`

**Nota**  
L'aggiunta del AWS CloudHSM provider come priorità più elevata può influire negativamente sulle prestazioni del sistema, in quanto al AWS CloudHSM provider verrà assegnata la priorità per le operazioni che possono essere trasferite in sicurezza sul software. Come procedura ottimale, specifica **sempre** il provider che desideri utilizzare per un'operazione, indipendentemente dal fatto che si tratti del provider AWS CloudHSM o di un provider basato su software.

**Nota**  
La specificazione `-providerName` e le opzioni della riga di `-providerpath` comando durante la generazione di chiavi utilizzando il key **keytool** store AWS CloudHSM possono causare errori. `-providerclass`

# Usa l'archivio di AWS CloudHSM chiavi con keytool utilizzando Client SDK 5
<a name="using_keystore_with_keytool_5"></a>

 [Keytool](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html) è una utility a riga di comando molto usata per le attività comuni di chiavi e certificati sui sistemi Linux. Nella documentazione AWS CloudHSM non è incluso un tutorial completo su keytool. Questo articolo spiega i parametri specifici da utilizzare con varie funzioni di keytool quando si utilizzano AWS CloudHSM come root of trust tramite il AWS CloudHSM key store.

Quando usi keytool con il AWS CloudHSM key store, specifica i seguenti argomenti per qualsiasi comando keytool:

------
#### [ Linux ]

```
-storetype CLOUDHSM -J-classpath< '-J/opt/cloudhsm/java/*'>
```

------
#### [ Windows ]

```
-storetype CLOUDHSM -J-classpath<'-J"C:\Program Files\Amazon\CloudHSM\java\*"'>
```

------

Se desideri creare un nuovo file di archivio chiavi utilizzando l'archivio AWS CloudHSM chiavi, consulta. [Usa for Client SDK 3 AWS CloudHSM KeyStore AWS CloudHSM](alternative-keystore.md#using_cloudhsm_keystore) Per utilizzare un archivio di chiavi esistente, specificane il nome (incluso il percorso) utilizzando l'argomento -keystore per keytool. Se specificate un file di archivio chiavi inesistente in un comando keytool, l'archivio AWS CloudHSM chiavi crea un nuovo file di archivio chiavi.

# Crea nuove AWS CloudHSM chiavi con keytool
<a name="create_key_keytool_5"></a>

È possibile utilizzare keytool per generare RSA, AES e il DESede tipo di chiave supportato dall'SDK JCE. AWS CloudHSM 

**Importante**  
Una chiave generata tramite keytool viene generata nel software e quindi importata AWS CloudHSM come chiave estraibile e persistente.

Ti consigliamo vivamente di generare chiavi non esportabili al di fuori del keytool e quindi di importare i certificati corrispondenti nell'archivio chiavi. Se si utilizzano chiavi RSA o EC estraibili tramite keytool e Jarsigner, i provider esportano le chiavi da e quindi utilizzano la chiave localmente per le AWS CloudHSM operazioni di firma.

Se hai più istanze client connesse al tuo AWS CloudHSM cluster, tieni presente che l'importazione di un certificato nell'archivio delle chiavi di un'istanza client non renderà automaticamente disponibili i certificati su altre istanze client. Per registrare la chiave e i certificati associati su ogni istanza del client è necessario eseguire un'applicazione Java come descritto in [Genera una AWS CloudHSM CSR usando keytool](generate_csr_using_keytool_5.md). In alternativa, è possibile apportare le modifiche necessarie su un client e copiare il file dell'archivio delle chiavi risultante in ogni altra istanza del client.

**Esempio 1:** generare una chiave AES-256 simmetrica e salvarla in un file di archivio chiavi denominato «example\$1keystore.store», nella directory di lavoro. Sostituisci con un'etichetta univoca. *<secret label>*

------
#### [ Linux ]

```
$ keytool -genseckey -alias <secret label> -keyalg aes \
	-keysize 256 -keystore example_keystore.store \
	-storetype CloudHSM -J-classpath '-J/opt/cloudhsm/java/*' \
```

------
#### [ Windows ]

```
PS C:\> keytool -genseckey -alias <secret label> -keyalg aes `
	-keysize 256 -keystore example_keystore.store `
	-storetype CloudHSM -J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

**Esempio 2:** generare una coppia di chiavi RSA 2048 e salvarla in un file di archivio chiavi denominato «example\$1keystore.store» nella directory di lavoro. Sostituisci con un'etichetta univoca. *<RSA key pair label>*

------
#### [ Linux ]

```
$ keytool -genkeypair -alias <RSA key pair label> \
	-keyalg rsa -keysize 2048 \
	-sigalg sha512withrsa \
	-keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -genkeypair -alias <RSA key pair label> `
	-keyalg rsa -keysize 2048 `
	-sigalg sha512withrsa `
	-keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

È possibile trovare un elenco di [algoritmi di firma supportati](java-lib-supported_5.md#java-sign-verify_5) nella libreria Java.

# Elimina una AWS CloudHSM chiave usando keytool
<a name="delete_key_using_keytool_5"></a>

L'archivio AWS CloudHSM chiavi non supporta l'eliminazione delle chiavi. È possibile eliminare le chiavi utilizzando il metodo destrot dell'[interfaccia Distruggibile](https://devdocs.io/openjdk%7E8/javax/security/auth/destroyable#destroy--).

```
((Destroyable) key).destroy();
```

# Genera una AWS CloudHSM CSR usando keytool
<a name="generate_csr_using_keytool_5"></a>

Ottieni la massima flessibilità nella generazione di una richiesta di firma del certificato (CSR) se utilizzi [AWS CloudHSM Motore dinamico OpenSSL per Client SDK 5](openssl-library.md). Il comando seguente utilizza keytool per generare un CSR per una coppia di chiavi con l'alias, `example-key-pair`.

------
#### [ Linux ]

```
$ keytool -certreq -alias <key pair label> \
	-file my_csr.csr \
	-keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -certreq -alias <key pair label> `
	-file my_csr.csr `
	-keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

**Nota**  
Per utilizzare una coppia di chiavi da keytool, tale coppia di chiavi deve avere una voce nel file dell'archivio chiavi specificato. Se si desidera utilizzare una coppia di chiavi generata al di fuori di keytool, è necessario importare i metadati della chiave e del certificato nell'archivio chiavi. Per istruzioni sull'importazione dei dati dell'archivio chiavi, vedi [Usa keytool per importare certificati intermedi e root nel key store AWS CloudHSM](import_cert_using_keytool_5.md).

# Usa keytool per importare certificati intermedi e root nel key store AWS CloudHSM
<a name="import_cert_using_keytool_5"></a>

Per importare un certificato CA in AWS CloudHSM, è necessario abilitare la verifica di una catena completa di certificati su un certificato appena importato. Il comando seguente mostra un esempio. 

------
#### [ Linux ]

```
$ keytool -import -trustcacerts -alias rootCAcert \
	-file rootCAcert.cert -keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -import -trustcacerts -alias rootCAcert `
	-file rootCAcert.cert -keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

Se connetti più istanze client al AWS CloudHSM cluster, l'importazione di un certificato nell'archivio delle chiavi di un'istanza client non renderà automaticamente il certificato disponibile su altre istanze client. È necessario importare il certificato in ogni istanza del client.

# Usa keytool per eliminare i certificati dall'archivio delle chiavi AWS CloudHSM
<a name="delete_cert_using_keytool_5"></a>

Il comando seguente mostra un esempio di come eliminare un AWS CloudHSM certificato da un archivio di chiavi Java keytool. 

------
#### [ Linux ]

```
$ keytool -delete -alias mydomain \
	-keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -delete -alias mydomain `
	-keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

Se si connettono più istanze client al AWS CloudHSM cluster, l'eliminazione di un certificato nell'archivio chiavi di un'istanza client non rimuoverà automaticamente il certificato dalle altre istanze client. È necessario eliminare il certificato su ogni istanza del client.

# Importa un certificato funzionante nell'archivio delle AWS CloudHSM chiavi utilizzando keytool
<a name="import_working_cert_using_keytool_5"></a>

Una volta firmata una richiesta di firma del certificato (CSR), è possibile importarla nell'archivio chiavi AWS CloudHSM e associarla alla coppia di chiavi appropriata. Il seguente comando fornisce un esempio. 

------
#### [ Linux ]

```
$ keytool -importcert -noprompt -alias <key pair label> \
	-file my_certificate.crt \
	-keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -importcert -noprompt -alias <key pair label> `
	-file my_certificate.crt `
	-keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

L'alias deve essere una coppia di chiavi con un certificato associato nell'archivio chiavi. Se la chiave viene generata al di fuori di keytool o viene generata in un'istanza del client diversa, è necessario prima importare i metadati della chiave e del certificato nell'archivio chiavi. 

La catena di certificati deve essere verificabile. Se non è possibile verificare il certificato, potrebbe essere necessario importare il certificato di firma (autorità di certificazione) nell'archivio chiavi in modo che la catena possa essere verificata.

# Esporta un certificato AWS CloudHSM utilizzando keytool
<a name="export_cert_using_keytool_5"></a>

Nell'esempio seguente viene generato un certificato in formato binario X.509. Per esportare un certificato leggibile dall'uomo AWS CloudHSM, aggiungilo `-rfc` al `-exportcert` comando. 

------
#### [ Linux ]

```
$ keytool -exportcert -alias <key pair label> \
	-file my_exported_certificate.crt \
	-keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -exportcert -alias <key pair label> `
	-file my_exported_certificate.crt `
	-keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

# Usa l'archivio di AWS CloudHSM chiavi con Jarsigner utilizzando Client SDK 5
<a name="using_keystore_jarsigner_5"></a>

Jarsigner è una popolare utilità a riga di comando per firmare file JAR utilizzando una chiave archiviata in modo sicuro su un modulo di sicurezza hardware (HSM). Un tutorial completo su Jarsigner non rientra nell'ambito della documentazione. AWS CloudHSM Questa sezione spiega i parametri Jarsigner da utilizzare per firmare e verificare le firme AWS CloudHSM come radice di fiducia tramite il key store. AWS CloudHSM 

# Configura AWS CloudHSM chiavi e certificati con Jarsigner
<a name="jarsigner_set_up_certificates_5"></a>

Prima di poter firmare i file AWS CloudHSM JAR con Jarsigner, assicurati di aver configurato o completato i seguenti passaggi: 

1. Segui le indicazioni contenute nei [prerequisiti dell'archivio chiavi AWS CloudHSM](keystore-prerequisites_5.md).

1. Configura le chiavi di firma e i certificati e la catena di certificati associati, che devono essere archiviati nell'archivio AWS CloudHSM chiavi dell'istanza corrente del server o del client. Crea le chiavi su AWS CloudHSM e poi importa i metadati associati nel tuo AWS CloudHSM key store. Se desideri utilizzare keytool per impostare le chiavi e i certificati, vedi [Crea nuove AWS CloudHSM chiavi con keytool](create_key_keytool_5.md). Se utilizzi più istanze client per firmare il tuo JARs, crea la chiave e importa la catena di certificati. Quindi copia il file dell'archivio delle chiavi risultante in ogni istanza del client. Se generi frequentemente nuove chiavi, è possibile che sia più semplice importare singolarmente i certificati in ogni istanza client.

1. L'intera catena di certificati dovrebbe essere verificabile. Affinché la catena di certificati sia verificabile, potrebbe essere necessario aggiungere il certificato CA e i certificati intermedi all'archivio delle chiavi. AWS CloudHSM Vedere lo snippet di codice in [Firma un file JAR utilizzando and Jarsigner AWS CloudHSM](jarsigner_sign_jar_using_hsm_jarsigner_5.md) per istruzione su come utilizzare il codice Java per verificare la catena di certificati. Se preferisci, puoi utilizzare keytool per importare i certificati. Per istruzioni su come usare keytool, vedi [Usa keytool per importare certificati intermedi e root nel key store AWS CloudHSM](import_cert_using_keytool_5.md). 

# Firma un file JAR utilizzando and Jarsigner AWS CloudHSM
<a name="jarsigner_sign_jar_using_hsm_jarsigner_5"></a>

Usa il seguente comando per firmare un file JAR usando AWS CloudHSM e Jarsigner: 

------
#### [ Linux; ]

Per OpenJDK 8

```
jarsigner -keystore example_keystore.store \
	-signedjar signthisclass_signed.jar \
	-sigalg sha512withrsa \
	-storetype CloudHSM \
	-J-classpath '-J/opt/cloudhsm/java/*:/usr/lib/jvm/java-1.8.0/lib/tools.jar' \
	-J-Djava.library.path=/opt/cloudhsm/lib \
	signthisclass.jar <key pair label>
```

Per OpenJDK 11, OpenJDK 17 e OpenJDK 21

```
jarsigner -keystore example_keystore.store \
	-signedjar signthisclass_signed.jar \
	-sigalg sha512withrsa \
	-storetype CloudHSM \
	-J-classpath '-J/opt/cloudhsm/java/*' \
	-J-Djava.library.path=/opt/cloudhsm/lib \
	signthisclass.jar <key pair label>
```

------
#### [ Windows ]

Per Open JDK8

```
jarsigner -keystore example_keystore.store `
	-signedjar signthisclass_signed.jar `
	-sigalg sha512withrsa `
	-storetype CloudHSM `
	-J-classpath '-JC:\Program Files\Amazon\CloudHSM\java\*;C:\Program Files\Java\jdk1.8.0_331\lib\tools.jar' `
	 "-J-Djava.library.path='C:\Program Files\Amazon\CloudHSM\lib\'" `
	signthisclass.jar <key pair label>
```

Per OpenJDK 11, OpenJDK 17 e OpenJDK 21

```
jarsigner -keystore example_keystore.store `
	-signedjar signthisclass_signed.jar `
	-sigalg sha512withrsa `
	-storetype CloudHSM `
	-J-classpath '-JC:\Program Files\Amazon\CloudHSM\java\*'`
	 "-J-Djava.library.path='C:\Program Files\Amazon\CloudHSM\lib\'" `
	signthisclass.jar <key pair label>
```

------

Utilizza il seguente comando per verificare un file JAR firmato: 

------
#### [ Linux ]

Per Open JDK8

```
jarsigner -verify \
	-keystore example_keystore.store \
	-sigalg sha512withrsa \
	-storetype CloudHSM \
	-J-classpath '-J/opt/cloudhsm/java/*:/usr/lib/jvm/java-1.8.0/lib/tools.jar' \
	-J-Djava.library.path=/opt/cloudhsm/lib \
	signthisclass_signed.jar <key pair label>
```

Per OpenJDK 11, OpenJDK 17 e OpenJDK 21

```
jarsigner -verify \
	-keystore example_keystore.store \
	-sigalg sha512withrsa \
	-storetype CloudHSM \
	-J-classpath '-J/opt/cloudhsm/java/*' \
	-J-Djava.library.path=/opt/cloudhsm/lib \
	signthisclass_signed.jar <key pair label>
```

------
#### [ Windows ]

Per OpenJDK 8

```
jarsigner -verify `
	-keystore example_keystore.store `
	-sigalg sha512withrsa `
	-storetype CloudHSM `
	-J-classpath '-JC:\Program Files\Amazon\CloudHSM\java\*;C:\Program Files\Java\jdk1.8.0_331\lib\tools.jar' `
	"-J-Djava.library.path='C:\Program Files\Amazon\CloudHSM\lib\'" `
	signthisclass_signed.jar <key pair label>
```

Per OpenJDK 11, OpenJDK 17 e OpenJDK 21

```
jarsigner -verify `
	-keystore example_keystore.store `
	-sigalg sha512withrsa `
	-storetype CloudHSM `
	-J-classpath '-JC:\Program Files\Amazon\CloudHSM\java\*`
	"-J-Djava.library.path='C:\Program Files\Amazon\CloudHSM\lib\'" `
	signthisclass_signed.jar <key pair label>
```

------

# Problemi noti per l'integrazione di Java Keytool e Jarsigner utilizzando Client AWS CloudHSM SDK 5
<a name="known-issues-keytool-jarsigner_5"></a>

L'elenco seguente fornisce l'elenco corrente dei problemi noti relativi alle integrazioni con AWS CloudHSM e Java Keytool e Jarsigner utilizzando Client SDK 5. 

1. Non supportiamo le chiavi EC con Keytool e Jarsigner.

# Usa Client SDK 3 per l'integrazione AWS CloudHSM con Java Keytool e Jarsigner
<a name="keystore-third-party-tools"></a>

AWS CloudHSM key store è un archivio di chiavi JCE per scopi speciali che utilizza certificati associati alle chiavi del modulo di sicurezza hardware (HSM) tramite strumenti di terze parti come e. `keytool` `jarsigner` AWS CloudHSM non archivia i certificati sull'HSM, poiché i certificati sono dati pubblici e non riservati. L'archivio delle AWS CloudHSM chiavi archivia i certificati in un file locale e li associa alle chiavi corrispondenti sull'HSM. 

Quando si utilizza l'archivio AWS CloudHSM chiavi per generare nuove chiavi, non viene generata alcuna voce nel file dell'archivio chiavi locale: le chiavi vengono create sull'HSM. Allo stesso modo, quando si utilizza l'archivio chiavi AWS CloudHSM per cercare le chiavi, la ricerca viene passata all'HSM. Quando si archiviano i certificati nell'archivio delle AWS CloudHSM chiavi, il provider verifica che esista una coppia di chiavi con l'alias corrispondente sull'HSM, quindi associa il certificato fornito alla coppia di chiavi corrispondente. 

**Topics**
+ [Prerequisiti](keystore-prerequisites.md)
+ [Usa l'archivio delle chiavi con keytool](using_keystore_with_keytool.md)
+ [Usa key store con jarsigner](using_keystore_jarsigner.md)
+ [Problemi noti](known-issues-keytool-jarsigner.md)
+ [Registra chiavi preesistenti con key store](register-pre-existing-keys-with-keystore.md)

# Prerequisiti per l'integrazione AWS CloudHSM con Java Keytool e Jarsigner utilizzando Client SDK 3
<a name="keystore-prerequisites"></a>

Per utilizzare l'archivio AWS CloudHSM chiavi, è necessario prima inizializzare e configurare l'SDK JCE. AWS CloudHSM Utilizza le fasi seguenti per farlo. 

## Fase 1: Installare JCE
<a name="prereq-step-one"></a>

[Per installare JCE, inclusi i prerequisiti del AWS CloudHSM client, seguite i passaggi per l'installazione della libreria Java.](java-library-install.md) 

## Passaggio 2: aggiungere le credenziali di accesso HSM alle variabili di ambiente
<a name="prereq-step-two"></a>

Imposta le variabili di ambiente per contenere le credenziali di accesso all'HSM. 

```
export HSM_PARTITION=PARTITION_1
export HSM_USER=<HSM user name> 
export HSM_PASSWORD=<HSM password>
```

**Nota**  
Il CloudHSM JCE offre varie opzioni di accesso. Per utilizzare l'archivio AWS CloudHSM chiavi con applicazioni di terze parti, è necessario utilizzare l'accesso implicito con variabili di ambiente. Se desideri utilizzare l'accesso esplicito tramite il codice dell'applicazione, devi creare la tua applicazione utilizzando l'archivio delle AWS CloudHSM chiavi. Per ulteriori informazioni, consulta l'articolo sull'[utilizzo di AWS CloudHSM Key Store](alternative-keystore.md). 

## Fase 3: Registrare il provider JCE
<a name="prereq-step-three"></a>

Per registrare il provider JCE, nella configurazione Java CloudProvider . 

1. Aprire il file di configurazione java.security nell'installazione Java, per la modifica.

1. Nel file di configurazione java.security, aggiungere `com.cavium.provider.CaviumProvider` come ultimo provider. Ad esempio, se sono presenti nove provider nel file java.security, aggiungere il seguente provider come ultimo provider nella sezione. L'aggiunta del provider Cavium come priorità più elevata può influire negativamente sulle prestazioni del sistema.

   `security.provider.10=com.cavium.provider.CaviumProvider`
**Nota**  
Gli utenti esperti possono essere abituati a specificare `-providerName`, `-providerclass` e `-providerpath` come opzioni della riga di comando quando usano il keytool, invece di aggiornare il file di configurazione di sicurezza. Se si tenta di specificare le opzioni della riga di comando durante la generazione di chiavi con AWS CloudHSM key store, si verificheranno degli errori. 

# Usa l'archivio AWS CloudHSM delle chiavi con keytool utilizzando Client SDK 3
<a name="using_keystore_with_keytool"></a>

[Keytool](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html) è una utility a riga di comando molto usata per le attività comuni di chiavi e certificati sui sistemi Linux. Nella documentazione AWS CloudHSM non è incluso un tutorial completo su keytool. Questo articolo spiega i parametri specifici da utilizzare con varie funzioni di keytool quando si utilizzano AWS CloudHSM come root of trust tramite il AWS CloudHSM key store.

Quando usi keytool con il AWS CloudHSM key store, specifica i seguenti argomenti per qualsiasi comando keytool:

```
-storetype CLOUDHSM \
		-J-classpath '-J/opt/cloudhsm/java/*' \
		-J-Djava.library.path=/opt/cloudhsm/lib
```

Se desideri creare un nuovo file di archivio chiavi utilizzando l'archivio AWS CloudHSM chiavi, consulta. [Usa for Client SDK 3 AWS CloudHSM KeyStore AWS CloudHSM](alternative-keystore.md#using_cloudhsm_keystore) Per utilizzare un archivio di chiavi esistente, specificane il nome (incluso il percorso) utilizzando l'argomento -keystore per keytool. Se specificate un file di archivio chiavi inesistente in un comando keytool, l'archivio AWS CloudHSM chiavi crea un nuovo file di archivio chiavi.

# Crea nuove AWS CloudHSM chiavi con keytool
<a name="create_key_keytool"></a>

Puoi usare keytool per generare qualsiasi tipo di chiave supportata da AWS CloudHSM JCE SDK. Vedere un elenco completo di chiavi e lunghezze nell'articolo [ Chiavi supportate](java-lib-supported.md#java-keys) nella libreria Java.

**Importante**  
Una chiave generata tramite keytool viene generata nel software e quindi importata AWS CloudHSM come chiave persistente estraibile.

[Le istruzioni per creare chiavi non estraibili direttamente sul modulo di sicurezza hardware (HSM) e quindi utilizzarle con keytool o Jarsigner sono mostrate nell'esempio di codice in Registrazione di chiavi preesistenti con Key Store. AWS CloudHSM](register-pre-existing-keys-with-keystore.md) Ti consigliamo vivamente di generare chiavi non esportabili al di fuori del keytool e quindi di importare i certificati corrispondenti nell'archivio chiavi. Se si utilizzano chiavi RSA o EC estraibili tramite keytool e jarsigner, i provider esportano le chiavi da e quindi utilizzano la chiave localmente per le operazioni di firma. AWS CloudHSM 

Se si dispone di più istanze client connesse al cluster CloudHSM, tenere presente che l'importazione di un certificato nell'archivio chiavi di un'istanza del client non renderà automaticamente disponibili i certificati in altre istanze del client. Per registrare la chiave e i certificati associati su ogni istanza del client è necessario eseguire un'applicazione Java come descritto in [Generare una CSR utilizzando Keytool](generate_csr_using_keytool.md). In alternativa, è possibile apportare le modifiche necessarie su un client e copiare il file dell'archivio delle chiavi risultante in ogni altra istanza del client.

**Esempio 1:** generare una chiave AES-256 simmetrica e salvarla in un file di archivio chiavi denominato «example\$1keystore.store», nella directory di lavoro. Sostituisci con un'etichetta univoca. *<secret label>*

```
keytool -genseckey -alias <secret label> -keyalg aes \
		-keysize 256 -keystore example_keystore.store \
		-storetype CloudHSM -J-classpath '-J/opt/cloudhsm/java/*' \
		-J-Djava.library.path=/opt/cloudhsm/lib/
```

**Esempio 2:** generare una coppia di chiavi RSA 2048 e salvarla in un file di archivio chiavi denominato «example\$1keystore.store» nella directory di lavoro. Sostituisci con un'etichetta univoca. *<RSA key pair label>*

```
keytool -genkeypair -alias <RSA key pair label> \
        -keyalg rsa -keysize 2048 \
        -sigalg sha512withrsa \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

**Esempio 3:** generare una chiave ED p256 e salvarla in un file di archivio chiavi denominato «example\$1keystore.store» nella directory di lavoro. Sostituisci con un'etichetta univoca. *<ec key pair label>*

```
keytool -genkeypair -alias <ec key pair label> \
        -keyalg ec -keysize 256 \
        -sigalg SHA512withECDSA \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

È possibile trovare un elenco di [algoritmi di firma supportati](java-lib-supported.md#java-sign-verify) nella libreria Java.

# Elimina una AWS CloudHSM chiave usando keytool
<a name="delete_key_using_keytool"></a>

L'archivio AWS CloudHSM chiavi non supporta l'eliminazione delle chiavi. Per eliminare la chiave, è necessario utilizzare la `deleteKey` funzione AWS CloudHSM dello strumento da riga di comando,[Eliminare una AWS CloudHSM chiave usando KMU](key_mgmt_util-deleteKey.md).

# Genera una AWS CloudHSM CSR usando keytool
<a name="generate_csr_using_keytool"></a>

Ottieni la massima flessibilità nella generazione di una richiesta di firma del certificato (CSR) se utilizzi [AWS CloudHSM Motore dinamico OpenSSL per Client SDK 5](openssl-library.md). Il comando seguente utilizza keytool per generare un CSR per una coppia di chiavi con l'alias, `example-key-pair`.

```
keytool -certreq -alias <key pair label> \
        -file example_csr.csr \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

**Nota**  
Per utilizzare una coppia di chiavi da keytool, tale coppia di chiavi deve avere una voce nel file dell'archivio chiavi specificato. Se si desidera utilizzare una coppia di chiavi generata al di fuori di keytool, è necessario importare i metadati della chiave e del certificato nell'archivio chiavi. Per istruzioni sull'importazione dei dati del keystore, consulta [Importazione di certificati intermedi e root](import_cert_using_keytool.md) in Key Store utilizzando Keytool. AWS CloudHSM 

# Usa keytool per importare certificati intermedi e root nel key store AWS CloudHSM
<a name="import_cert_using_keytool"></a>

Per importare un certificato CA AWS CloudHSM, è necessario abilitare la verifica di una catena completa di certificati su un certificato appena importato. Il comando seguente mostra un esempio. 

```
keytool -import -trustcacerts -alias rootCAcert \
        -file rootCAcert.cert -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

Se connetti più istanze client al AWS CloudHSM cluster, l'importazione di un certificato nell'archivio delle chiavi di un'istanza client non renderà automaticamente il certificato disponibile su altre istanze client. È necessario importare il certificato in ogni istanza del client.

# Usa keytool per eliminare i certificati dall'archivio delle chiavi AWS CloudHSM
<a name="delete_cert_using_keytool"></a>

Il comando seguente mostra un esempio di come eliminare un AWS CloudHSM certificato da un archivio di chiavi Java keytool. 

```
keytool -delete -alias mydomain -keystore \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

Se si connettono più istanze client al AWS CloudHSM cluster, l'eliminazione di un certificato nell'archivio chiavi di un'istanza client non rimuoverà automaticamente il certificato dalle altre istanze client. È necessario eliminare il certificato su ogni istanza del client.

# Importa un certificato funzionante nell'archivio delle AWS CloudHSM chiavi utilizzando keytool
<a name="import_working_cert_using_keytool"></a>

Una volta firmata una richiesta di firma del certificato (CSR), è possibile importarla nell'archivio chiavi AWS CloudHSM e associarla alla coppia di chiavi appropriata. Il seguente comando fornisce un esempio. 

```
keytool -importcert -noprompt -alias <key pair label> \
        -file example_certificate.crt \
        -keystore example_keystore.store
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

L'alias deve essere una coppia di chiavi con un certificato associato nell'archivio chiavi. Se la chiave viene generata al di fuori di keytool o viene generata in un'istanza del client diversa, è necessario prima importare i metadati della chiave e del certificato nell'archivio chiavi. Per istruzioni sull'importazione dei metadati del certificato, consulta l'esempio di codice in [Registrazione di chiavi preesistenti](register-pre-existing-keys-with-keystore.md) con Key Store. AWS CloudHSM 

La catena di certificati deve essere verificabile. Se non è possibile verificare il certificato, potrebbe essere necessario importare il certificato di firma (autorità di certificazione) nell'archivio chiavi in modo che la catena possa essere verificata.

# Esporta un certificato utilizzando keytool AWS CloudHSM
<a name="export_cert_using_keytool"></a>

Nell'esempio seguente viene generato un certificato in formato binario X.509. Per esportare un certificato leggibile dall'uomo AWS CloudHSM, aggiungilo `-rfc` al `-exportcert` comando. 

```
keytool -exportcert -alias <key pair label> \
        -file example_exported_certificate.crt \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

# Usa l'archivio di AWS CloudHSM chiavi con Jarsigner utilizzando Client SDK 3
<a name="using_keystore_jarsigner"></a>

Jarsigner è una popolare utilità a riga di comando per firmare file JAR utilizzando una chiave archiviata in modo sicuro su un modulo di sicurezza hardware (HSM). Un tutorial completo su Jarsigner non rientra nell'ambito della documentazione. AWS CloudHSM Questa sezione spiega i parametri Jarsigner da utilizzare per firmare e verificare le firme AWS CloudHSM come radice di fiducia tramite il key store. AWS CloudHSM 

# Configura AWS CloudHSM chiavi e certificati con Jarsigner
<a name="jarsigner_set_up_certificates"></a>

Prima di poter firmare i file AWS CloudHSM JAR con Jarsigner, assicurati di aver configurato o completato i seguenti passaggi: 

1. Seguire le indicazioni contenute nei [prerequisiti dell'archivio chiavi AWS CloudHSM](keystore-prerequisites.md).

1. Configura le chiavi di firma e i certificati e la catena di certificati associati, che devono essere archiviati nell'archivio AWS CloudHSM chiavi dell'istanza corrente del server o del client. Crea le chiavi su AWS CloudHSM e poi importa i metadati associati nel tuo AWS CloudHSM key store. Usa l'esempio di codice in [Registrazione di chiavi preesistenti con AWS CloudHSM Key Store per importare i metadati nel key store](register-pre-existing-keys-with-keystore.md). Se desideri utilizzare keytool per impostare le chiavi e i certificati, vedi [Crea nuove AWS CloudHSM chiavi con keytool](create_key_keytool.md). Se utilizzi più istanze client per firmare il tuo JARs, crea la chiave e importa la catena di certificati. Quindi copia il file dell'archivio delle chiavi risultante in ogni istanza del client. Se generi frequentemente nuove chiavi, è possibile che sia più semplice importare singolarmente i certificati in ogni istanza client.

1. L'intera catena di certificati dovrebbe essere verificabile. Affinché la catena di certificati sia verificabile, potrebbe essere necessario aggiungere il certificato CA e i certificati intermedi all'archivio delle chiavi. AWS CloudHSM Consulta lo snippet di codice in [Sign a JAR file using AWS CloudHSM e Jarsigner per istruzioni su come utilizzare il codice Java](jarsigner_sign_jar_using_hsm_jarsigner.md) per verificare la catena di certificati. Se preferisci, puoi utilizzare keytool per importare i certificati. Per istruzioni sull'uso di keytool, consulta [Uso di Keytool per importare certificati intermedi](import_cert_using_keytool.md) e root in Key Store. AWS CloudHSM 

# Firma un file JAR utilizzando e Jarsigner AWS CloudHSM
<a name="jarsigner_sign_jar_using_hsm_jarsigner"></a>

Usa il seguente comando per firmare un file JAR usando AWS CloudHSM e jarsigner: 

```
jarsigner -keystore example_keystore.store \
        -signedjar signthisclass_signed.jar \
        -sigalg sha512withrsa \
        -storetype CloudHSM \
        -J-classpath '-J/opt/cloudhsm/java/*:/usr/lib/jvm/java-1.8.0/lib/tools.jar' \
        -J-Djava.library.path=/opt/cloudhsm/lib \
        signthisclass.jar <key pair label>
```

Utilizza il seguente comando per verificare un file JAR firmato: 

```
jarsigner -verify \
        -keystore example_keystore.store \
        -sigalg sha512withrsa \
        -storetype CloudHSM \
        -J-classpath '-J/opt/cloudhsm/java/*:/usr/lib/jvm/java-1.8.0/lib/tools.jar' \
        -J-Djava.library.path=/opt/cloudhsm/lib \
        signthisclass_signed.jar <key pair label>
```

# Problemi noti per AWS CloudHSM l'integrazione di Java Keytool e Jarsigner utilizzando Client SDK 3
<a name="known-issues-keytool-jarsigner"></a>

L'elenco seguente fornisce l'elenco corrente dei problemi noti relativi alle integrazioni con AWS CloudHSM e Java Keytool e Jarsigner utilizzando Client SDK 3. 
+ Quando si generano chiavi utilizzando keytool, il primo provider nella configurazione del provider non può esserlo. CaviumProvider 
+ Quando si generano chiavi utilizzando keytool, viene utilizzato il primo provider (supportato) nel file di configurazione di sicurezza per generare la chiave. Questo è generalmente un provider di software. Alla chiave generata viene quindi assegnato un alias e importata nell' AWS CloudHSM HSM come chiave persistente (token) durante il processo di aggiunta della chiave. 
+  Quando si utilizza keytool con AWS CloudHSM key store, non specificare `-providerName` né `-providerpath` opzioni sulla riga di comando. `-providerclass` Specificare queste opzioni nel file del provider di protezione come descritto nei [prerequisiti dell'archivio chiavi](keystore-prerequisites.md). 
+ Quando si utilizzano chiavi EC non estraibili tramite keytool e Jarsigner, il provider SunEC deve appartenere all'elenco dei provider nel file removed/disabled java.security. Se si utilizzano chiavi EC estraibili tramite keytool e Jarsigner, i provider esportano i bit chiave dall'HSM e utilizzano la chiave localmente per le operazioni di firma. AWS CloudHSM Si sconsiglia di utilizzare chiavi esportabili con keytool o Jarsigner.

# AWS CloudHSM Registra chiavi preesistenti con key store
<a name="register-pre-existing-keys-with-keystore"></a>

[Per la massima sicurezza e flessibilità negli attributi e nell'etichettatura, ti consigliamo di generare le chiavi di AWS CloudHSM firma utilizzando key\$1mgmt\$1util.](generate-keys.md) È inoltre possibile utilizzare un'applicazione Java per generare la chiave in AWS CloudHSM.

La sezione seguente fornisce un esempio di codice che dimostra come generare una nuova coppia di chiavi sull'HSM e registrarla utilizzando le chiavi esistenti importate nel AWS CloudHSM key store. Le chiavi importate sono disponibili per l'uso con strumenti di terze parti come keytool e Jarsigner. 

Per utilizzare una chiave preesistente, modificare il codice di esempio per cercare una chiave per etichetta invece di generare una nuova chiave. Il codice di esempio per la ricerca di una chiave per etichetta è disponibile nell'[KeyUtilitiesRunneresempio.java](https://github.com/aws-samples/aws-cloudhsm-jce-examples/blob/master/src/main/java/com/amazonaws/cloudhsm/examples/KeyUtilitiesRunner.java) su. GitHub 

**Importante**  
La registrazione di una chiave AWS CloudHSM memorizzata in un key store locale non comporta l'esportazione della chiave. Quando la chiave è registrata, l'archivio chiavi registra l'alias (o l'etichetta) della chiave e crea una correlazione tra gli oggetti certificati archiviati localmente e una coppia di chiavi sul AWS CloudHSM. Finché la coppia di chiavi viene creata come non esportabile, i bit chiave non lasceranno l'HSM. 

```
                      	
                      	
                      	//
 // Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy of this
 // software and associated documentation files (the "Software"), to deal in the Software
 // without restriction, including without limitation the rights to use, copy, modify,
 // merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so.
 //
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
package com.amazonaws.cloudhsm.examples;

import com.cavium.key.CaviumKey;
import com.cavium.key.parameter.CaviumAESKeyGenParameterSpec;
import com.cavium.key.parameter.CaviumRSAKeyGenParameterSpec;
import com.cavium.asn1.Encoder;
import com.cavium.cfm2.Util;

import javax.crypto.KeyGenerator;

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;

import java.math.BigInteger;

import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.KeyStore.PasswordProtection;
import java.security.KeyStore.PrivateKeyEntry;
import java.security.KeyStore.Entry;

import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;

//
// KeyStoreExampleRunner demonstrates how to load a keystore, and associate a certificate with a
// key in that keystore.
//
// This example relies on implicit credentials, so you must setup your environment correctly.
//
// https://docs.aws.amazon.com/cloudhsm/latest/userguide/java-library-install.html#java-library-credentials
//

public class KeyStoreExampleRunner {

     private static byte[] COMMON_NAME_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x03 };
     private static byte[] COUNTRY_NAME_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x06 };
     private static byte[] LOCALITY_NAME_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x07 };
     private static byte[] STATE_OR_PROVINCE_NAME_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x08 };
     private static byte[] ORGANIZATION_NAME_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x0A };
     private static byte[] ORGANIZATION_UNIT_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x0B };

     private static String helpString = "KeyStoreExampleRunner%n" +
            "This sample demonstrates how to load and store keys using a keystore.%n%n" +
            "Options%n" +
            "\t--help\t\t\tDisplay this message.%n" +
            "\t--store <filename>\t\tPath of the keystore.%n" +
            "\t--password <password>\t\tPassword for the keystore (not your CU password).%n" +
            "\t--label <label>\t\t\tLabel to store the key and certificate under.%n" +
            "\t--list\t\t\tList all the keys in the keystore.%n%n";

    public static void main(String[] args) throws Exception {
        Security.addProvider(new com.cavium.provider.CaviumProvider());
        KeyStore keyStore = KeyStore.getInstance("CloudHSM");

        String keystoreFile = null;
        String password = null;
        String label = null;
        boolean list = false;
        for (int i = 0; i < args.length; i++) {
            String arg = args[i];
            switch (args[i]) {
                case "--store":
                    keystoreFile = args[++i];
                    break;
                case "--password":
                    password = args[++i];
                    break;
                case "--label":
                    label = args[++i];
                    break;
                case "--list":
                    list = true;
                    break;
                case "--help":
                    help();
                    return;
            }
        }

        if (null == keystoreFile || null == password) {
            help();
            return;
        }

        if (list) {
            listKeys(keystoreFile, password);
            return;
        }

        if (null == label) {
            label = "Keystore Example Keypair";
        }

        //
        // This call to keyStore.load() will open the pkcs12 keystore with the supplied
        // password and connect to the HSM. The CU credentials must be specified using
        // standard CloudHSM login methods.
        //
        try {
            FileInputStream instream = new FileInputStream(keystoreFile);
            keyStore.load(instream, password.toCharArray());
        } catch (FileNotFoundException ex) {
            System.err.println("Keystore not found, loading an empty store");
            keyStore.load(null, null);
        }

        PasswordProtection passwd = new PasswordProtection(password.toCharArray());
        System.out.println("Searching for example key and certificate...");

        PrivateKeyEntry keyEntry = (PrivateKeyEntry) keyStore.getEntry(label, passwd);
        if (null == keyEntry) {
            //
            // No entry was found, so we need to create a key pair and associate a certificate.
            // The private key will get the label passed on the command line. The keystore alias
            // needs to be the same as the private key label. The public key will have ":public"
            // appended to it. The alias used in the keystore will We associate the certificate
            // with the private key.
            //
            System.out.println("No entry found, creating...");
            KeyPair kp = generateRSAKeyPair(2048, label + ":public", label);
            System.out.printf("Created a key pair with the handles %d/%d%n", ((CaviumKey) kp.getPrivate()).getHandle(), ((CaviumKey) kp.getPublic()).getHandle());

            //
            // Generate a certificate and associate the chain with the private key.
            //
            Certificate self_signed_cert = generateCert(kp);
            Certificate[] chain = new Certificate[1];
            chain[0] = self_signed_cert;
            PrivateKeyEntry entry = new PrivateKeyEntry(kp.getPrivate(), chain);

            //
            // Set the entry using the label as the alias and save the store.
            // The alias must match the private key label.
            //
            keyStore.setEntry(label, entry, passwd);

            FileOutputStream outstream = new FileOutputStream(keystoreFile);
            keyStore.store(outstream, password.toCharArray());
            outstream.close();

            keyEntry = (PrivateKeyEntry) keyStore.getEntry(label, passwd);
        }

        long handle = ((CaviumKey) keyEntry.getPrivateKey()).getHandle();
        String name = keyEntry.getCertificate().toString();
        System.out.printf("Found private key %d with certificate %s%n", handle, name);
    }

    private static void help() {
        System.out.println(helpString);
    }

    //
    // Generate a non-extractable / non-persistent RSA keypair.
    // This method allows us to specify the public and private labels, which
    // will make KeyStore aliases easier to understand.
    //
    public static KeyPair generateRSAKeyPair(int keySizeInBits, String publicLabel, String privateLabel)
            throws InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchProviderException {

        boolean isExtractable = false;
        boolean isPersistent = false;
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("rsa", "Cavium");
        CaviumRSAKeyGenParameterSpec spec = new CaviumRSAKeyGenParameterSpec(keySizeInBits, new BigInteger("65537"), publicLabel, privateLabel, isExtractable, isPersistent);

        keyPairGen.initialize(spec);

        return keyPairGen.generateKeyPair();
    }

    //
    // Generate a certificate signed by a given keypair.
    //
    private static Certificate generateCert(KeyPair kp) throws CertificateException {
        CertificateFactory cf = CertificateFactory.getInstance("X509");
        PublicKey publicKey = kp.getPublic();
        PrivateKey privateKey = kp.getPrivate();
        byte[] version = Encoder.encodeConstructed((byte) 0, Encoder.encodePositiveBigInteger(new BigInteger("2"))); // version 1
        byte[] serialNo = Encoder.encodePositiveBigInteger(new BigInteger(1, Util.computeKCV(publicKey.getEncoded())));

        // Use the SHA512 OID and algorithm.
        byte[] signatureOid = new byte[] {
            (byte) 0x2A, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xF7, (byte) 0x0D, (byte) 0x01, (byte) 0x01, (byte) 0x0D };
        String sigAlgoName = "SHA512WithRSA";

         byte[] signatureId = Encoder.encodeSequence(
                                         Encoder.encodeOid(signatureOid),
                                         Encoder.encodeNull());

         byte[] issuer = Encoder.encodeSequence(
                                     encodeName(COUNTRY_NAME_OID, "<Country>"),
                                     encodeName(STATE_OR_PROVINCE_NAME_OID, "<State>"),
                                     encodeName(LOCALITY_NAME_OID, "<City>"),
                                     encodeName(ORGANIZATION_NAME_OID, "<Organization>"),
                                     encodeName(ORGANIZATION_UNIT_OID, "<Unit>"),
                                     encodeName(COMMON_NAME_OID, "<CN>")
                                 );

         Calendar c = Calendar.getInstance();
         c.add(Calendar.DAY_OF_YEAR, -1);
         Date notBefore = c.getTime();
         c.add(Calendar.YEAR, 1);
         Date notAfter = c.getTime();
         byte[] validity = Encoder.encodeSequence(
                                         Encoder.encodeUTCTime(notBefore),
                                         Encoder.encodeUTCTime(notAfter)
                                     );
         byte[] key = publicKey.getEncoded();

         byte[] certificate = Encoder.encodeSequence(
                                         version,
                                         serialNo,
                                         signatureId,
                                         issuer,
                                         validity,
                                         issuer,
                                         key);
         Signature sig;
         byte[] signature = null;
         try {
             sig = Signature.getInstance(sigAlgoName, "Cavium");
             sig.initSign(privateKey);
             sig.update(certificate);
             signature = Encoder.encodeBitstring(sig.sign());

         } catch (Exception e) {
             System.err.println(e.getMessage());
             return null;
         }

         byte [] x509 = Encoder.encodeSequence(
                         certificate,
                         signatureId,
                         signature
                         );
         return cf.generateCertificate(new ByteArrayInputStream(x509));
    }

     //
     // Simple OID encoder.
     // Encode a value with OID in ASN.1 format
     //
     private static byte[] encodeName(byte[] nameOid, String value) {
         byte[] name = null;
         name = Encoder.encodeSet(
                     Encoder.encodeSequence(
                             Encoder.encodeOid(nameOid),
                             Encoder.encodePrintableString(value)
                     )
                 );
         return name;
     }

    //
    // List all the keys in the keystore.
    //
    private static void listKeys(String keystoreFile, String password) throws Exception {
        KeyStore keyStore = KeyStore.getInstance("CloudHSM");

        try {
            FileInputStream instream = new FileInputStream(keystoreFile);
            keyStore.load(instream, password.toCharArray());
        } catch (FileNotFoundException ex) {
            System.err.println("Keystore not found, loading an empty store");
            keyStore.load(null, null);
        }

        for(Enumeration<String> entry = keyStore.aliases(); entry.hasMoreElements();) {
            System.out.println(entry.nextElement());
        }
    }

}
```