¿Cómo puedo verificar las firmas generadas por las claves asimétricas de AWS KMS?

Última actualización: 04-08-2022

Quiero usar Key Management Service (AWS KMS) para firmar un archivo. A continuación, quiero compartir el archivo, su firma y la clave pública para comprobar que la firma es válida. No quiero proporcionar acceso a la API para que los usuarios puedan acceder a mi clave de AWS KMS.

Resolución

El siguiente ejemplo usa AWS KMS con un par de claves asimétricas ECC_NIST_P256 (secp256r1). Cuando AWS KMS genera un archivo de firma con este par de claves, se crea de acuerdo con NIST FIPS 168-4. Se genera una firma digital ECDSA que contiene valores (r, s) como se especifica en ANS X9.62. Debido al estándar abierto, puede verificar esta firma con OpenSSL.

Para obtener el formato de firma de los pares de claves RSA, siga las instrucciones para crear y administrar las claves de AWS KMS.

Nota: Si se producen errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), asegúrese de que utiliza la versión más reciente de la AWS CLI.

Firmar un archivo local con AWS KMS

Después de crear el par de claves de AWS KMS en su cuenta, consulte el par de claves mediante la AWS CLI para firmar un archivo. La respuesta recibida de la API de AWS KMS está codificada en Base64. El siguiente ejemplo usa el parámetro --query para obtener el valor de firma de la respuesta y lo coloca en el archivo 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

Nota: Puede enviar mensajes de hasta 4096 bytes. Para firmar un mensaje más grande, genere un resumen hash del mensaje. A continuación, proporcione el resumen de hash en el parámetro message. Para indicar si el mensaje es un mensaje completo o un resumen, utilice el parámetro MessageType. Asegúrese de tomar nota del algoritmo de firma, ya que es necesario para verificar la firma más adelante.

Como la firma está en formato Base64, puede convertirla a formato binario mediante un comando base64 para codificar de Linux similar al siguiente:

[ec2-user@ip-172-31-23-22 ~]$ base64 -d sign.b64 > sign.bin

Para decodificar archivos Base64 para el sistema operativo Windows, ejecute el siguiente comando:

certutil -decode C:\Temp\sign.b64 C:\Temp\sign.bin

Verificar la firma de AWS KMS mediante OpenSSL

Ahora puede compartir el archivo de firma sign.b64. Para verificar el archivo de firma, debe tener la clave pública. Para obtener la clave pública, ejecute el comando get-public-key de la AWS CLI de manera similar a la siguiente:

[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

Para convertir el archivo base64 a la codificación DER con otro archivo denominado KMSPublic.key, ejecute el siguiente comando:

[ec2-user@ip-172-31-23-22 ~]$ base64 -d KMSPublic.b64 > KMSPublic.key

Ahora tiene la clave pública y la firma en formato binario con el archivo message.txt. Para verificar la firma, ejecute el comando dgst de OpenSSL de forma similar a la siguiente:

[ec2-user@ip-172-31-23-22 ~]$ openssl dgst -sha256 -verify KMSPublic.key -keyform DER -signature sign.bin message.txt
Verified OK

Este resultado de ejemplo de “Verified OK” (Verificación realizada correctamente) indica que la verificación se ha realizado con éxito.

Si no recibió una respuesta de verificación, asegúrese de lo siguiente:

  • El algoritmo de firma OpenSSL es el mismo que se usó para firmar el archivo.
  • Tus archivos no están codificados en Base64.

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?