

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Utilisez le SDK client 3 pour intégrer AWS CloudHSM Java Keytool et Jarsigner
<a name="keystore-third-party-tools"></a>

AWS CloudHSM le magasin de clés est un magasin de clés JCE spécial qui utilise les certificats associés aux clés de votre module de sécurité matériel (HSM) via des outils tiers tels que et. `keytool` `jarsigner` AWS CloudHSM ne stocke pas les certificats sur le HSM, car les certificats sont des données publiques non confidentielles. Le magasin de AWS CloudHSM clés stocke les certificats dans un fichier local et les mappe aux clés correspondantes sur votre HSM. 

Lorsque vous utilisez le magasin de AWS CloudHSM clés pour générer de nouvelles clés, aucune entrée n'est générée dans le fichier de magasin de clés local ; les clés sont créées sur le HSM. De même, lorsque vous utilisez le magasin de clés AWS CloudHSM pour rechercher des clés, la recherche est transmise au HSM. Lorsque vous stockez des certificats dans le magasin de AWS CloudHSM clés, le fournisseur vérifie qu'une paire de clés portant l'alias correspondant existe sur le HSM, puis associe le certificat fourni à la paire de clés correspondante. 

**Topics**
+ [Conditions préalables](keystore-prerequisites.md)
+ [Utiliser le magasin de clés avec keytool](using_keystore_with_keytool.md)
+ [Utiliser le magasin de clés avec jarsigner](using_keystore_jarsigner.md)
+ [Problèmes connus](known-issues-keytool-jarsigner.md)
+ [Enregistrer les clés préexistantes avec le magasin de clés](register-pre-existing-keys-with-keystore.md)

# Conditions préalables à l'intégration AWS CloudHSM avec Java Keytool et Jarsigner à l'aide du SDK client 3
<a name="keystore-prerequisites"></a>

Pour utiliser le magasin de AWS CloudHSM clés, vous devez d'abord initialiser et configurer le SDK AWS CloudHSM JCE. Pour cela, utilisez la procédure suivante : 

## Étape 1 : Installation du JCE
<a name="prereq-step-one"></a>

Pour installer le JCE, y compris les prérequis du AWS CloudHSM client, suivez les étapes d'[installation de la bibliothèque Java](java-library-install.md). 

## Étape 2 : Ajouter des informations d'identification de connexion HSM aux variables d'environnement
<a name="prereq-step-two"></a>

Configurez les variables d'environnement pour qu'elles contiennent vos informations d'identification de connexion HSM. 

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

**Note**  
Le CloudHSM JCE offre diverses options de connexion. Pour utiliser le magasin de AWS CloudHSM clés avec des applications tierces, vous devez utiliser une connexion implicite avec des variables d'environnement. Si vous souhaitez utiliser une connexion explicite via le code de l'application, vous devez créer votre propre application à l'aide du magasin de AWS CloudHSM clés. Pour plus d'informations, consultez l'article sur l'[utilisation de AWS CloudHSM Key Store](alternative-keystore.md). 

## Étape 3 : Enregistrez le fournisseur JCE
<a name="prereq-step-three"></a>

Pour enregistrer le fournisseur JCE, dans la CloudProvider configuration Java. 

1. Ouvrez le fichier de configuration java.security dans votre installation Java, pour modification.

1. Dans le fichier de configuration java.security, ajoutez `com.cavium.provider.CaviumProvider` comme dernier fournisseur. Par exemple, s'il y a neuf fournisseurs dans le fichier java.security, ajoutez le fournisseur suivant comme dernier fournisseur dans la section. L'ajout du fournisseur de Cavium à une priorité plus élevée peut avoir un impact négatif sur les performances de votre système.

   `security.provider.10=com.cavium.provider.CaviumProvider`
**Note**  
Les utilisateurs de puissance peuvent être habitués à spécifier les options de lignes de commande `-providerName`, `-providerclass` et `-providerpath` lors de l'utilisation de keytool, au lieu de mettre à jour le fichier de configuration de sécurité. Si vous essayez de spécifier des options de ligne de commande lors de la génération de AWS CloudHSM clés avec le magasin de clés, cela provoquera des erreurs. 

# Utiliser le magasin de AWS CloudHSM clés avec keytool à l'aide du SDK client 3
<a name="using_keystore_with_keytool"></a>

[ Keytool](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html) est un utilitaire de ligne de commande populaire pour les tâches courantes de clés et de certificats sur les systèmes Linux. La documentation AWS CloudHSM n'inclut pas de didacticiel complet sur keytool. Cet article explique les paramètres spécifiques que vous devez utiliser avec les différentes fonctions de keytool lorsque vous les utilisez AWS CloudHSM comme racine de confiance via le magasin de AWS CloudHSM clés.

Lorsque vous utilisez keytool avec le magasin de AWS CloudHSM clés, spécifiez les arguments suivants pour chaque commande keytool :

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

Si vous souhaitez créer un nouveau fichier de stockage de clés à l'aide du magasin de AWS CloudHSM clés, consultez[Utilisez le SDK AWS CloudHSM KeyStore for AWS CloudHSM Client 3](alternative-keystore.md#using_cloudhsm_keystore). Pour utiliser un magasin de clés existant, spécifiez son nom (y compris le chemin) à l'aide de l'argument —keystore à keytool. Si vous spécifiez un fichier de stockage de clés inexistant dans une commande keytool, le magasin de AWS CloudHSM clés crée un nouveau fichier de stockage de clés.

# Créez de nouvelles AWS CloudHSM clés avec keytool
<a name="create_key_keytool"></a>

Vous pouvez utiliser keytool pour générer n'importe quel type de clé pris en charge par le SDK AWS CloudHSM JCE. Consultez la liste complète des clés et longueurs dans l'article [Clés prises en charge](java-lib-supported.md#java-keys) dans la bibliothèque Java.

**Important**  
Une clé générée par keytool est générée dans le logiciel, puis importée AWS CloudHSM sous forme de clé persistante extractible.

Les instructions pour créer des clés non extractibles directement sur le module de sécurité matériel (HSM), puis les utiliser avec keytool ou Jarsigner, sont présentées dans l'exemple de code de la section [Enregistrement](register-pre-existing-keys-with-keystore.md) de clés préexistantes avec le magasin de clés. AWS CloudHSM Nous vous recommandons fortement de générer des clés non exportables en dehors de keytool, puis d'importer les certificats correspondants dans le magasin de clés. Si vous utilisez des clés RSA ou EC extractibles via keytool et jarsigner, les fournisseurs exportent les clés depuis le, AWS CloudHSM puis les utilisent localement pour les opérations de signature.

Si plusieurs instances clientes sont connectées à votre cluster CloudHSM, sachez que l'importation d'un certificat sur le magasin de clés d'une instance cliente ne rend pas automatiquement les certificats disponibles sur d'autres instances clientes. Pour enregistrer la clé et les certificats associés sur chaque instance client, vous devez exécuter une application Java comme décrit dans [Générer un CSR à l'aide de Keytool](generate_csr_using_keytool.md). Vous pouvez également apporter les modifications nécessaires sur un client et copier le fichier de stockage de clés résultant sur chaque autre instance cliente.

**Exemple 1 :** générer une clé AES-256 symétrique et l'enregistrer dans un fichier de stockage de clés nommé « example\$1keystore.store », dans le répertoire de travail. *<secret label>*Remplacez-le par une étiquette unique.

```
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/
```

**Exemple 2 :** générer une paire de clés RSA 2048 et l'enregistrer dans un fichier de stockage de clés nommé « example\$1keystore.store » dans le répertoire de travail. *<RSA key pair label>*Remplacez-le par une étiquette unique.

```
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/
```

**Exemple 3 :** générer une clé ED p256 et l'enregistrer dans un fichier de stockage de clés nommé « example\$1keystore.store » dans le répertoire de travail. *<ec key pair label>*Remplacez-le par une étiquette unique.

```
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/
```

Vous trouverez une liste des [algorithmes de signature pris en charge](java-lib-supported.md#java-sign-verify) dans la bibliothèque Java.

# Supprimer une AWS CloudHSM clé à l'aide de keytool
<a name="delete_key_using_keytool"></a>

Le magasin de AWS CloudHSM clés ne prend pas en charge la suppression de clés. Pour supprimer la clé, vous devez utiliser la `deleteKey` fonction de l'outil AWS CloudHSM de ligne de commande,[Supprimer une AWS CloudHSM clé à l'aide de KMU](key_mgmt_util-deleteKey.md).

# Générer un AWS CloudHSM CSR à l'aide de keytool
<a name="generate_csr_using_keytool"></a>

Vous bénéficiez de la plus grande flexibilité dans la génération d'une demande de signature de certificat (CSR) si vous utilisez le [Moteur AWS CloudHSM dynamique OpenSSL pour le SDK client 5](openssl-library.md). La commande suivante utilise keytool pour générer un CSR pour une paire de clés avec 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/
```

**Note**  
Pour utiliser une paire de clés de keytool, cette paire de clés doit avoir une entrée dans le fichier de stockage de clés spécifié. Si vous souhaitez utiliser une paire de clés générée en dehors de keytool, vous devez importer les métadonnées de clé et de certificat dans le magasin de clés. Pour obtenir des instructions sur l'importation des données du magasin de clés, voir [Importation de certificats intermédiaires et racines dans le magasin de AWS CloudHSM clés à l'aide de Keytool](import_cert_using_keytool.md).

# Utilisez keytool pour importer des certificats intermédiaires et racines dans le magasin de AWS CloudHSM clés
<a name="import_cert_using_keytool"></a>

Pour importer un certificat CA dans AWS CloudHSM, vous devez activer la vérification d'une chaîne de certificats complète sur un certificat récemment importé. Voici un exemple de commande. 

```
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/
```

Si vous connectez plusieurs instances clientes à votre AWS CloudHSM cluster, l'importation d'un certificat dans le magasin de clés d'une instance client ne le rendra pas automatiquement disponible sur les autres instances clientes. Vous devez importer le certificat sur chaque instance client.

# Utiliser keytool pour supprimer les certificats du magasin de AWS CloudHSM clés
<a name="delete_cert_using_keytool"></a>

La commande suivante montre un exemple de suppression d'un AWS CloudHSM certificat d'un magasin de clés 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/
```

Si vous connectez plusieurs instances clientes à votre AWS CloudHSM cluster, la suppression d'un certificat dans le magasin de clés d'une instance client ne supprimera pas automatiquement le certificat des autres instances clientes. Vous devez supprimer le certificat sur chaque instance cliente.

# Importer un certificat fonctionnel dans le magasin de AWS CloudHSM clés à l'aide de keytool
<a name="import_working_cert_using_keytool"></a>

Une fois qu'une demande de signature de certificat (CSR) est signée, vous pouvez l'importer dans le magasin de clés AWS CloudHSM et l'associer à la paire de clés appropriée. La commande suivante fournit un exemple. 

```
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 doit être une paire de clés avec un certificat associé dans le magasin de clés. Si la clé est générée en dehors de keytool, ou si elle est générée sur une autre instance cliente, vous devez d'abord importer la clé et les métadonnées de certificat dans le magasin de clés. Pour obtenir des instructions sur l'importation des métadonnées du certificat, consultez l'exemple de code dans [Enregistrement de clés préexistantes auprès du magasin de AWS CloudHSM clés](register-pre-existing-keys-with-keystore.md). 

La chaîne de certificats doit être vérifiable. Si vous ne parvenez pas à vérifier le certificat, vous devrez peut-être importer le certificat de signature (autorité de certification) dans le magasin de clés afin que la chaîne puisse être vérifiée.

# Exporter un certificat à AWS CloudHSM l'aide de keytool
<a name="export_cert_using_keytool"></a>

L'exemple suivant génère un certificat au format binaire X.509. Pour exporter un certificat lisible par l'homme depuis AWS CloudHSM, ajoutez-le `-rfc` à la `-exportcert` commande. 

```
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/
```

# Utiliser le magasin de AWS CloudHSM clés avec Jarsigner à l'aide du SDK client 3
<a name="using_keystore_jarsigner"></a>

Jarsigner est un utilitaire de ligne de commande populaire permettant de signer des fichiers JAR à l'aide d'une clé stockée de manière sécurisée sur un module de sécurité matériel (HSM). Un tutoriel complet sur Jarsigner est hors de portée de la AWS CloudHSM documentation. Cette section explique les paramètres Jarsigner que vous devez utiliser pour signer et vérifier les signatures en utilisant le référentiel de AWS CloudHSM clés AWS CloudHSM comme source de confiance. 

# Configurer AWS CloudHSM les clés et les certificats avec Jarsigner
<a name="jarsigner_set_up_certificates"></a>

Avant de signer des fichiers AWS CloudHSM JAR avec Jarsigner, assurez-vous d'avoir configuré ou effectué les étapes suivantes : 

1. Suivez les instructions fournies dans les [conditions préalables du magasin de clés AWS CloudHSM](keystore-prerequisites.md).

1. Configurez vos clés de signature ainsi que les certificats et la chaîne de certificats associés, qui doivent être stockés dans le magasin de AWS CloudHSM clés de l'instance actuelle du serveur ou du client. Créez les clés sur le, AWS CloudHSM puis importez les métadonnées associées dans votre magasin de AWS CloudHSM clés. Utilisez l'exemple de code de la section [Enregistrement de clés préexistantes auprès du magasin de AWS CloudHSM clés](register-pre-existing-keys-with-keystore.md) pour importer des métadonnées dans le magasin de clés. Si vous souhaitez utiliser keytool pour configurer les clés et les certificats, reportez-vous à la section [Créez de nouvelles AWS CloudHSM clés avec keytool](create_key_keytool.md). Si vous utilisez plusieurs instances clientes pour signer votre JARs, créez la clé et importez la chaîne de certificats. Copiez ensuite le fichier de stockage de clés obtenu sur chaque instance cliente. Si vous générez fréquemment de nouvelles clés, il peut être plus facile d'importer individuellement des certificats dans chaque instance cliente.

1. Toute la chaîne de certificats doit être vérifiable. Pour que la chaîne de certificats soit vérifiable, vous devrez peut-être ajouter le certificat CA et les certificats intermédiaires au magasin de AWS CloudHSM clés. Consultez l'extrait de code dans [Signer un fichier JAR à l'aide de Jarsigner AWS CloudHSM et Jarsigner](jarsigner_sign_jar_using_hsm_jarsigner.md) pour obtenir des instructions sur l'utilisation du code Java pour vérifier la chaîne de certificats. Si vous préférez, vous pouvez utiliser keytool pour importer des certificats. Pour obtenir des instructions sur l'utilisation de keytool, consultez la section [Utilisation de Keytool pour importer des certificats intermédiaires et racines dans AWS CloudHSM Key Store](import_cert_using_keytool.md). 

# Signer un fichier JAR à l'aide de AWS CloudHSM et Jarsigner
<a name="jarsigner_sign_jar_using_hsm_jarsigner"></a>

Utilisez la commande suivante pour signer un fichier JAR à l'aide de AWS CloudHSM et 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>
```

Utilisez la commande suivante pour vérifier un JAR signé : 

```
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>
```

# Problèmes connus liés à l' AWS CloudHSM intégration de Java Keytool et Jarsigner à l'aide du SDK client 3
<a name="known-issues-keytool-jarsigner"></a>

La liste suivante fournit la liste actuelle des problèmes connus relatifs aux intégrations avec Java Keytool AWS CloudHSM et Jarsigner à l'aide du SDK client 3. 
+ Lorsque vous générez des clés à l'aide de keytool, le premier fournisseur dans la configuration du fournisseur ne peut pas l'être CaviumProvider. 
+ Lors de la génération de clés à l'aide de keytool, le premier fournisseur (pris en charge) dans le fichier de configuration de sécurité est utilisé pour générer la clé. Il s'agit généralement d'un fournisseur de logiciels. La clé générée reçoit ensuite un alias et est importée dans le AWS CloudHSM HSM en tant que clé persistante (jeton) pendant le processus d'ajout de clé. 
+  Lorsque vous utilisez keytool avec le magasin de AWS CloudHSM clés, ne spécifiez pas `-providerName``-providerclass`, ni `-providerpath` options sur la ligne de commande. Spécifiez ces options dans le fichier du fournisseur de sécurité, comme décrit dans les [conditions préalables du magasin de clés](keystore-prerequisites.md). 
+ Lorsque vous utilisez des clés EC non extractibles via keytool et Jarsigner, le fournisseur SunEC doit figurer dans la liste des fournisseurs du removed/disabled fichier java.security. Si vous utilisez des clés EC extractibles via keytool et Jarsigner, les fournisseurs exportent les bits clés du AWS CloudHSM HSM et utilisent la clé localement pour les opérations de signature. Nous ne vous recommandons pas d'utiliser des clés exportables avec keytool ou Jarsigner.

# Enregistrer les clés préexistantes avec le magasin de AWS CloudHSM clés
<a name="register-pre-existing-keys-with-keystore"></a>

Pour une sécurité et une flexibilité maximales en termes d'attributs et d'étiquetage, nous vous recommandons de générer vos clés de AWS CloudHSM signature à l'aide de [key\$1mgmt\$1util](generate-keys.md). Vous pouvez également utiliser une application Java pour générer la clé dans AWS CloudHSM.

La section suivante fournit un exemple de code qui montre comment générer une nouvelle paire de clés sur le HSM et l'enregistrer à l'aide de clés existantes importées dans le magasin de AWS CloudHSM clés. Les clés importées peuvent être utilisées avec des outils tiers tels que keytool et Jarsigner. 

Pour utiliser une clé préexistante, modifiez l'exemple de code pour rechercher une clé par étiquette au lieu de générer une nouvelle clé. Un exemple de code permettant de rechercher une clé par étiquette est disponible dans l'[exemple KeyUtilitiesRunner .java](https://github.com/aws-samples/aws-cloudhsm-jce-examples/blob/master/src/main/java/com/amazonaws/cloudhsm/examples/KeyUtilitiesRunner.java) sur GitHub. 

**Important**  
L'enregistrement d'une clé enregistrée dans un magasin de clés local n'exporte pas la clé. AWS CloudHSM Lorsque la clé est enregistrée, le magasin de clés enregistre l'alias (ou l'étiquette) de la clé et met en corrélation localement les objets de certificat de magasin avec une paire de clés sur le AWS CloudHSM. Tant que la paire de clés est créée comme non exportable, les bits de clé ne quitteront pas le 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());
        }
    }

}
```