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
Importante: É um repositório público, utilize somente após verificar o código e atestar que é seguro para a sua operação.
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