Wie kann ich meine Schlüssel mit OpenSSL und dem Befehlszeilentool key_mgmt_util sicher an CloudHSM übertragen?

Lesedauer: 8 Minute
0

Ich habe lokale Schlüssel, die ich mithilfe des Befehls unWrapKey mit dem Befehlszeilentool key_mgmt_util in AWS CloudHSM importieren möchte. Ich kann jedoch keine Klartext-Schlüssel importieren oder verpacken.

Lösung

Verschlüsseln Sie Ihren Payload-Schlüssel mit einem kurzlebigen AES-Schlüssel. Verschlüsseln Sie den kurzlebigen AES mit Ihrem öffentlichen Schlüssel aus einem Schlüsselpaar. Konkatenieren Sie dann den verschlüsselten Payload-Schlüssel und den verschlüsselten temporären Schlüssel zu einer einzigen Datei. Die verkettete Datei wird in ihrem verschlüsselten Format an Ihr CloudHSM gesendet und dann mit dem privaten Schlüssel aus dem Schlüsselpaar entschlüsselt. Der AES_KEY_WRAP-Mechanismus entschlüsselt den kurzlebigen AES-Schlüssel und verwendet den Schlüssel, um Ihren Payload-Schlüssel zu entschlüsseln.

Erstellen Sie die folgenden Schlüssel:

  • Payload-AES- oder RSA-Schlüssel. Dies ist der Schlüssel, den Sie importieren und mit Ihrem CloudHSM verwenden.
  • Temporärer AES-Schlüssel, der von AES_KEY_WRAP benötigt wird, um die Payload zu verschlüsseln. Es hat sich bewährt, AES zu verwenden, da hier keine Größenbeschränkungen dafür gelten, was verschlüsselt werden kann.
  • RSA-Schlüsselpaar, das verwendet wird, um diese Schlüssel sicher in Ihr CloudHSM zu ver- und entpacken.

Bevor Sie beginnen, stellen Sie sicher, dass Sie über eine gepatchte Version von OpenSSL verfügen, um das Verpacken von Umschlägen zu ermöglichen. Anweisungen finden Sie unter Wie kann ich OpenSSL patchen, um die Verwendung mit dem Mechanismus CloudHSM CKM_RSA_AES_KEY_WRAP zu aktivieren?

Lokale Schlüssel erstellen, verschlüsseln und importieren

1.Führen Sie diese Befehle aus, um die Payload-, Ephemeral- und RSA-Schlüssel zu erstellen.

Tipp: Erstellen Sie diese Schlüssel in einem eigenen Verzeichnis, um Ihre Dateien nachverfolgen zu können.

openssl rand -out payload_aes 32
openssl rand -out ephemeral_aes 32
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -out public.pem -pubout -outform PEM

2.Geben Sie bei diesem Befehl die rohen Hex-Werte des kurzlebigen AES-Schlüssels in eine Variable aus.

EPHEMERAL_AES_HEX=$(hexdump -v -e '/1 "%02X"' < ephemeral_aes)

Hinweis: Vergewissern Sie sich, dass Sie das Hexdump-Hilfsprogramm installiert haben, da dieser Befehl sonst einen Fehler zurückgibt. Informationen zur Installation des Hexdump-Hilfsprogramms finden Sie in der Dokumentation Ihres Betriebssystems.

3.Verwenden Sie den OpenSSL-Befehl enc, um die Payload mit dem kurzlebigen AES-Schlüssel zu verpacken. Die -id-aes256-wrap-pad-Verschlüsselung ist der RFC 3394-konforme Verpackungsmechanismus, der CKM_RSA_AES_KEY_WRAP entspricht. Die -iv-Werte werden durch RFC 5649 (eine Erweiterung von RFC 3394) festgelegt.

OPENSSL_V111 enc -id-aes256-wrap-pad -K $EPHEMERAL_AES_HEX -iv A65959A6 -in payload_aes -out payload_wrapped

4.Verschlüsseln Sie den AES-Schlüssel mit dem öffentlichen Schlüssel aus dem RSA-Schlüsselpaar, das Sie in Schritt 1 erstellt haben.

OPENSSL_V111 pkeyutl -encrypt -in ephemeral_aes -out ephemeral_wrapped -pubin -inkey public.pem -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha1 -pkeyopt rsa_mgf1_md:sha1

5.Konkatenieren Sie auf dem lokalen Computer den verschlüsselten Payload-Schlüssel und den kurzlebigen AES-Schlüssel zu einer einzigen Datei mit dem Namen rsa_aes_wrapped.

cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped

6.Importieren Sie den privaten RSA-Schlüssel von Ihrem lokalen Computer in das CloudHSM. Erstellen Sie einen persistenten AES-Schlüssel im HSM, um den Import mithilfe vonimportPrivateKey zu verwalten.

Hinweis: Ersetzen Sie user-name und user-password durch Ihren CloudHSM-Benutzernamen und Ihr Passwort.

Hinweis: Wenn Sie das RSA-Schlüsselpaar auf dem HSM erstellt und den öffentlichen Schlüssel mit exportPubKey exportiert haben, können Sie die Schritte 6–9 überspringen.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password  genSymKey -t 31 -s 32 -l aes256

Warnung: Der Befehl kann Details zu Ihrem Benutzernamen und Passwort lokal aufzeichnen. Nach der Übertragung Ihrer Schlüssel empfiehlt es sich, Ihr Passwort zu ändern.Anstatt das Krypto-Benutzerpasswort anzugeben, können Sie auch ein Shell-Skript schreiben, um zu verhindern, dass das Passwort im Shell-Verlauf aufgezeichnet wird. Dieses Shell-Skript empfängt alle Argumente für key_mgmt_util und sendet sie an diesen Befehl. Auf diese Weise können Sie das Shell-Skript verwenden, um den obigen Befehl sowie die anderen key_mgmt_util-Befehle weiter unten auszuführen.

7.Sie erhalten eine Ausgabe, die der folgenden ähnelt. Beachten Sie die AES-Schlüsselkennung – diese wird verwendet, um den privaten RSA-Schlüssel zu importieren. In diesem Beispiel lautet die Schlüsselkennung 7.

Command: genSymKey  -t  31  -s  32  -l  aes256
        Cfm3GenerateSymmetricKey returned: 0x00 : HSM Return: SUCCESS
        Symmetric Key Created.  Key Handle: 7
        Cluster Error Status
        Node id 0 and err state 0x00000000 : HSM Return: SUCCESS

8.Importieren Sie den privaten Schlüssel und entpacken Sie ihn in das HSM. Der Import ist mit dem persistenten AES-Schlüssel gesichert, den Sie in Schritt 6 erstellt haben. Hinweis: Ersetzen Sie die Option -w 7 durch Ihre Schlüsselkennung.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password  importPrivateKey -l private -f private.pem -w 7

9.Sie erhalten eine Ausgabe, die der folgenden ähnelt. Notieren Sie sich die importierte private RSA-Schlüsselkennung. In diesem Beispiel ist der importierte private RSA-Schlüssel 8.

Cfm3WrapHostKey returned: 0x00 : HSM Return: SUCCESS
        Cfm3CreateUnwrapTemplate2 returned: 0x00 : HSM Return: SUCCESS
        Cfm3UnWrapKey returned: 0x00 : HSM Return: SUCCESS
        Private Key Imported.  Key Handle: 8
        Cluster Error Status
        Node id 0 and err state 0x00000000 : HSM Return: SUCCESS

10.Entpacken Sie den verketteten Payload-Schlüssel mithilfe des importierten privaten RSA-Schlüssels mit dem Befehl unWrapKey in das HSM. In diesem Beispiel wird -w 8 als Schlüsselkennung des importierten privaten RSA-Schlüssels verwendet.

Hinweis: Ersetzen Sie -w 8 durch Ihre private Schlüsselkennung.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password  unWrapKey -f rsa_aes_wrapped -w 8 -m 7 -noheader -l secretkey -kc 4 -kt 31

Hinweis: Sie müssen -kc 4 -kt 31 verwenden, um AES-Schlüssel zu entpacken, und -kc 3 -kt 0, um private RSA-Schlüssel zu entpacken. Weitere Informationen zur Verwendung der Parameter -m, -kc und -kt finden Sie im Beispiel für unWrapKey.

11.Sie erhalten einen erfolgreichen Import des Payload-AES-Schlüssels, der der folgenden Ausgabe ähnelt:

Hinweis: In diesem Beispiel kann die Schlüsselkennung 10 des neuen unverpackten Schlüssels im CloudHSM verwendet werden.

Cfm3CreateUnwrapTemplate2 returned: 0x00 : HSM Return: SUCCESS
        Cfm2UnWrapWithTemplate3 returned: 0x00 : HSM Return: SUCCESS
        Key Unwrapped.  Key Handle: 10
        Cluster Error Status
        Node id 0 and err state 0x00000000 : HSM Return: SUCCESS

Sicherstellen, dass Sie den Payload-AES-Schlüssel importiert haben

1.Exportieren Sie den Payload-AES-Schlüssel mit dem Wrapping-Schlüssel -w 7 zurück auf die Festplatte. Ersetzen Sie die Payload-Schlüsselkennung 10 durch Ihren eigenen Wert Ihres importierten Payload-AES-Schlüssels.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password exSymKey -k 10 -w 7 -out HSM.key

2.Führen Sie diesen Befehl aus, um den importierten Payload-Schlüssel mit dem payload_aes-Schlüssel zu vergleichen.

diff HSM.key payload_aes --report-identical-files

3.Wenn die Schlüssel HSM.key und payload_aes identisch sind, erhalten Sie die folgende Ausgabe:

Files HSM.key and payload_aes are identical

Die RSA-Payload importieren

1.Wenn Sie einen privaten RSA-Schlüssel in das HSM entpacken möchten, führen Sie diese Befehle aus, um den Payload-Schlüssel in einen privaten RSA-Schlüssel zu ändern.

openssl genrsa -out payload_rsa.pem 2048
openssl rand -out ephemeral_aes 32
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -out public.pem -pubout -outform PEM

2.RSA-Schlüssel, die in Schritt 1 aus dem Abschnitt Erforderliche Schritte zum Importieren von RSA-Payloads mithilfe von OpenSSL erstellt wurden, haben das PKCS #1 -Format. Das Tool key_mgmt_util geht jedoch davon aus, dass der private Schlüssel im PKCS #8 DER-Format vorliegt. Sehen Sie sich die Schlüssel in Ihrem bevorzugten Texteditor im Klartext an, um das Format zu bestätigen, das dem folgenden ähnelt:

  • PKCS1-Format: -----BEGIN RSA PRIVATE KEY----- - PKCS8-Format: -----BEGIN PRIVATE KEY-----

3.Führen Sie den folgenden Befehl aus, um den Schlüssel payload_rsa.pem in das pkcs8-Format und DER-kodiert zu konvertieren:

openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_rsa.pem -out payload_rsa_pkcs8.der -nocrypt

4.Folgen Sie den Schritten 2-9 aus dem Abschnitt Lokale Schlüssel erstellen, verschlüsseln und importieren.

Hinweis: Ersetzen Sie payload_aes durch payload_rsa_pkcs8.der.

5.Führen Sie diesen Befehl aus, um den privaten Payload-RSA-Schlüssel in das CloudHSM zu entpacken, und notieren Sie sich die Ausgabeschlüsselkennung:

/opt/cloudhsm/bin/key_mgmt_util singlecmd loginHSM -u CU -s user-name -p user-password unWrapKey -f rsa_aes_wrapped -kc 3 -kt 0 -w 8 -l private_key -m 7 -noheader

Hinweis: Sie müssen -kc 4 -kt 31 verwenden, um AES-Schlüssel zu entpacken, und -kc 3 -kt 0, um private RSA-Schlüssel zu entpacken.

Sie haben jetzt den Payload-RSA-Schlüssel in das HSM entpackt.

Sicherstellen, dass Sie den privaten Payload-RSA-Schlüssel importiert haben

1.Exportieren Sie den privaten Payload-RSA-Schlüssel mithilfe des zuvor erstellten Wrapping-Schlüssels zurück auf die Festplatte. Ersetzen Sie die Payload-Schlüsselkennung 25 durch Ihren eigenen Wert Ihres importierten privaten Payload-RSA-Schlüssels.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password exportPrivateKey -k 25 -w 7 -out HSM_rsa_private.key

2.Führen Sie diesen Befehl aus, um Ihren payload_rsa-Schlüssel in das PKCS #8 -Format zu konvertieren, ohne in DER zu konvertieren.

openssl pkcs8 -topk8 -inform PEM -outform PEM -in payload_rsa.pem -out payload_rsa_pkcs8.pem -nocrypt

3.Führen Sie diesen Befehl aus, um den importierten Payload-Schlüssel mit dem payload_rsa-Schlüssel zu vergleichen.

diff HSM_rsa_private.key payload_rsa_pkcs8.pem --report-identical-files

4.Wenn die Schlüssel HSM_rsa_private.key und payload_rsa_pkcs8.pem identisch sind, erhalten Sie die folgende Ausgabe:

Files HSM_rsa_private.key and payload_rsa_pkcs8.pem are identical

Ähnliche Informationen

Unterstützte PKCS #11-Mechanismen

OpenSSL

Oasis-Anforderung mit der PKCS #11 -Spezifikation

RFC 3394

RFC 5649

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren