

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Verwenden Sie Client SDK 3 zur Integration AWS CloudHSM mit Java Keytool und Jarsigner
<a name="keystore-third-party-tools"></a>

AWS CloudHSM Der Schlüsselspeicher ist ein spezieller JCE-Schlüsselspeicher, der Zertifikate verwendet, die mit Schlüsseln auf Ihrem Hardware-Sicherheitsmodul (HSM) verknüpft sind, und zwar über Tools von Drittanbietern wie und. `keytool` `jarsigner` AWS CloudHSM speichert keine Zertifikate auf dem HSM, da es sich bei Zertifikaten um öffentliche, nicht vertrauliche Daten handelt. Der AWS CloudHSM Schlüsselspeicher speichert die Zertifikate in einer lokalen Datei und ordnet die Zertifikate den entsprechenden Schlüsseln auf Ihrem HSM zu. 

Wenn Sie den AWS CloudHSM Schlüsselspeicher verwenden, um neue Schlüssel zu generieren, werden keine Einträge in der lokalen Schlüsselspeicherdatei generiert — die Schlüssel werden auf dem HSM erstellt. Wenn Sie den AWS CloudHSM -Schlüsselspeicher verwenden, um nach Schlüsseln zu suchen, wird die Suche an das HSM übergeben. Wenn Sie Zertifikate im AWS CloudHSM Schlüsselspeicher speichern, überprüft der Anbieter, ob ein key pair mit dem entsprechenden Alias auf dem HSM vorhanden ist, und ordnet dann das bereitgestellte Zertifikat dem entsprechenden key pair zu. 

**Topics**
+ [Voraussetzungen](keystore-prerequisites.md)
+ [Verwenden Sie den Schlüsselspeicher mit Keytool](using_keystore_with_keytool.md)
+ [Verwenden Sie den Schlüsselspeicher mit Jarsigner](using_keystore_jarsigner.md)
+ [Bekannte Probleme](known-issues-keytool-jarsigner.md)
+ [Registrieren Sie bereits vorhandene Schlüssel im Schlüsselspeicher](register-pre-existing-keys-with-keystore.md)

# Voraussetzungen für die Integration AWS CloudHSM mit Java Keytool und Jarsigner mithilfe des Client SDK 3
<a name="keystore-prerequisites"></a>

Um den AWS CloudHSM Schlüsselspeicher verwenden zu können, müssen Sie zuerst das JCE SDK initialisieren und konfigurieren. AWS CloudHSM Gehen Sie dazu wie folgt vor. 

## Schritt 1: Installieren der JCE
<a name="prereq-step-one"></a>

Um das JCE, einschließlich der AWS CloudHSM Client-Voraussetzungen, zu installieren, folgen Sie den Schritten zur [Installation der](java-library-install.md) Java-Bibliothek. 

## Schritt 2: Hinzufügen von HSM-Anmeldeinformationen zu Umgebungsvariablen
<a name="prereq-step-two"></a>

Richten Sie Umgebungsvariablen so ein, dass sie Ihre HSM-Anmeldeinformationen enthalten. 

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

**Anmerkung**  
Die CloudHSM JCE bietet verschiedene Anmeldeoptionen. Um den AWS CloudHSM Schlüsselspeicher mit Anwendungen von Drittanbietern zu verwenden, müssen Sie die implizite Anmeldung mit Umgebungsvariablen verwenden. Wenn Sie die explizite Anmeldung über Anwendungscode verwenden möchten, müssen Sie mithilfe des AWS CloudHSM Schlüsselspeichers Ihre eigene Anwendung erstellen. Weitere Informationen finden Sie im Artikel zur [Verwendung des AWS CloudHSM Schlüsselspeichers](alternative-keystore.md). 

## Schritt 3: Registrieren Sie den JCE-Anbieter
<a name="prereq-step-three"></a>

Um den JCE-Anbieter in der CloudProvider Java-Konfiguration zu registrieren. 

1. Öffnen Sie die java.security-Konfigurationsdatei in Ihrer Java-Installation zur Bearbeitung.

1. Fügen Sie in der Konfigurationsdatei java.security `com.cavium.provider.CaviumProvider` als letzten Provider hinzu. Wenn sich beispielsweise neun Provider in der Datei java.security befinden, fügen Sie den folgenden Provider als letzten Provider in dem Abschnitt hinzu. Das Hinzufügen des Cavium-Providers mit höherer Priorität kann sich negativ auf die Leistung Ihres Systems auswirken.

   `security.provider.10=com.cavium.provider.CaviumProvider`
**Anmerkung**  
Intensive Nutzer können daran gewöhnt sein, `-providerName`-, `-providerclass`- und `-providerpath`-Befehlszeilenoptionen bei Verwendung von keytool anzugeben, anstatt die Sicherheitskonfigurationsdatei zu aktualisieren. Wenn Sie versuchen, beim Generieren von Schlüsseln mit dem AWS CloudHSM Schlüsselspeicher Befehlszeilenoptionen anzugeben, führt dies zu Fehlern. 

# Verwenden Sie den AWS CloudHSM Schlüsselspeicher mit Keytool und verwenden Sie das Client SDK 3
<a name="using_keystore_with_keytool"></a>

[ Keytool](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html) ist ein beliebtes Befehlszeilenprogramm für allgemeine Schlüssel- und Zertifikataufgaben auf Linux-Systemen. Ein vollständiges Tutorial zu keytool liegt außerhalb des Umfangs der AWS CloudHSM -Dokumentation. In diesem Artikel werden die spezifischen Parameter erläutert, die Sie mit verschiedenen Keytool-Funktionen verwenden sollten, wenn Sie sie über den AWS CloudHSM Schlüsselspeicher AWS CloudHSM als Vertrauensbasis verwenden.

Wenn Sie Keytool mit dem AWS CloudHSM Schlüsselspeicher verwenden, geben Sie die folgenden Argumente für jeden Keytool-Befehl an:

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

Wenn Sie mithilfe des Schlüsselspeichers eine neue Schlüsselspeicherdatei erstellen möchten, finden Sie AWS CloudHSM weitere Informationen unter. [Verwenden Sie das SDK 3 für den Client AWS CloudHSM KeyStore AWS CloudHSM](alternative-keystore.md#using_cloudhsm_keystore) Um einen vorhandenen Schlüsselspeicher zu verwenden, geben Sie seinen Namen (einschließlich Pfad) mit dem Argument -keystore zu keytool an. Wenn Sie in einem Keytool-Befehl eine nicht existierende Schlüsselspeicherdatei angeben, erstellt der AWS CloudHSM Schlüsselspeicher eine neue Schlüsselspeicherdatei.

# Erstellen Sie neue AWS CloudHSM Schlüssel mit Keytool
<a name="create_key_keytool"></a>

Sie können Keytool verwenden, um jede Art von Schlüssel zu generieren, die vom AWS CloudHSM JCE SDK unterstützt werden. Eine vollständige Liste der Schlüssel und Längen finden Sie im Artikel [ Unterstützte Schlüssel](java-lib-supported.md#java-keys) in der Java-Bibliothek.

**Wichtig**  
Ein mit Keytool generierter Schlüssel wird in der Software generiert und dann AWS CloudHSM als extrahierbarer, persistenter Schlüssel importiert.

[Anweisungen zum Erstellen nicht extrahierbarer Schlüssel direkt auf dem Hardware-Sicherheitsmodul (HSM) und deren anschließende Verwendung mit Keytool oder Jarsigner finden Sie im Codebeispiel unter Registrierung bereits vorhandener Schlüssel mit dem Schlüsselspeicher. AWS CloudHSM](register-pre-existing-keys-with-keystore.md) Wir empfehlen nachdrücklich, nicht exportierbare Schlüssel außerhalb von keytool zu generieren und dann entsprechende Zertifikate in den Schlüsselspeicher zu importieren. Wenn Sie extrahierbare RSA- oder EC-Schlüssel über Keytool und Jarsigner verwenden, exportieren die Anbieter Schlüssel aus dem und verwenden den Schlüssel dann lokal für Signaturvorgänge. AWS CloudHSM 

Wenn mehrere Client-Instanzen mit Ihrem CloudHSM-Cluster verbunden sind, beachten Sie, dass das Importieren eines Zertifikats im Schlüsselspeicher einer Clientinstanz die Zertifikate nicht automatisch auf anderen Client-Instanzen verfügbar macht. Um den Schlüssel und die zugehörigen Zertifikate auf jeder Client-Instanz zu registrieren, müssen Sie eine Java-Anwendung ausführen, wie unter [Generieren eines CSR mit Keytool](generate_csr_using_keytool.md) beschrieben. Alternativ können Sie die erforderlichen Änderungen auf einem Client vornehmen und die resultierende Schlüsselspeicherdatei auf jede andere Client-Instanz kopieren.

**Beispiel 1:** Um einen symmetrischen AES-256-Schlüssel zu generieren und ihn in einer Schlüsselspeicherdatei mit dem Namen „example\$1keystore.store“ im Arbeitsverzeichnis zu speichern. Durch eine eindeutige Bezeichnung ersetzen. *<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/
```

**Beispiel 2:** Um ein RSA 2048-Schlüsselpaar zu generieren und es in einer Schlüsselspeicherdatei mit dem Namen „example\$1keystore.store“ im Arbeitsverzeichnis zu speichern. Durch eine eindeutige Bezeichnung ersetzen. *<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/
```

**Beispiel 3:** Um einen P256-ED-Schlüssel zu generieren und ihn in einer Schlüsselspeicherdatei mit dem Namen „example\$1keystore.store“ im Arbeitsverzeichnis zu speichern. Durch eine eindeutige Bezeichnung ersetzen. *<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/
```

Sie finden eine Liste der [unterstützten Signaturalgorithmen](java-lib-supported.md#java-sign-verify) in der Java-Bibliothek.

# Löschen Sie einen AWS CloudHSM Schlüssel mit Keytool
<a name="delete_key_using_keytool"></a>

Der AWS CloudHSM Schlüsselspeicher unterstützt das Löschen von Schlüsseln nicht. Um einen Schlüssel zu löschen, müssen Sie die `deleteKey` Funktion AWS CloudHSM des Befehlszeilentools von verwenden[Löschen Sie einen AWS CloudHSM Schlüssel mit KMU](key_mgmt_util-deleteKey.md).

# Generieren Sie eine AWS CloudHSM CSR mit Keytool
<a name="generate_csr_using_keytool"></a>

Sie erhalten die größte Flexibilität beim Generieren einer Zertifikatsignieranforderung (Certificate Signing Request, CSR), wenn Sie die [OpenSSL Dynamic Engine für AWS CloudHSM Client SDK 5](openssl-library.md) verwenden. Der folgende Befehl verwendet keytool, um eine CSR für ein Schlüsselpaar mit dem Alias, `example-key-pair`, zu generieren.

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

**Anmerkung**  
Um ein Schlüsselpaar von keytool zu verwenden, muss dieses Schlüsselpaar einen Eintrag in der angegebenen Schlüsselspeicherdatei haben. Wenn Sie ein Schlüsselpaar verwenden möchten, das außerhalb von keytool generiert wurde, müssen Sie die Schlüssel- und Zertifikatmetadaten in den Schlüsselspeicher importieren. Anweisungen zum Importieren der Keystore-Daten finden Sie unter [Import von Zwischen- und Stammzertifikaten in AWS CloudHSM Key](import_cert_using_keytool.md) Store mit Keytool.

# Verwenden Sie Keytool, um Zwischen- und Stammzertifikate in den Schlüsselspeicher zu importieren AWS CloudHSM
<a name="import_cert_using_keytool"></a>

Um ein CA-Zertifikat zu importieren AWS CloudHSM, müssen Sie die Überprüfung einer vollständigen Zertifikatskette für ein neu importiertes Zertifikat aktivieren. Im Folgenden wird ein Beispielbefehl gezeigt. 

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

Wenn Sie mehrere Client-Instances mit Ihrem AWS CloudHSM Cluster verbinden, wird durch den Import eines Zertifikats in den Schlüsselspeicher einer Client-Instance das Zertifikat nicht automatisch auf anderen Client-Instances verfügbar gemacht. Sie müssen das Zertifikat auf jeder Client-Instanz importieren.

# Verwenden Sie Keytool, um Zertifikate aus dem AWS CloudHSM Schlüsselspeicher zu löschen
<a name="delete_cert_using_keytool"></a>

Der folgende Befehl zeigt ein Beispiel für das Löschen eines AWS CloudHSM Zertifikats aus einem Java-Keytool-Schlüsselspeicher. 

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

Wenn Sie mehrere Client-Instances mit Ihrem AWS CloudHSM Cluster verbinden, wird durch das Löschen eines Zertifikats im Schlüsselspeicher einer Client-Instanz das Zertifikat nicht automatisch aus anderen Client-Instances entfernt. Sie müssen das Zertifikat auf jeder Client-Instanz löschen.

# Importieren Sie ein funktionierendes Zertifikat mit AWS CloudHSM Keytool in den Schlüsselspeicher
<a name="import_working_cert_using_keytool"></a>

Sobald eine Zertifikatsignieranforderung (CSR) signiert ist, können Sie sie in den AWS CloudHSM -Schlüsselspeicher importieren und mit dem entsprechenden Schlüsselpaar verknüpfen. Der folgende Befehl bietet ein Beispiel. 

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

Der Alias sollte ein Schlüsselpaar mit einem zugeordneten Zertifikat im Schlüsselspeicher sein. Wenn der Schlüssel außerhalb von keytool oder auf einer anderen Client-Instanz generiert wird, müssen Sie zuerst die Schlüssel- und Zertifikatmetadaten in den Schlüsselspeicher importieren. Anweisungen zum Importieren der Zertifikatsmetadaten finden Sie im Codebeispiel unter [Registrierung bereits vorhandener Schlüssel mit dem AWS CloudHSM Schlüsselspeicher](register-pre-existing-keys-with-keystore.md). 

Die Zertifikatkette muss überprüfbar sein. Wenn Sie das Zertifikat nicht überprüfen können, müssen Sie möglicherweise das Signaturzertifikat (Zertifizierungsstelle) in den Schlüsselspeicher importieren, damit die Kette überprüft werden kann.

# Exportieren Sie ein Zertifikat AWS CloudHSM mit Keytool
<a name="export_cert_using_keytool"></a>

Im folgenden Beispiel wird ein Zertifikat im Binärformat X.509 generiert. Um ein menschenlesbares Zertifikat von zu exportieren AWS CloudHSM, fügen Sie `-rfc` es dem `-exportcert` Befehl hinzu. 

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

# Verwenden Sie den AWS CloudHSM Schlüsselspeicher mit Jarsigner und verwenden Sie das Client SDK 3
<a name="using_keystore_jarsigner"></a>

Jarsigner ist ein beliebtes Befehlszeilenprogramm zum Signieren von JAR-Dateien mithilfe eines Schlüssels, der sicher auf einem Hardware-Sicherheitsmodul (HSM) gespeichert ist. Ein vollständiges Tutorial zu Jarsigner ist in dieser Dokumentation nicht enthalten. AWS CloudHSM In diesem Abschnitt werden die Jarsigner-Parameter erläutert, die Sie verwenden sollten, um Signaturen AWS CloudHSM als Vertrauensbasis über den Schlüsselspeicher zu signieren und zu verifizieren. AWS CloudHSM 

# Richten Sie AWS CloudHSM Schlüssel und Zertifikate mit Jarsigner ein
<a name="jarsigner_set_up_certificates"></a>

Bevor Sie AWS CloudHSM JAR-Dateien mit Jarsigner signieren können, stellen Sie sicher, dass Sie die folgenden Schritte eingerichtet oder abgeschlossen haben: 

1. Folgen Sie den Anweisungen unter [AWS CloudHSM -Schlüsselspeichervoraussetzungen ](keystore-prerequisites.md).

1. Richten Sie Ihre Signaturschlüssel und die zugehörigen Zertifikate und die Zertifikatskette ein, die im AWS CloudHSM Schlüsselspeicher der aktuellen Server- oder Client-Instanz gespeichert werden sollen. Erstellen Sie die Schlüssel auf dem AWS CloudHSM und importieren Sie dann die zugehörigen Metadaten in Ihren AWS CloudHSM Schlüsselspeicher. Verwenden Sie das Codebeispiel unter [Registrierung bereits vorhandener Schlüssel beim AWS CloudHSM Schlüsselspeicher](register-pre-existing-keys-with-keystore.md), um Metadaten in den Schlüsselspeicher zu importieren. Informationen zum Einrichten der Schlüssel und Zertifikate mit keytool finden Sie unter [Erstellen Sie neue AWS CloudHSM Schlüssel mit Keytool](create_key_keytool.md). Wenn Sie mehrere Client-Instanzen verwenden, um Ihre zu signieren JARs, erstellen Sie den Schlüssel und importieren Sie die Zertifikatskette. Kopieren Sie dann die resultierende Schlüsselspeicherdatei auf jede Client-Instanz. Wenn Sie häufig neue Schlüssel generieren, ist es möglicherweise einfacher, Zertifikate einzeln in jede Client-Instanz zu importieren.

1. Die gesamte Zertifikatskette sollte überprüfbar sein. Damit die Zertifikatskette verifizierbar ist, müssen Sie möglicherweise das CA-Zertifikat und die Zwischenzertifikate zum AWS CloudHSM Schlüsselspeicher hinzufügen. Anweisungen zur [Verwendung von Java-Code zur Überprüfung der Zertifikatskette finden Sie im Codeausschnitt unter Signieren einer JAR-Datei mit AWS CloudHSM und Jarsigner](jarsigner_sign_jar_using_hsm_jarsigner.md). Wenn Sie möchten, können Sie keytool verwenden, um Zertifikate zu importieren. Anweisungen zur Verwendung von Keytool finden Sie unter Verwenden von [Keytool zum Importieren von Zwischen- und](import_cert_using_keytool.md) Stammzertifikaten in Key Store. AWS CloudHSM 

# Signieren Sie eine JAR-Datei mit AWS CloudHSM und Jarsigner
<a name="jarsigner_sign_jar_using_hsm_jarsigner"></a>

Verwenden Sie den folgenden Befehl, um eine JAR-Datei mit AWS CloudHSM einem Jarsigner zu signieren: 

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

Verwenden Sie den folgenden Befehl, um eine signierte JAR zu überprüfen: 

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

# Bekannte Probleme bei der AWS CloudHSM Integration von Java, Keytool und Jarsigner mithilfe des Client SDK 3
<a name="known-issues-keytool-jarsigner"></a>

Die folgende Liste enthält die aktuelle Liste der bekannten Probleme bei Integrationen mit Java Keytool AWS CloudHSM und Jarsigner, die das Client SDK 3 verwenden. 
+ Beim Generieren von Schlüsseln mit Keytool kann der erste Anbieter in der Anbieterkonfiguration nicht verwendet werden. CaviumProvider 
+ Beim Generieren von Schlüsseln mit keytool wird der erste (unterstützte) Provider in der Sicherheitskonfigurationsdatei verwendet, um den Schlüssel zu generieren. Dies ist in der Regel ein Software-Provider. Der generierte Schlüssel erhält dann einen Alias und wird während des Hinzufügens des Schlüssels als persistenter (Token-) Schlüssel in das AWS CloudHSM HSM importiert. 
+  Wenn Sie Keytool mit AWS CloudHSM Schlüsselspeicher verwenden `-providerName``-providerclass`, geben Sie keine `-providerpath` Optionen oder in der Befehlszeile an. Geben Sie diese Optionen in der Sicherheitsanbieterdatei an, wie in den [Key Store-Voraussetzungen](keystore-prerequisites.md) beschrieben. 
+ Wenn Sie nicht extrahierbare EC-Schlüssel über Keytool und Jarsigner verwenden, muss der SunEC-Anbieter removed/disabled aus der Liste der Anbieter in der Datei java.security stammen. Wenn Sie extrahierbare EC-Schlüssel über Keytool und Jarsigner verwenden, exportieren die Anbieter Schlüsselbits aus dem HSM und verwenden den Schlüssel lokal für Signiervorgänge. AWS CloudHSM Wir empfehlen nicht, exportierbare Schlüssel mit keytool oder Jarsigner zu verwenden.

# Registrieren Sie bereits vorhandene Schlüssel im Schlüsselspeicher AWS CloudHSM
<a name="register-pre-existing-keys-with-keystore"></a>

Für maximale Sicherheit und Flexibilität bei Attributen und Kennzeichnungen empfehlen wir Ihnen, Ihre AWS CloudHSM Signaturschlüssel mit [key\$1mgmt\$1util](generate-keys.md) zu generieren. Sie können auch eine Java-Anwendung verwenden, um den Schlüssel in AWS CloudHSM zu generieren.

Der folgende Abschnitt enthält ein Codebeispiel, das zeigt, wie ein neues key pair auf dem HSM generiert und es mit vorhandenen Schlüsseln registriert wird, die in den AWS CloudHSM Schlüsselspeicher importiert wurden. Die importierten Schlüssel stehen für die Verwendung mit Tools von Drittanbietern wie keytool und Jarsigner zur Verfügung. 

Wenn Sie einen bereits vorhandenen Schlüssel verwenden möchten, ändern Sie das Codebeispiel so, dass es nach einem Schlüssel nach Benennung sucht, anstatt einen neuen Schlüssel zu generieren. Ein Beispielcode für das Nachschlagen eines Schlüssels anhand seiner Bezeichnung ist im [KeyUtilitiesRunner.java-Beispiel](https://github.com/aws-samples/aws-cloudhsm-jce-examples/blob/master/src/main/java/com/amazonaws/cloudhsm/examples/KeyUtilitiesRunner.java) unter verfügbar. GitHub 

**Wichtig**  
Bei der Registrierung eines Schlüssels, der in AWS CloudHSM einem lokalen Schlüsselspeicher gespeichert ist, wird der Schlüssel nicht exportiert. Wenn der Schlüssel registriert ist, registriert der Schlüsselspeicher den Alias (oder die Benennung) des Schlüssels und korreliert lokal Speicherzertifikatobjekte mit einem Schlüsselpaar auf dem AWS CloudHSM. Solange das Schlüsselpaar als nicht exportierbar erstellt wird, verlassen die Schlüsselbits das HSM nicht. 

```
                      	
                      	
                      	//
 // 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());
        }
    }

}
```