Como posso transferir minhas chaves com segurança para o CloudHSM com o OpenSSL e a ferramenta de linha de comando key_mgmt_util?

8 minuto de leitura
0

Quero importar chaves locais para o AWS CloudHSM usando o comando unWrapKey com a ferramenta de linha de comando key_mgmt_util. No entanto, não consigo importar ou envolver chaves de texto simples.

Resolução

Criptografe sua chave de carga útil com uma chave AES efêmera. Criptografe a AES efêmera com sua chave pública de um par de chaves. Em seguida, concatene a chave de carga útil criptografada e a chave efêmera criptografada em um único arquivo. O arquivo concatenado é enviado ao CloudHSM em seu formato criptografado e descriptografado pela chave privada do par de chaves. O mecanismo AES_KEY_WRAP decodifica a chave AES efêmera e a usa para descriptografar sua chave de carga útil.

Crie estas chaves:

  • Chave AES ou RSA de carga útil. Essa é a chave que você importa e usa com seu CloudHSM.
  • Chave AES temporária exigida pelo AES_KEY_WRAP para criptografar a carga útil. Esta é uma prática recomendada para usar a AES porque não há limites de tamanho do que pode ser criptografado.
  • Par de chaves RSA usado para envolver e desempacotar com segurança essas chaves em seu CloudHSM.

Antes de começar, verifique se há uma versão corrigida do OpenSSL para permitir que envelopes sejam envolvidos. Obtenha instruções consultando Como posso corrigir o OpenSSL para ativar o uso com o mecanismo CKM_RSA_AES_KEY_WRAP do CloudHSM?

Crie, criptografe e importe as chaves locais

1.    Execute esses comandos para criar as chaves de carga útil, efêmeras e RSA.

Dica: crie essas chaves em seu próprio diretório para rastrear seus arquivos.

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.    Crie valores hexadecimais brutos da chave AES efêmera em uma variável com esse comando.

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

Observação: verifique se o utilitário hexdump está instalado, ou o comando retornará um erro. Consulte a documentação do sistema operacional sobre como instalar o utilitário hexdump.

3.    Use o comando OpenSSL enc para envolver a carga útil com a chave AES efêmera. A cifra -id-aes256-wrap-pad é o mecanismo de envolvimento compatível com RFC 3394 que coincide com CKM_RSA_AES_KEY_WRAP. Os valores -iv são definidos por RFC 5649 (uma extensão de RFC 3394).

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

4.    Criptografe a chave AES com a chave pública do par de chaves RSA criada na etapa 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.    Na máquina local, concatene a chave de carga útil criptografada e a chave AES efêmera em um único arquivo chamado rsa_aes_wrapped.

cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped

6.    Importe a chave privada RSA para o CloudHSM de sua máquina local. Crie uma chave AES persistente no HSM para gerenciar a importação usando importPrivateKey.

Observação: substitua o nome de usuário e a senha do usuário pelo nome de usuário e senha do CloudHSM.

Observação: se você criou o par de chaves RSA no HSM e exportou a chave pública usando exportPubKey, pule as etapas de 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

Aviso: o comando registra detalhes do nome de usuário e senha localmente. Após transferir suas chaves, a prática recomendada é alterar sua senha. Em vez de especificar a senha do criptousuário, também é possível escrever um script de shell para evitar que a senha seja registrada no histórico do shell. Esse script de shell receberá todos os argumentos de key_mgmt_util e os enviará para esse comando. Isso possibilitará o uso do script de shell para executar o comando anterior, e também os seguintes comandos key_mgmt_util.

7.    Você receberá uma saída como esta. Observe o identificador de chave AES, ele é usado para importar a chave RSA privada. Neste exemplo, o identificador de chave é 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 a chave privada e a envolva no HSM. A importação é protegida com a chave AES persistente criada na etapa 6. Observação: substitua a opção -w 7 pelo identificador de chave.

/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.    Você receberá uma saída como esta. Observe o identificador de chave privada RSA importada. Neste exemplo, a chave privada RSA importada é 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.    Desempacote a chave de carga útil concatenada no HSM usando a chave privada RSA importada com o comando unWrapKey. Este exemplo usa -w 8 como o identificador de chave da chave privada RSA importada.

Observação: substitua -w 8 pelo identificador de chave 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

Observação: use -kc 4 -kt 31 para desempacotar chaves AES e -kc 3 -kt 0 para desempacotar chaves privadas RSA. Obtenha mais informações sobre como usar os parâmetros -m, -kc e -kt consultando o exemplo de unWrapKey.

11.    Você receberá uma importação bem-sucedida da chave AES de carga útil como esta saída:

Observação: neste exemplo, é possível usar o identificador de chave 10 da nova chave desempacotada no 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

Verifique se a chave AES de carga útil foi importada

1.    Exporte a chave AES de carga útil de volta para o disco usando a chave de envolvimento -w 7. Substitua o identificador de chave de carga útil 10 pelo seu próprio valor da chave AES de carga útil 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.    Execute este comando para comparar a chave de carga útil importada com a chave payload_aes.

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

3.    Se as chaves HSM.key e payload_aes forem idênticas, você receberá esta saída:

Files HSM.key and payload_aes are identical

Importe a carga útil RSA

1.    Se quiser desempacotar uma chave privada RSA no HSM, execute estes comandos para alterar a chave de carga útil para uma chave 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.    As chaves RSA criadas na etapa 1 da seção Etapas necessárias para importar carga útil RSA usando o OpenSSL estão no formato PKCS #1. No entanto, a ferramenta key_mgmt_util pressupõe que a chave privada está no formato PKCS #8 DER. Visualize as chaves em texto simples usando o editor de texto de sua preferência para confirmar o formato como este:

  • Formato PKCS1: -----INICIAR CHAVE PRIVADA RSA----- – Formato PKCS8: -----INICIAR CHAVE PRIVADA-----

3.    Converta a chave payload_rsa.pem para o formato pkcs8 e codificação DER executando este comando:

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

4.    Siga as etapas de 2 a 9 da seção Criar, criptografar e importar as chaves locais.

Observação: substitua payload_aes por payload_rsa_pkcs8.der.

5.    Execute este comando para desempacotar a chave privada RSA de carga útil no CloudHSM e observe o identificador de chave de saída:

/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

Observação: use -kc 4 -kt 31 para desempacotar chaves AES e -kc 3 -kt 0 para desempacotar chaves privadas RSA.

A chave RSA de carga útil é desempacotada no HSM.

Verifique se a chave privada RSA de carga útil foi importada

1.    Exporte a chave privada RSA de carga útil de volta para o disco usando a chave de envolvimento criada anteriormente. Substitua o identificador de chave de carga útil 25 pelo seu próprio valor da chave privada RSA de carga útil 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.    Execute esse comando para converter sua chave payload_rsa para o formato PKCS #8 sem converter para DER.

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

3.    Execute esse comando para comparar a chave de carga útil importada com a chave payload_rsa.

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

4.    Se as chaves HSM_rsa_private.key e payload_rsa_pkcs8.pem forem idênticas, você receberá esta saída:

Files HSM_rsa_private.key and payload_rsa_pkcs8.pem are identical

Informações relacionadas

Mecanismos compatíveis com PKCS #11

OpenSSL

Requisito de Oasis com a especificação PKCS #11

RFC 3394

RFC 5649

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos