AWS KMS

Documentação AWS:

KMS:

https://docs.aws.amazon.com/cli/latest/reference/kms/index.html

Geração da chave:

https://docs.aws.amazon.com/cli/latest/reference/kms/create-key.html

Obter chave pública:

https://docs.aws.amazon.com/cli/latest/reference/kms/get-public-key.html

Assinatura:

https://docs.aws.amazon.com/cli/latest/reference/kms/sign.html

Chave privada

Gerar chave RSA 2048 bits:

aws kms create-key --description "cert1" --key-usage SIGN_VERIFY --customer-master-key-spec RSA_2048

Resultado esperado:

{
    "KeyMetadata": {
    "AWSAccountId": "<ID da conta AWS>" ,
    "KeyId": "<ID da chave>" ,
    "Arn": "arn:aws:kms: <regiao>:<ID da conta AWS>:key/<ID da chave>",
    "CreationDate": 1654625481.9,
    "Enabled": true,
    "Description": "cert1",
    "KeyUsage": "SIGN_VERIFY",
    "KeyState": "Enabled",
    "Origin": "AWS_KMS",
    "KeyManager": "CUSTOMER",
    "CustomerMasterKeySpec": "RSA_2048",
    "SigningAlgorithms": [
        "RSASSA_PKCS1_V1_5_SHA_256",
        "RSASSA_PKCS1_V1_5_SHA_384",
        "RSASSA_PKCS1_V1_5_SHA_512",
        "RSASSA_PSS_SHA_256",
        "RSASSA_PSS_SHA_384",
        "RSASSA_PSS_SHA_512"
    ]
  }
}

Assinar termo digital

AWS KMS espera o DIGEST puro a ser assinado, então é preciso extrair essa informação a partir da estrutura PKCS#1 do arquivo digitalterm_hash.bin

Extrair o hash/digest puro do PKCS#1:

openssl asn1parse -inform der -in digitalterm_hash.bin

Resultado esperado:

0:d=0 hl=2 l= 47 cons:
2:d=1 hl=2 l= 11 cons: SEQUENCE
4:d=2 hl=2 l= 9 prim: OBJECT :sha256
15:d=1 hl=2 l= 32 prim: OCTET STRING [HEX
DUMP]:458A364F84551E45D29B9F2168ED9F2F7347A7ECADBA153C5D47A1150C6662E9

Salve o HEX DUMP em um arquivo hash.hex e depois converta de hexadecimal para binário hash.bin

Assinar usando chave privada AWS KMS:

aws kms sign --key-id "<ID da chave>" --message fileb://hash.bin --signing-algorithm 
RSASSA_PKCS1_V1_5_SHA_256 --message-type DIGEST

Requisição (CSR)

Gere o CSR na sua aplicação, que fará uso da chave no AWS KMS.

Se a aplicação não der suporte à geração do CSR, gere um CSR no OpenSSL com uma chave qualquer (RSA 2048). Então substitua no CSR a chave pública inserindo a do AWS KMS, e faça nova assinatura do CSR usando a chave privada no AWS KMS.

Essa é uma operação complexa. Recomendamos o uso de um script que faça esse trabalho, como o disponível neste repositório: https://github.com/g-a-d/aws-kms-sign-csr

Mas se preferir o método manual, alguns comandos que podem ser úteis no processo:

Obter a chave pública:

aws kms get-public-key --output text --query PublicKey --key-id "<ID da chave>" > chave_publica_base64

Converta de base64 para formato DER:

base64 --decode chave_publica_base64 > pub_key_der

Faça a conversão para o formato esperado pelo OpenSSL:

openssl rsa -pubin -pubout -inform der -in pub_key_der -out pub_key

Assinar usando chave privada AWS KMS:

$ aws kms sign --key-id "<ID da chave>" --message

fileb://csr_to_be_signed_der --signing-algorithm

RSASSA_PKCS1_V1_5_SHA_256 --message-type RAW

Last updated