Quiero usar AWS 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 accedan 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 usa este par de claves para generar un archivo de firma, el archivo se crea de acuerdo con la norma 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 usar OpenSSL para verificar la firma.
Para obtener el formato de firma para los pares de claves RSA, consulte las especificaciones de claves RSA para la firma y la verificación.
Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Solución de problemas de AWS CLI. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.
Firma de un archivo local
Después de crear la clave asimétrica de AWS KMS en su cuenta de AWS, utilice la AWS CLI para hacer referencia a la clave cuando firme un archivo. La respuesta que recibe de la API de AWS KMS está codificada en base64. En el ejemplo siguiente, se usa el parámetro --query para obtener el valor de la firma de la respuesta y colocarlo 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 B. Para firmar un mensaje más grande, genere un resumen de hash del mensaje. A continuación, proporcione el resumen de hash en el parámetro del mensaje. Para mostrar si el mensaje es un mensaje completo o un resumen, utilice el parámetro MessageType. Tenga en cuenta el algoritmo de firma para verificar la firma más adelante.
Como la firma está en formato base64, ejecute el siguiente comando de codificación en base64 de Linux para convertir el formato a binario:
[ec2-user@ip-172-31-23-22 ~]$ base64 -d sign.b64 > sign.bin
Ejecute el siguiente comando para decodificar los archivos base64 para el sistema operativo (SO) Windows:
certutil -decode C:\Temp\sign.b64 C:\Temp\sign.bin
Ahora puede compartir el archivo de firma sign.b64.
Verificación de la firma de AWS KMS
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:
[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
Ejecute el siguiente comando para convertir el archivo base64 en un archivo con codificación DER denominado KMSPublic.key:
[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:
[ec2-user@ip-172-31-23-22 ~]$ openssl dgst -sha256 -verify KMSPublic.key -keyform DER -signature sign.bin message.txtVerified OK
La verificación se realiza correctamente cuando el resultado muestra «Verificado como correcto».
Si no recibe una respuesta de verificación, compruebe lo siguiente:
- El algoritmo de firma de OpenSSL es el mismo que usó para firmar el archivo.
- Sus archivos no están codificados en base64.
Información relacionada
Primitivas criptográficas
Conceptos de AWS KMS