Saltar al contenido

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

7 minutos de lectura
0

Quiero usar la herramienta de línea de comandos de CloudHSM (CLI de CloudHSM) para ejecutar el comando «key unwrap» para importar claves locales a AWS CloudHSM.

Descripción corta

En primer lugar, cifra tu clave de carga útil con una clave efímera de Estándar de cifrado avanzado (AES). A continuación, cifra la clave AES efímera con tu clave pública de un par de claves. Para finalizar, une las claves de carga útil y efímera cifradas en un solo archivo. El archivo se envía a CloudHSM en un formato cifrado y la clave privada lo descifra del par de claves. El mecanismo AES_KEY_WRAP descifra la clave AES efímera y la usa para descifrar tu clave de carga útil.

Nota: Completa los siguientes pasos en una instancia de Amazon Elastic Compute Cloud (Amazon EC2) que ejecute Linux. Se recomienda utilizar una imagen de máquina de Amazon (AMI) de Amazon Linux 2023 que incluya la versión y las utilidades de OpenSSL necesarias.

Crea las siguientes claves:

  • Carga la clave AES, RSA o EC que importes y utilices con tu CloudHSM.
  • Clave AES temporal que AES_KEY_WRAP necesita para cifrar la carga útil. 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 para empaquetar y desempaquetar estas claves de forma segura en CloudHSM.

Para usar el empaquetado de sobres, debes tener la versión 3.x de OpenSSL.

Para determinar la versión de OpenSSL que tienes, ejecuta el siguiente comando:

openssl version

Resultado de ejemplo:

OpenSSL 3.0.8 7 Feb 2023 (Library: OpenSSL 3.0.8 7 Feb 2023)

Resolución

Nota: En los comandos siguientes, sustituye los siguientes valores por los tuyos:

  • YOUR_CRYPTO_USER_NAME por tu nombre de usuario de criptografía
  • YOUR_CRYPTO_USER_PASSWORD por tu contraseña
  • YOUR_WRAPPING_KEY_LABEL por la etiqueta de clave que asignaste para empaquetar tu clave pública RSA
  • YOUR_UNWRAPPING_KEY_LABEL por la etiqueta clave asignada para desempaquetar tu clave privada RSA
  • YOUR_IMPORTED_KEY_LABEL por la etiqueta clave asignada a la clave de carga útil importada

Las etiquetas clave para empaquetar y desempaquetar deben ser únicas, ya que las etiquetas clave son una condición de filtro para los comandos key generate-file y key unwrap. O bien, puedes utilizar una condición de filtro diferente para identificar las claves de forma exclusiva. Para obtener más información sobre los filtros de claves, consulta Filtrado de claves mediante la CLI de CloudHSM.

Establecimiento de las credenciales de usuario de criptografía para la CLI de CloudHSM

Ejecuta los siguientes comandos:

export CLOUDHSM_ROLE="crypto-user"
export CLOUDHSM_PIN="YOUR_CRYPTO_USER_NAME:YOUR_CRYPTO_USER_PASSWORD"

Importación de la carga útil de AES

Para crear, cifrar e importar las claves locales completa los siguientes pasos:

  1. Para crear las claves AES, AES efímeras y RSA de la carga útil, ejecuta los siguientes comandos:

    openssl rand -out payload_aes 32
    openssl rand -out ephemeral_aes 32
    /opt/cloudhsm/bin/cloudhsm-cli key generate-asymmetric-pair rsa --public-label YOUR_WRAPPING_KEY_LABEL --private-label YOUR_UNWRAPPING_KEY_LABEL --modulus-size-bits 4096 --public-exponent 65537 --private-attributes unwrap=true
    /opt/cloudhsm/bin/cloudhsm-cli key generate-file --encoding pem --path public.pem --filter attr.label=YOUR_WRAPPING_KEY_LABEL

    Nota: Para rastrear tus archivos, crea estas claves en tu propio directorio.

  2. Ejecuta el siguiente comando para poner los valores hexadecimales sin procesar de la clave AES efímera en una variable:

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

    Nota: Asegúrate de haber instalado la utilidad hexdump. Si no instalas hexdump, el comando anterior devuelve un error. Consulta la documentación de tu sistema operativo (SO) para obtener instrucciones sobre cómo instalar la utilidad hexdump.

  3. Para empaquetar la carga útil con la clave AES efímera, ejecuta el comando enc en OpenSSL:

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

    Nota: El cifrado -id-aes256-wrap-pad es el mecanismo de empaquetado que cumple con RFC 3394 que coexiste con CKM_RSA_AES_KEY_WRAP. La extensión RFC 3394, RFC 5649, establece los valores -iv. Para obtener más información, consulta el algoritmo de ajuste de empaquetado de claves AES y el algoritmo de empaquetado de claves AES en el sitio web de IETF.

  4. Usa la clave pública del par de claves RSA para cifrar la clave AES:

    openssl 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 la máquina local, une la clave de carga útil cifrada y la clave AES efímera en un único archivo denominado rsa_aes_wrapped:

    cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped
  6. Para usar la clave privada RSA con la clave unwrap rsa-aes para desempaquetar la clave de carga útil unida en CloudHSM, ejecuta el siguiente comando:

    /opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class aes --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true encrypt=true

    Nota: Debes usar**--key-type-class aes** para desempaquetar las claves AES. Según cómo uses las claves, utiliza --attributes para asignar los atributos de estas. Para obtener más información sobre las opciones y los atributos clave, consulta Atributos clave para la CLI de CloudHSM y los ejemplos de cómo usar el comando key unwrap rsa-aes.

    Recibirás una importación de la clave AES de carga útil que es similar a la siguiente salida:

    {
      "error_code": 0,
      "data": {
        "key": {
          "key-reference": "0x000000000068031a",
          "key-info": {
            "key-owners": [
              {
                "username": "YOUR_CRYPTO_USER_NAME",
                "key-coverage": "full"
              }
            ],
            "shared-users": [],
            "cluster-coverage": "full"
          },
          "attributes": {
            "key-type": "aes",
            "label": "YOUR_IMPORTED_KEY_LABEL",
            "id": "0x",
            "check-value": "0xb31c2a",
            "class": "secret-key",
            "encrypt": true,
            "decrypt": true,
            "token": true,
            "always-sensitive": false,
            "derive": false,
            "destroyable": true,
            "extractable": true,
            "local": false,
            "modifiable": true,
            "never-extractable": false,
            "private": true,
            "sensitive": true,
            "sign": true,
            "trusted": false,
            "unwrap": false,
            "verify": true,
            "wrap": false,
            "wrap-with-trusted": false,
            "key-length-bytes": 32
          }
        }
      }
    }

Importación de la carga útil RSA

Sigue estos pasos:

  1. Para desempaquetar una clave privada RSA en CloudHSM, ejecuta los siguientes comandos para cambiar la clave de carga útil por una clave privada RSA:

    openssl genrsa -out payload_rsa.pem 2048
    openssl rand -out ephemeral_aes 32
  2. Utiliza un editor de texto sin formato para comprobar el formato de las claves RSA:

    PKCS1 format: -----BEGIN RSA PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----

    Nota: Las claves RSA están en formato PKCS #1. Sin embargo, la CLI de CloudHSM presupone que la clave privada está en formato PKCS #8 DER.

  3. Para convertir la clave payload_rsa.pem al formato PKCS #8 y codificarla en DER, ejecuta el siguiente comando:

    openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_rsa.pem -out payload_rsa_pkcs8.der -nocrypt
  4. Completa los pasos 2 a 5 de la sección Importación de la carga útil AES. Sustituye payload_aes por payload_rsa_pkcs8.der.

  5. Para desempaquetar la clave privada RSA de carga útil en CloudHSM, ejecuta el siguiente comando:

    /opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class rsa-private --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true sign=true

    Nota: Debes usar --key-type-class rsa-private para desempaquetar las claves RSA. Según cómo uses las claves, utiliza --attributes para asignar los atributos de estas.

Importación de la carga útil EC

Para importar la carga útil, completa los siguientes pasos:

  1. Para desempaquetar una clave privada EC en CloudHSM, ejecuta los siguientes comandos para cambiar la clave de carga por una clave privada EC:

    openssl ecparam -name secp256k1 -genkey -noout -out payload_ec.pemopenssl rand -out ephemeral_aes 32
  2. Utiliza un editor de texto sin formato para comprobar el formato de las claves EC:

    PKCS1 format: -----BEGIN EC PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----

    Nota: Las claves EC están en formato PKCS #1. Sin embargo, la CLI de CloudHSM presupone que la clave privada está en formato PKCS #8 DER.

  3. Para convertir la clave payload_ec.pem al formato PKCS #8 y codificarla en DER, ejecuta el siguiente comando:

    openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_ec.pem -out payload_ec_pkcs8.der -nocrypt
  4. Completa los pasos 2 a 5 de la sección Importación de la carga útil AES. Sustituye payload_aes por payload_ec_pkcs8.der.

  5. Para desempaquetar la clave privada EC de carga útil en CloudHSM, ejecuta el siguiente comando:

    /opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class ec-private --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true sign=true

    Nota: Debes usar --key-type-class ec-private para desempaquetar las claves EC. Según cómo uses las claves, utiliza --attributes para asignar los atributos de estas.

Información relacionada

Mecanismos compatibles con la biblioteca PKCS #11 para el SDK 5 del cliente de AWS CloudHSM

OFICIAL DE AWSActualizada hace 10 meses