

# Verifique o documento de identidade de uma instância do Amazon EC2
<a name="verify-iid"></a>

Se você pretende usar o conteúdo do documento de identidade da instância para um propósito importante, deve verificar seu conteúdo e autenticidade antes de usá-lo.

O documento de identidade da instância de texto simples é acompanhado por três assinaturas hash e criptografadas. É possível usar essas assinaturas para verificar a origem e a autenticidade do documento de identidade da instância e as informações incluídas nele. São fornecidas as seguintes assinaturas:
+ Assinatura codificada em base64 – trata-se de um hash SHA256 codificado em base64 do documento de identidade da instância que é criptografado usando um par de chaves RSA.
+ Assinatura PKCS7 – trata-se de um hash SHA1 do documento de identidade da instância que é criptografado usando um par de chaves DSA.
+ Assinatura RSA-2048 – trata-se de um hash SHA256 do documento de identidade da instância que é criptografado usando um par de chaves RSA-2048.

Cada assinatura está disponível em um endpoint diferente nos metadados da instância. É possível usar qualquer uma dessas assinaturas dependendo dos requisitos de hash e criptografia. Para verificar as assinaturas, é necessário usar o certificado público da AWS correspondente.

**Contents**
+ [Opção 1: verificar o documento de identidade da instância usando a assinatura PKCS7](#verify-pkcs7)
+ [Opção 2: verificar o documento de identidade da instância usando a assinatura codificada em base64](#verify-signature)
+ [Opção 3: verificar o documento de identidade da instância usando a assinatura RSA-2048](#verify-rsa2048)

## Opção 1: verificar o documento de identidade da instância usando a assinatura PKCS7
<a name="verify-pkcs7"></a>

Este tópico explica como verificar o documento de identidade da instância usando a assinatura PKCS7 e o certificado público DSA da AWS.

### Instâncias do Linux
<a name="verify-pkcs7-linux"></a>

**Para verificar o documento de identidade da instância usando a assinatura PKCS7 e o certificado público AWS DSA**

1. Conecte-se à instância.

1. Recupere a assinatura PKCS7 dos metadados da instância e adicione-a a um arquivo chamado `pkcs7` junto com o cabeçalho e rodapé necessários. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

------
#### [ IMDSv2 ]

   ```
   $ echo "-----BEGIN PKCS7-----" >> pkcs7 \
   	&& TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
   	&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/pkcs7 >> pkcs7 \
   	&& echo "" >> pkcs7 \
   	&& echo "-----END PKCS7-----" >> pkcs7
   ```

------
#### [ IMDSv1 ]

   ```
   $ echo "-----BEGIN PKCS7-----" >> pkcs7 \
   	&& curl -s http://169.254.169.254/latest/dynamic/instance-identity/pkcs7 >> pkcs7 \
   	&& echo "" >> pkcs7 \
   	&& echo "-----END PKCS7-----" >> pkcs7
   ```

------

1. Encontre o certificado público **DSA** da sua região em [Certificados públicos da AWS para assinaturas de documento de identidade da instância](regions-certs.md) e adicione o conteúdo a um novo arquivo chamado `certificate`.

1. Use o comando **OpenSSL smime** para verificar a assinatura. Inclua a opção `-verify` para indicar que a assinatura precisa ser verificada, e a opção `-noverify` para indicar que o certificado não precisa ser verificado.

   ```
   $ openssl smime -verify -in pkcs7 -inform PEM -certfile certificate -noverify | tee document
   ```

   Se a assinatura for válida, a mensagem `Verification successful` será exibida.

   O comando também grava o conteúdo do documento de identidade da instância em um novo arquivo denominado `document`. É possível comparar o conteúdo do documento de identidade da instância dos metadados da instância com o conteúdo desse arquivo usando os comandos a seguir.

   ```
   $ openssl dgst -sha256 < document
   ```

   ```
   $ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document | openssl dgst -sha256
   ```

    Se não for possível verificar a assinatura, entre em contato com o Suporte.

### Instâncias do Windows
<a name="verify-pkcs7-windows"></a>

**Pré-requisitos**  
Este procedimento exige a classe `System.Security` Microsoft .NET Core. Para adicionar a classe à sessão do PowerShell, execute o comando a seguir.

```
PS C:\> Add-Type -AssemblyName System.Security
```

**nota**  
O comando adiciona a classe somente à sessão atual do PowerShell. Se você iniciar uma nova sessão, deverá executar o comando novamente.

**Para verificar o documento de identidade da instância usando a assinatura PKCS7 e o certificado público AWS DSA**

1. Conecte-se à instância.

1. Recupere a assinatura PKCS7 dos metadados da instância, converta-a em uma matriz de bytes e adicione-a a uma variável chamada `$Signature`. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

------
#### [ IMDSv2 ]

   ```
   PS C:\> [string]$token = (Invoke-WebRequest -Method Put -Headers @{'X-aws-ec2-metadata-token-ttl-seconds' = '21600'} -Uri http://169.254.169.254/latest/api/token).Content
   ```

   ```
   PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} -Uri http://169.254.169.254/latest/dynamic/instance-identity/pkcs7).Content)
   ```

------
#### [ IMDSv1 ]

   ```
   PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest -Uri http://169.254.169.254/latest/dynamic/instance-identity/pkcs7).Content)
   ```

------

1. Recupere o documento de identidade da instância de texto simples dos metadados da instância, converta-o em uma matriz de bytes e adicione-o a uma variável chamada `$Document`. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

------
#### [ IMDSv2 ]

   ```
   PS C:\> $Document = [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} -Uri http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
   ```

------
#### [ IMDSv1 ]

   ```
   PS C:\> $Document =  [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
   ```

------

1. Encontre o certificado público **DSA** da sua região em [Certificados públicos da AWS para assinaturas de documento de identidade da instância](regions-certs.md) e adicione o conteúdo a um novo arquivo chamado `certificate.pem`.

1. Extraia o certificado do arquivo de certificado e armazene-o em uma variável chamada `$Store`.

   ```
   PS C:\> $Store = [Security.Cryptography.X509Certificates.X509Certificate2Collection]::new([Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path certificate.pem)))
   ```

1. Verifique a assinatura.

   ```
   PS C:\> $SignatureDocument = [Security.Cryptography.Pkcs.SignedCms]::new()
   ```

   ```
   PS C:\> $SignatureDocument.Decode($Signature)
   ```

   ```
   PS C:\> $SignatureDocument.CheckSignature($Store, $true)
   ```

   Se a assinatura for válida, o comando não retornará nenhuma saída. Se não for possível verificar a assinatura, o comando retornará `Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer`. Se não for possível verificar a assinatura, entre em contato com o AWS Support.

1. Valide o conteúdo do documento de identidade da instância.

   ```
   PS C:\> [Linq.Enumerable]::SequenceEqual($SignatureDocument.ContentInfo.Content, $Document)
   ```

   Se o conteúdo do documento de identidade da instância for válido, o comando retornará `True`. Se o documento de identidade da instância não puder ser validado, entre em contato com o AWS Support.

## Opção 2: verificar o documento de identidade da instância usando a assinatura codificada em base64
<a name="verify-signature"></a>

Este tópico explica como verificar o documento de identidade da instância usando a assinatura codificada em base64 e o certificado público RSA da AWS.

### Instâncias do Linux
<a name="verify-signature-linux"></a>

**Para validar o documento de identidade da instância usando a assinatura codificada em base64 e do certificado público RSA da AWS**

1. Conecte-se à instância.

1. Recupere a assinatura codificada em base64 dos metadados da instância, converta-a em binário e adicione-o a um arquivo chamado `signature`. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

------
#### [ IMDSv2 ]

   ```
   $ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
   	&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/signature | base64 -d >> signature
   ```

------
#### [ IMDSv1 ]

   ```
   $ curl -s http://169.254.169.254/latest/dynamic/instance-identity/signature | base64 -d >> signature
   ```

------

1. Recupere o documento de identidade da instância de texto simples dos metadados da instância e adicione-o a um arquivo chamado `document`. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

------
#### [ IMDSv2 ]

   ```
   $ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
   	&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document >> document
   ```

------
#### [ IMDSv1 ]

   ```
   $ curl -s http://169.254.169.254/latest/dynamic/instance-identity/document >> document
   ```

------

1. Encontre o certificado público **RSA** para a sua região em [Certificados públicos da AWS para assinaturas de documento de identidade da instância](regions-certs.md) e adicione o conteúdo a um novo arquivo denominado `certificate`.

1. Extraia a chave pública do certificado público RSS da AWS e salve-a em um arquivo denominado `key`. 

   ```
   $ openssl x509 -pubkey -noout -in certificate >> key
   ```

1. Use o comando **OpenSSL dgst** para verificar o documento de identidade da instância.

   ```
   $ openssl dgst -sha256 -verify key -signature signature document
   ```

   Se a assinatura for válida, a mensagem `Verification successful` será exibida.

   O comando também grava o conteúdo do documento de identidade da instância em um novo arquivo denominado `document`. É possível comparar o conteúdo do documento de identidade da instância dos metadados da instância com o conteúdo desse arquivo usando os comandos a seguir.

   ```
   $ openssl dgst -sha256 < document
   ```

   ```
   $ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document | openssl dgst -sha256
   ```

    Se não for possível verificar a assinatura, entre em contato com o Suporte.

### Instâncias do Windows
<a name="verify-signature-windows"></a>

**Para validar o documento de identidade da instância usando a assinatura codificada em base64 e do certificado público RSA da AWS**

1. Conecte-se à instância.

1. Recupere a assinatura codificada em base64 dos metadados da instância, converta-a em uma matriz de bytes e adicione-a à variável chamada `$Signature`. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

------
#### [ IMDSv2 ]

   ```
   PS C:\> [string]$token = (Invoke-WebRequest -Method Put -Headers @{'X-aws-ec2-metadata-token-ttl-seconds' = '21600'} http://169.254.169.254/latest/api/token).Content
   ```

   ```
   PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} http://169.254.169.254/latest/dynamic/instance-identity/signature).Content)
   ```

------
#### [ IMDSv1 ]

   ```
   PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/signature).Content)
   ```

------

1. Recupere o documento de identidade da instância de texto simples dos metadados da instância, converta-o em uma matriz de bytes e adicione-o a uma variável chamada `$Document`. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

------
#### [ IMDSv2 ]

   ```
   PS C:\> $Document = [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
   ```

------
#### [ IMDSv1 ]

   ```
   PS C:\> $Document =  [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
   ```

------

1. Encontre o certificado público **RSA** para a sua região em [Certificados públicos da AWS para assinaturas de documento de identidade da instância](regions-certs.md) e adicione o conteúdo a um novo arquivo denominado `certificate.pem`.

1. Verifique o documento de identidade da instância.

   ```
   PS C:\> [Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path certificate.pem)).PublicKey.Key.VerifyData($Document, 'SHA256', $Signature)
   ```

   Se a assinatura for válida, o comando retornará `True`. Se não for possível verificar a assinatura, entre em contato com o Suporte.

## Opção 3: verificar o documento de identidade da instância usando a assinatura RSA-2048
<a name="verify-rsa2048"></a>

Este tópico explica como verificar o documento de identidade da instância usando a assinatura RSA-2048 e o certificado público RSA-2048 da AWS.

### Instâncias do Linux
<a name="verify-rsa2048-linux"></a>

**Para verificar o documento de identidade da instância usando a assinatura RSA-2048 e o certificado público RSA-2048 da AWS**

1. Conecte-se à instância.

1. Recupere a assinatura RSA-2048 dos metadados da instância e adicione-a a um novo arquivo chamado `rsa2048` junto com o cabeçalho e rodapé necessários. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

------
#### [ IMDSv2 ]

   ```
   $ echo "-----BEGIN PKCS7-----" >> rsa2048 \
   	&& TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
   	&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/rsa2048 >> rsa2048 \
   	&& echo "" >> rsa2048 \
   	&& echo "-----END PKCS7-----" >> rsa2048
   ```

------
#### [ IMDSv1 ]

   ```
   $ echo "-----BEGIN PKCS7-----" >> rsa2048 \
   	&& curl -s http://169.254.169.254/latest/dynamic/instance-identity/rsa2048 >> rsa2048 \
   	&& echo "" >> rsa2048 \
   	&& echo "-----END PKCS7-----" >> rsa2048
   ```

------

1. Encontre o certificado público **RSA-2048** para a sua região em [Certificados públicos da AWS para assinaturas de documento de identidade da instância](regions-certs.md) e adicione o conteúdo a um novo arquivo denominado `certificate`.

1. Use o comando **OpenSSL smime** para verificar a assinatura. Inclua a opção `-verify` para indicar que a assinatura precisa ser verificada, e a opção `-noverify` para indicar que o certificado não precisa ser verificado.

   ```
   $ openssl smime -verify -in rsa2048 -inform PEM -certfile certificate -noverify | tee document
   ```

   Se a assinatura for válida, a mensagem `Verification successful` será exibida. Se não for possível verificar a assinatura, entre em contato com o Suporte.

### Instâncias do Windows
<a name="verify-rsa2048-windows"></a>

**Pré-requisitos**  
Este procedimento exige a classe `System.Security` Microsoft .NET Core. Para adicionar a classe à sessão do PowerShell, execute o comando a seguir.

```
PS C:\> Add-Type -AssemblyName System.Security
```

**nota**  
O comando adiciona a classe somente à sessão atual do PowerShell. Se você iniciar uma nova sessão, deverá executar o comando novamente.

**Para verificar o documento de identidade da instância usando a assinatura RSA-2048 e o certificado público RSA-2048 da AWS**

1. Conecte-se à instância.

1. Recupere a assinatura RSA-2048 dos metadados da instância, converta-a em uma matriz de bytes e adicione-a a uma variável chamada `$Signature`. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

------
#### [ IMDSv2 ]

   ```
   PS C:\> [string]$token = (Invoke-WebRequest -Method Put -Headers @{'X-aws-ec2-metadata-token-ttl-seconds' = '21600'} http://169.254.169.254/latest/api/token).Content
   ```

   ```
   PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} http://169.254.169.254/latest/dynamic/instance-identity/rsa2048).Content)
   ```

------
#### [ IMDSv1 ]

   ```
   PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/rsa2048).Content)
   ```

------

1. Recupere o documento de identidade da instância de texto simples dos metadados da instância, converta-o em uma matriz de bytes e adicione-o a uma variável chamada `$Document`. Use um dos comandos a seguir dependendo da versão do IMDS usada pela instância.

------
#### [ IMDSv2 ]

   ```
   PS C:\> $Document = [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest -Headers @{'X-aws-ec2-metadata-token' = $Token} http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
   ```

------
#### [ IMDSv1 ]

   ```
   PS C:\> $Document =  [Text.Encoding]::UTF8.GetBytes((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/document).Content)
   ```

------

1. Encontre o certificado público **RSA-2048** para a sua região em [Certificados públicos da AWS para assinaturas de documento de identidade da instância](regions-certs.md) e adicione o conteúdo a um novo arquivo denominado `certificate.pem`.

1. Extraia o certificado do arquivo de certificado e armazene-o em uma variável chamada `$Store`.

   ```
   PS C:\> $Store = [Security.Cryptography.X509Certificates.X509Certificate2Collection]::new([Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path certificate.pem)))
   ```

1. Verifique a assinatura.

   ```
   PS C:\> $SignatureDocument = [Security.Cryptography.Pkcs.SignedCms]::new()
   ```

   ```
   PS C:\> $SignatureDocument.Decode($Signature)
   ```

   ```
   PS C:\> $SignatureDocument.CheckSignature($Store, $true)
   ```

   Se a assinatura for válida, o comando não retornará nenhuma saída. Se não for possível verificar a assinatura, o comando retornará `Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer`. Se não for possível verificar a assinatura, entre em contato com o AWS Support.

1. Valide o conteúdo do documento de identidade da instância.

   ```
   PS C:\> [Linq.Enumerable]::SequenceEqual($SignatureDocument.ContentInfo.Content, $Document)
   ```

   Se o conteúdo do documento de identidade da instância for válido, o comando retornará `True`. Se o documento de identidade da instância não puder ser validado, entre em contato com o AWS Support.