

# Amazon EC2 インスタンスのインスタンスアイデンティティドキュメントを検証する
<a name="verify-iid"></a>

インスタンスアイデンティティドキュメントの内容を重要な用途に使用する場合は、使用前にその内容と真正性を検証する必要があります。

プレーンテキストのインスタンスアイデンティティドキュメントには、ハッシュ化および暗号化された署名が 3 つあります。これらの署名を使用して、インスタンスアイデンティティドキュメントの作成元および真正性とそれに含まれている情報を検証できます。提供されている署名は次のとおりです。
+ base64 でエンコードされた署名—RSA キーペアを使用して暗号化されたインスタンスアイデンティティドキュメントの base64 でエンコードされた SHA256 ハッシュです。
+ PKCS7 署名—DSA キーペアを使用して暗号化されたインスタンスアイデンティティドキュメントの SHA1 ハッシュです。
+ RSA-2048 署名—RSA-2048 キーペアを使用して暗号化されたインスタンスアイデンティティドキュメントの SHA256 ハッシュです。

それぞれの署名は、インスタンスメタデータの異なるエンドポイントで取得できます。ハッシュ化と暗号化の要件に応じて、これらの署名のいずれかを使用できます。署名を検証するには、対応する AWS パブリック証明書を使用する必要があります。

**Contents**
+ [オプション 1: PKCS7 署名を使用してインスタンスアイデンティティドキュメントを検証する](#verify-pkcs7)
+ [オプション 2: base64 エンコード署名を使用してインスタンスアイデンティティドキュメントを検証する](#verify-signature)
+ [オプション 3: RSA-2048 署名を使用してインスタンスアイデンティティドキュメントを検証する](#verify-rsa2048)

## オプション 1: PKCS7 署名を使用してインスタンスアイデンティティドキュメントを検証する
<a name="verify-pkcs7"></a>

このトピックでは、PKCS7 署名と AWS DSA パブリック証明書を使用して、インスタンスアイデンティティドキュメントを検証する方法について説明します。

### Linux インスタンス
<a name="verify-pkcs7-linux"></a>

**PKCS7 署名と AWS DSA パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには**

1. インスタンスに接続します。

1. インスタンスメタデータから PKCS7 署名を取得し、必要なヘッダーとフッターとともに`pkcs7`という名前の新しいファイルに追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

------
#### [ 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. [インスタンスアイデンティティドキュメント署名の AWS パブリック証明書](regions-certs.md)でリージョン用に **DSA** パブリック証明書を検索し、`certificate` という名前の新しいファイルに追加します。

1. **OpenSSL の smime** コマンドを使用して、署名を検証します。署名を検証する必要があることを示す `-verify` オプションと証明書を検証する必要がないことを示す `-noverify` オプションを含めます。

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

   署名が有効な場合は、`Verification successful` メッセージが表示されます。

   また、このコマンドでは、インスタンスアイデンティティドキュメントの内容を、`document` という名前の新しいファイルにも書き込みます。以下のコマンドにより、このファイルの内容を、インスタンスメタデータからのインスタンスアイデンティティドキュメントの内容と比較できます。

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

    署名を検証できない場合は、サポートにお問い合わせください。

### Windows インスタンス
<a name="verify-pkcs7-windows"></a>

**前提条件**  
この手順では、Microsoft .NET Core の `System.Security` クラスが必要です。このクラスを PowerShell セッションに追加するには、次のコマンドを実行します。

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

**注記**  
このコマンドは、現在の PowerShell セッションにのみクラスを追加します。別のセッションを開始する場合は、このコマンドをもう一度実行する必要があります。

**PKCS7 署名と AWS DSA パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには**

1. インスタンスに接続します。

1. インスタンスメタデータから PKCS7 署名を取得し、バイトの配列に変換して、`$Signature` という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

------
#### [ 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. インスタンスメタデータからプレーンテキストのインスタンスアイデンティティドキュメントを取得し、バイトの配列に変換して、`$Document` という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

------
#### [ 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. [インスタンスアイデンティティドキュメント署名の AWS パブリック証明書](regions-certs.md)でリージョン用に **DSA** パブリック証明書を検索し、`certificate.pem` という名前の新しいファイルに追加します。

1. 証明書ファイルから証明書を抽出し、`$Store` という名前の変数に格納します。

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

1. 署名を検証します。

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

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

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

   署名が有効な場合、このコマンドは出力を返しません。署名を検証できない場合、このコマンドは `Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer` を返します。署名を検証できない場合は、AWS サポートにお問い合わせください。

1. インスタンスアイデンティティドキュメントの内容を検証します。

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

   インスタンスアイデンティティドキュメントの内容が有効な場合、このコマンドは `True` を返します。インスタンスアイデンティティドキュメントを検証できない場合は、AWS サポート にお問い合わせください。

## オプション 2: base64 エンコード署名を使用してインスタンスアイデンティティドキュメントを検証する
<a name="verify-signature"></a>

このトピックでは、base64 でエンコードされた署名と AWS RSA パブリック証明書を使用して、インスタンスアイデンティティドキュメントを検証する方法について説明します。

### Linux インスタンス
<a name="verify-signature-linux"></a>

**base64 でエンコードされた署名と AWS RSA パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには**

1. インスタンスに接続します。

1. インスタンスメタデータから base64 でエンコードされた署名を取得し、バイナリに変換して、`signature` という名前のファイルに追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

------
#### [ 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. インスタンスメタデータからプレーンテキストのインスタンスアイデンティティドキュメントを取得し、`document` という名前のファイルに追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

------
#### [ 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. [インスタンスアイデンティティドキュメント署名の AWS パブリック証明書](regions-certs.md)でリージョン用に **RSA** パブリック証明書を検索し、`certificate` という名前の新しいファイルに追加します。

1. AWS RSA パブリック証明書からパブリックキーを抽出し、`key` という名前のファイルに保存します。

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

1. **OpenSSL の dgst** コマンドを使用して、インスタンスアイデンティティドキュメントを検証します。

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

   署名が有効な場合は、`Verification successful` メッセージが表示されます。

   また、このコマンドでは、インスタンスアイデンティティドキュメントの内容を、`document` という名前の新しいファイルにも書き込みます。以下のコマンドにより、このファイルの内容を、インスタンスメタデータからのインスタンスアイデンティティドキュメントの内容と比較できます。

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

    署名を検証できない場合は、サポートにお問い合わせください。

### Windows インスタンス
<a name="verify-signature-windows"></a>

**base64 でエンコードされた署名と AWS RSA パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには**

1. インスタンスに接続します。

1. インスタンスメタデータから base64 でエンコードされた署名を取得し、バイトの配列に変換して、`$Signature` という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

------
#### [ 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. インスタンスメタデータからプレーンテキストのインスタンスアイデンティティドキュメントを取得し、バイトの配列に変換して、`$Document` という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

------
#### [ 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. [インスタンスアイデンティティドキュメント署名の AWS パブリック証明書](regions-certs.md)でリージョン用に **RSA** パブリック証明書を検索し、`certificate.pem` という名前の新しいファイルに追加します。

1. インスタンスアイデンティティドキュメントを検証します。

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

   署名が有効な場合、このコマンドは `True` を返します。署名を検証できない場合は、サポートにお問い合わせください。

## オプション 3: RSA-2048 署名を使用してインスタンスアイデンティティドキュメントを検証する
<a name="verify-rsa2048"></a>

このトピックでは、RSA-2048 署名と AWS RSA-2048 パブリック証明書を使用して、インスタンスアイデンティティドキュメントを検証する方法について説明します。

### Linux インスタンス
<a name="verify-rsa2048-linux"></a>

**RSA-2048 署名と AWS RSA-2048 パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには**

1. インスタンスに接続します。

1. インスタンスメタデータから RSA-2048 署名を取得し、必要なヘッダーとフッターとともに`rsa2048` という名前のファイルに追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

------
#### [ 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. [インスタンスアイデンティティドキュメント署名の AWS パブリック証明書](regions-certs.md)でリージョン用に **RSA-2048** パブリック証明書を検索し、`certificate` という名前の新しいファイルに追加します。

1. **OpenSSL の smime** コマンドを使用して、署名を検証します。署名を検証する必要があることを示す `-verify` オプションと証明書を検証する必要がないことを示す `-noverify` オプションを含めます。

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

   署名が有効な場合は、`Verification successful` メッセージが表示されます。署名を検証できない場合は、サポートにお問い合わせください。

### Windows インスタンス
<a name="verify-rsa2048-windows"></a>

**前提条件**  
この手順では、Microsoft .NET Core の `System.Security` クラスが必要です。このクラスを PowerShell セッションに追加するには、次のコマンドを実行します。

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

**注記**  
このコマンドは、現在の PowerShell セッションにのみクラスを追加します。別のセッションを開始する場合は、このコマンドをもう一度実行する必要があります。

**RSA-2048 署名と AWS RSA-2048 パブリック証明書を使用してインスタンスアイデンティティドキュメントを検証するには**

1. インスタンスに接続します。

1. インスタンスメタデータから RSA-2048 署名を取得し、バイトの配列に変換して、`$Signature` という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

------
#### [ 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. インスタンスメタデータからプレーンテキストのインスタンスアイデンティティドキュメントを取得し、バイトの配列に変換して、`$Document` という名前の変数に追加します。インスタンスで使用されている IMDS のバージョンに応じて、次のいずれかのコマンドを使用します。

------
#### [ 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. [インスタンスアイデンティティドキュメント署名の AWS パブリック証明書](regions-certs.md)でリージョン用に **RSA-2048** パブリック証明書を検索し、`certificate.pem` という名前の新しいファイルに追加します。

1. 証明書ファイルから証明書を抽出し、`$Store` という名前の変数に格納します。

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

1. 署名を検証します。

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

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

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

   署名が有効な場合、このコマンドは出力を返しません。署名を検証できない場合、このコマンドは `Exception calling "CheckSignature" with "2" argument(s): "Cannot find the original signer` を返します。署名を検証できない場合は、AWS サポートにお問い合わせください。

1. インスタンスアイデンティティドキュメントの内容を検証します。

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

   インスタンスアイデンティティドキュメントの内容が有効な場合、このコマンドは `True` を返します。インスタンスアイデンティティドキュメントを検証できない場合は、AWS サポート にお問い合わせください。