

# Verifique el documento de identidad de instancia para una instancia de Amazon EC2
<a name="verify-iid"></a>

Si tiene la intención de utilizar el contenido del Documentos de identidad de instancia para un propósito importante, debe verificar su contenido y autenticidad antes de usarlo.

El Documentos de identidad de instancia de texto sin formato se acompaña de tres firmas resumidas y cifradas. Puede utilizar estas firmas para verificar el origen y la autenticidad del Documentos de identidad de instancia y la información que incluye. Se proporcionan las siguientes firmas:
+ Firma codificada en base64: este es un hash SHA256 codificado en base64 del Documentos de identidad de instancia cifrado mediante un par de claves RSA.
+ Firma PKCS7: este es un hash SHA1 del Documentos de identidad de instancia cifrado mediante un par de claves DSA.
+ Firma RSA-2048: este es un hash SHA256 del Documentos de identidad de instancia cifrado utilizando un par de claves RSA-2048.

Cada firma está disponible en un punto de conexión diferente en los metadatos de la instancia. Puede usar cualquiera de estas firmas dependiendo de sus requisitos de cifrado y hash. Para verificar las firmas, debe usar el correspondiente certificado público de AWS.

**Contents**
+ [Opción 1: verificar el documento de identidad de instancia mediante la firma PKCS7](#verify-pkcs7)
+ [Opción 2: verificar el documento de identidad de instancia mediante la firma codificada en base64](#verify-signature)
+ [Opción 3: verificar el documento de identidad de instancia mediante la firma RSA-2048](#verify-rsa2048)

## Opción 1: verificar el documento de identidad de instancia mediante la firma PKCS7
<a name="verify-pkcs7"></a>

En este tema, se explica cómo verificar el documento de identidad de la instancia mediante la firma PKCS7 y el certificado público DSA de AWS.

### Instancias de Linux
<a name="verify-pkcs7-linux"></a>

**Para verificar el documento de identidad de la instancia mediante la firma PKCS7 y el certificado público DSA de AWS**

1. Conéctese a la instancia.

1. Recupere la firma PKCS7 de los metadatos de la instancia y agréguela a un archivo nuevo denominado `pkcs7` junto con el encabezado y el pie de página requeridos. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

------
#### [ 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. Busque el certificado público **DSA** para su región en [Certificados públicos de AWS para las firmas del documento de identidad de la instancia](regions-certs.md) y agregue el contenido a un archivo nuevo denominado `certificate`.

1. Utilice el comando **openSSL smime** para verificar la firma. Incluya la opción `-verify` para indicar que es necesario verificar la firma, y la opción `-noverify` para indicar que no es necesario verificar el certificado.

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

   Si la firma es válida, aparecerá el mensaje `Verification successful`.

   El comando también escribe el contenido del documento de identidad de la instancia en un nuevo archivo llamado `document`. Puede comparar el contenido del documento de identidad de la instancia de los metadatos de la instancia con el contenido de este archivo mediante los siguientes comandos.

   ```
   $ 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
   ```

    Si no se puede verificar la firma, póngase en contacto con Soporte.

### instancias de Windows
<a name="verify-pkcs7-windows"></a>

**Requisitos previos**  
Este procedimiento requiere la clase Microsoft .NET Core de `System.Security`. Para agregar la clase a la sesión de PowerShell, ejecute el siguiente comando.

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

**nota**  
El comando agrega la clase solo a la sesión actual de PowerShell. Si inicia una nueva sesión, debe ejecutar el comando de nuevo.

**Para verificar el documento de identidad de la instancia mediante la firma PKCS7 y el certificado público DSA de AWS**

1. Conéctese a la instancia.

1. Recupere la firma PKCS7 de los metadatos de instancia, conviértala en una matriz de bytes y agréguela a una variable denominada `$Signature`. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

------
#### [ 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 el documento de identidad de instancia de texto sin formato de los metadatos de instancia, conviértalo en una matriz de bytes y agréguelo a una variable denominada `$Document`. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

------
#### [ 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. Busque el certificado público **DSA** para su región en [Certificados públicos de AWS para las firmas del documento de identidad de la instancia](regions-certs.md) y agregue el contenido a un archivo nuevo denominado `certificate.pem`.

1. Extraiga el certificado del archivo de certificado y guárdelo en una variable denominada `$Store`.

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

1. Verifique la firma.

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

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

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

   Si la firma es válida, el comando no devuelve ningún resultado. Si no se puede verificar la firma, el comando devuelve `Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer`. Si su firma no se puede verificar, póngase en contacto con AWS Support.

1. Valide el contenido del documento de identidad de instancia.

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

   Si el contenido del documento de identidad de instancia es válido, el comando devuelve `True`. Si el documento de identidad de la instancia no se puede validar, póngase en contacto con AWS Support.

## Opción 2: verificar el documento de identidad de instancia mediante la firma codificada en base64
<a name="verify-signature"></a>

En este tema, se explica cómo verificar el documento de identidad de la instancia mediante la firma codificada en base64 y el certificado público de RSA de AWS.

### Instancias de Linux
<a name="verify-signature-linux"></a>

**Para validar el documento de identidad de la instancia mediante la firma codificada en base64 y el certificado público del RSA de AWS**

1. Conéctese a la instancia.

1. Recupere la firma codificada en base64 de los metadatos de la instancia, conviértala a binario y agréguela a un archivo denominado `signature`. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

------
#### [ 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 el Documentos de identidad de instancia de texto sin formato de los metadatos de la instancia y agréguelo a un archivo denominado `document`. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

------
#### [ 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. Busque el certificado público **RSA** para su región en [Certificados públicos de AWS para las firmas del documento de identidad de la instancia](regions-certs.md) y agregue el contenido a un archivo nuevo denominado `certificate`.

1. Extraiga la clave pública del certificado público RSA de AWS y guárdela en un archivo denominado `key`.

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

1. Utilice el comando **OpenSSL dgst** para verificar el documento de identidad de instancia.

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

   Si la firma es válida, aparecerá el mensaje `Verification successful`.

   El comando también escribe el contenido del documento de identidad de la instancia en un nuevo archivo llamado `document`. Puede comparar el contenido del documento de identidad de la instancia de los metadatos de la instancia con el contenido de este archivo mediante los siguientes comandos.

   ```
   $ 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
   ```

    Si no se puede verificar la firma, póngase en contacto con Soporte.

### instancias de Windows
<a name="verify-signature-windows"></a>

**Para validar el documento de identidad de la instancia mediante la firma codificada en base64 y el certificado público del RSA de AWS**

1. Conéctese a la instancia.

1. Recupere la firma codificada en base64 de los metadatos de instancia, conviértala en una matriz de bytes y agréguela a la variable denominada `$Signature`. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

------
#### [ 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 el documento de identidad de instancia de texto sin formato de los metadatos de instancia, conviértalo en una matriz de bytes y agréguelo a una variable denominada `$Document`. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

------
#### [ 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. Busque el certificado público **RSA** para su región en [Certificados públicos de AWS para las firmas del documento de identidad de la instancia](regions-certs.md) y agregue el contenido a un archivo nuevo denominado `certificate.pem`.

1. Verifique el documento de identidad de la instancia.

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

   Si la firma es válida, el comando devuelve `True`. Si no se puede verificar la firma, póngase en contacto con Soporte.

## Opción 3: verificar el documento de identidad de instancia mediante la firma RSA-2048
<a name="verify-rsa2048"></a>

En este tema, se explica cómo verificar el documento de identidad de la instancia mediante la firma RSA-2048 y el certificado público RSA-2048 de AWS.

### Instancias de Linux
<a name="verify-rsa2048-linux"></a>

**Para verificar el documento de identidad de la instancia mediante la firma RSA-2048 y el certificado público RSA-2048 de AWS**

1. Conéctese a la instancia.

1. Recupere la firma RSA-2048 de los metadatos de la instancia y agréguela a un archivo denominado `rsa2048` junto con el encabezado y el pie de página requeridos. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

------
#### [ 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. Busque el certificado público **RSA-2048** para su región en [Certificados públicos de AWS para las firmas del documento de identidad de la instancia](regions-certs.md) y agregue el contenido a un archivo nuevo denominado `certificate`.

1. Utilice el comando **openSSL smime** para verificar la firma. Incluya la opción `-verify` para indicar que es necesario verificar la firma, y la opción `-noverify` para indicar que no es necesario verificar el certificado.

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

   Si la firma es válida, aparecerá el mensaje `Verification successful`. Si no se puede verificar la firma, póngase en contacto con Soporte.

### instancias de Windows
<a name="verify-rsa2048-windows"></a>

**Requisitos previos**  
Este procedimiento requiere la clase Microsoft .NET Core de `System.Security`. Para agregar la clase a la sesión de PowerShell, ejecute el siguiente comando.

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

**nota**  
El comando agrega la clase solo a la sesión actual de PowerShell. Si inicia una nueva sesión, debe ejecutar el comando de nuevo.

**Para verificar el documento de identidad de la instancia mediante la firma RSA-2048 y el certificado público RSA-2048 de AWS**

1. Conéctese a la instancia.

1. Recupere la firma RSA-2048 de los metadatos de instancia, conviértala en una matriz de bytes y agréguela a una variable denominada `$Signature`. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

------
#### [ 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 el documento de identidad de instancia de texto sin formato de los metadatos de instancia, conviértalo en una matriz de bytes y agréguelo a una variable denominada `$Document`. Utilice uno de los siguientes comandos dependiendo de la versión IMDS utilizada por la instancia.

------
#### [ 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. Busque el certificado público **RSA-2048** para su región en [Certificados públicos de AWS para las firmas del documento de identidad de la instancia](regions-certs.md) y agregue el contenido a un archivo nuevo denominado `certificate.pem`.

1. Extraiga el certificado del archivo de certificado y guárdelo en una variable denominada `$Store`.

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

1. Verifique la firma.

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

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

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

   Si la firma es válida, el comando no devuelve ningún resultado. Si no se puede verificar la firma, el comando devuelve `Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer`. Si su firma no se puede verificar, póngase en contacto con AWS Support.

1. Valide el contenido del documento de identidad de instancia.

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

   Si el contenido del documento de identidad de instancia es válido, el comando devuelve `True`. Si el documento de identidad de la instancia no se puede validar, póngase en contacto con AWS Support.