Quero usar o AWS Key Management Service (AWS KMS) para assinar um arquivo. Em seguida, quero compartilhar o arquivo, sua assinatura e a chave pública para verificar se a assinatura é válida. Não quero fornecer acesso à API para que os usuários acessem minha chave do AWS KMS.
Resolução
O exemplo a seguir usa o AWS KMS com um par de chaves assimétricas ECC_NIST_P256 (secp256r1). Quando o AWS KMS usa esse par de chaves para gerar um arquivo de assinatura, o arquivo é criado de acordo com o NIST FIPS 168-4. Uma assinatura digital ECDSA que contém valores (r, s) é gerada conforme especificado na ANS X9.62. Por causa do padrão aberto, é possível usar o OpenSSL para verificar a assinatura.
Para obter o formato de assinatura para pares de chaves RSA, consulte as especificações de chaves RSA para assinatura e verificação.
Observação: Se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
Assinar um arquivo local
Depois de criar a chave assimétrica do AWS KMS em sua conta da AWS, use a AWS CLI para se referir à chave ao assinar um arquivo. A resposta que você recebe da API do AWS KMS é codificada em base64. O exemplo a seguir usa o parâmetro --query para obter o valor da assinatura da resposta e colocá-lo no arquivo sign.b64:
[ec2-user@ip-172-31-23-22 ~]$ aws kms sign --key-id arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab --message fileb://message.txt --signing-algorithm ECDSA_SHA_256 --query 'Signature' --output text > sign.b64
Observação: É possível enviar mensagens de até 4096 B. Para assinar uma mensagem maior, gere um resumo em hash da mensagem. Em seguida, forneça o resumo do hash no parâmetro da mensagem. Para mostrar se a mensagem é completa ou resumida, use o parâmetro MessageType. Observe o algoritmo de assinatura para verificar a assinatura posteriormente.
Como a assinatura está no formato base64, execute o seguinte comando de codificação Linux base64 para converter o formato em binário:
[ec2-user@ip-172-31-23-22 ~]$ base64 -d sign.b64 > sign.bin
Execute o seguinte comando para decodificar arquivos base64 para o sistema operacional (SO) Windows:
certutil -decode C:\Temp\sign.b64 C:\Temp\sign.bin
Agora é possível compartilhar o arquivo de assinatura sign.b64.
Verifique a assinatura do AWS KMS
Para verificar o arquivo de assinatura, você deve ter a chave pública. Para obter a chave pública, execute o comando get-public-key da AWS CLI:
[ec2-user@ip-172-31-23-22 ~]$ aws kms get-public-key --key-id arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab --output text --query 'PublicKey' > KMSPublic.b64
Execute o comando a seguir para converter o arquivo base64 em um arquivo codificado em DER chamado KMSPublic.key:
[ec2-user@ip-172-31-23-22 ~]$ base64 -d KMSPublic.b64 > KMSPublic.key
Agora você tem a chave pública e a assinatura em formato binário com o arquivo message.txt.
Para verificar a assinatura, execute o comando dgst do OpenSSL:
[ec2-user@ip-172-31-23-22 ~]$ openssl dgst -sha256 -verify KMSPublic.key -keyform DER -signature sign.bin message.txtVerified OK
A verificação é bem-sucedida quando a saída mostra “Verificado OK”.
Se você não receber uma resposta de verificação, verifique o seguinte:
- O algoritmo de assinatura do OpenSSL é o mesmo usado para assinar o arquivo.
- Seus arquivos não são codificados em base64.
Informações relacionadas
Primitivas criptográficas
Conceitos do AWS KMS