¿Cómo puedo transferir mis claves de forma segura a CloudHSM con OpenSSL y la herramienta de línea de comandos key_mgmt_util?

8 minutos de lectura
0

Tengo claves locales que quiero importar a AWS CloudHSM usando el comando unWrapKey con la herramienta de línea de comandos key_mgmt_util. Sin embargo, no puedo importar ni empaquetar claves de texto sin formato.

Resolución

Cifre su clave de carga con una clave AES efímera. Cifre la clave AES efímera con su clave pública de un par de claves. A continuación, concatene la clave de carga cifrada y la clave efímera cifrada en un solo archivo. El archivo concatenado se envía a CloudHSM en su formato cifrado y, a continuación, se descifra con la clave privada del par de claves. El mecanismo AES_KEY_WRAP descifra la clave AES efímera y la usa para descifrar tu clave de carga.

Cree las siguientes claves:

  • Clave AES o RSA de carga. Esta es la clave que importa y usa con su CloudHSM.
  • AES_KEY_WRAP requiere una clave AES temporal para cifrar la clave de carga. Se recomienda utilizar AES porque no hay límites de tamaño en cuanto a lo que se puede cifrar.
  • El par de claves RSA se utiliza para empaquetar y desempaquetar estas claves de forma segura en su CloudHSM.

Antes de empezar, asegúrese de tener una versión parcheada de OpenSSL para poder empaquetar sobres. Para obtener instrucciones, consulte ¿Cómo puedo aplicar un parche a OpenSSL para activar su uso con el mecanismo CKM_RSA_AES_KEY_WRAP de CloudHSM?

Crear, cifrar e importar las claves locales

1.    Ejecute estos comandos para crear las claves de carga, efímera y RSA.

Consejo: Cree estas claves en su propio directorio para rastrear sus archivos.

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.    Genere los valores hexadecimales sin procesar de la clave AES efímera en una variable con este comando.

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

**Nota:**Asegúrese de tener instalada la utilidad hexdump o este comando devolverá un error. Consulte la documentación del sistema operativo para obtener información sobre cómo instalar la utilidad hexdump.

3.    Utilice el comando enc en OpenSSL para empaquetar la carga con la clave AES efímera. El cifrado -id-aes256-wrap-pad es el mecanismo de empaquetado que cumple con RFC 3394 que coincide con CKM_RSA_AES_KEY_WRAP. Los valores -iv se establecen mediante RFC 5649 (una extensión de RFC 3394).

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

4.    Cifre la clave AES con la clave pública del par de claves RSA que creó en el paso 1.

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.    Desde el equipo local, concatene la clave de carga cifrada y la clave AES efímera en un único archivo denominado rsa_aes_wrapped.

cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped

6.    Importe la clave privada RSA a CloudHSM desde su equipo local. Cree una clave AES persistente en HSM para administrar la importación usando importPrivateKey.

Nota: Sustituya user-name y user-password por su nombre de usuario y contraseña de CloudHSM.

**Nota:Si creó el par de claves RSA en HSM y exportó la clave pública usando ** ExportPubKey, puede omitir los pasos 6 a 9.

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

Advertencia: El comando puede registrar los detalles de su nombre de usuario y contraseña de forma local. Después de transferir las claves, se recomienda cambiar la contraseña. En lugar de especificar la contraseña de usuario cifrado, también puede escribir un script de shell para evitar que la contraseña se registre en el historial de shell. Este script de shell recibirá todos los argumentos de key_mgmt_util y los enviará a este comando. Esto le permite utilizar el script de shell para ejecutar el comando anterior, así como los demás comandos key_mgmt_util que aparecen a continuación.

7.    Recibirá un resultado similar al siguiente. Tenga en cuenta el identificador de clave de AES: se usa para importar la clave RSA privada. En este ejemplo, el identificador de clave es 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.    Importe la clave privada y empaquétela en HSM. La importación se asegura con la clave AES persistente que creó en el paso 6. Nota: Sustituya la opción -w 7 por su identificador de clave.

/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.    Recibirá un resultado similar al siguiente. Tenga en cuenta el identificador de la clave privada RSA importado. En este ejemplo, la clave privada RSA importada es 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.    Desempaque la clave de carga concatenada en HSM mediante la clave privada RSA importada con el comando unWrapKey. Este ejemplo usa -w 8 como identificador de la clave privada RSA importada.

**Nota:Sustituya ** -w 8 por su identificador de clave privada.

/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

Nota: Debe usar -kc 4 -kt 31 para desempacar las claves AES y -kc 3 -kt 0 para desempaquetar las claves privadas RSA. Para obtener más información sobre el uso de los parámetros -m, -kc y -kt, consulte el ejemplo unWrapKey.

11.    Recibirá una importación correcta de la clave AES de carga similar a la siguiente salida:

**Nota:**En este ejemplo, el identificador de clave 10 de la nueva clave desempacada se puede usar en CloudHSM.

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

Compruebe que ha importado la clave AES de carga

1.    Vuelva a exportar la clave AES de carga al disco con la clave de empaquetado -w 7. Sustituya el identificador de clave de carga 10 por su propio valor de la clave AES de carga importada.

/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.    Ejecute este comando para comparar la clave de carga importada con la clave payload_aes.

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

3.    Si las claves HSM.key y payload_aes son idénticas, recibirá la siguiente salida:

Files HSM.key and payload_aes are identical

Importar la carga RSA

1.    Si desea desempacar una clave privada RSA en HSM, ejecute estos comandos para cambiar la clave de carga por una clave privada RSA.

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.    Las claves RSA creadas en el paso 1 de la sección Pasos necesarios para importar la carga RSA con OpenSSL están en formato PKCS #1. Sin embargo, la herramienta key_mgmt_util asume que la clave privada está en formato PKCS #8 DER. Vea las claves en texto sin formato con su editor de texto preferido para confirmar el formato similar al siguiente:

  • Formato PKCS1: -----INICIAR CLAVE PRIVADA RSA----- - Formato PKCS8: -----INICIAR CLAVE PRIVADA-----

3.    Para convertir la clave payload_rsa.pem al formato pkcs8 y codificada en DER, ejecute este comando:

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

4.    Siga los pasos 2 a 9 de la sección Crear, cifrar e importar las claves locales.

Nota: sustituya payload_aes por payload_rsa_pkcs8.der.

5.    Ejecute este comando para desempacar la clave privada RSA de carga en CloudHSM y tenga en cuenta el identificador de clave de salida:

/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

Nota: Debe usar -kc 4 -kt 31 para desempacar las claves AES y -kc 3 -kt 0 para desempaquetar las claves privadas RSA.

La clave RSA de carga ya está desempacada en HSM.

Comprobar que se ha importado la clave privada RSA de carga

1.    Vuelva a exportar la clave privada RSA de carga al disco con la clave de empaquetado que creó anteriormente. Sustituya el identificador de clave de carga 25 por el valor de su clave privada RSA de carga importada.

/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.    Ejecute este comando para convertir su clave payload_rsa al formato PKCS #8 sin convertirla a DER.

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

3.    Ejecute este comando para comparar la clave de carga importada con la clave payload_rsa.

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

4.    Si las claves HSM_rsa_private.key y payload_rsa_pkcs8.pem son idénticas, recibirá el siguiente resultado:

Files HSM_rsa_private.key and payload_rsa_pkcs8.pem are identical

Información relacionada

Mecanismos PKCS #11 compatibles

OpenSSL

Requisito de Oasis con la especificación PKCS #11

RFC 3394

RFC 5649

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años