RSA-2048 署名を使用した インスタンスアイデンティティドキュメント の検証 - Amazon Elastic Compute Cloud

RSA-2048 署名を使用した インスタンスアイデンティティドキュメント の検証

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

前提条件

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

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

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

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

  2. インスタンスメタデータから 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)
  3. インスタンスメタデータからプレーンテキストのインスタンスアイデンティティドキュメントを取得し、バイトの配列に変換して、$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)
  4. AWS パブリック証明書でリージョン用に RSA-2048 パブリック証明書を検索し、certificate.pem という名前の新しいファイルに追加します。

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

    PS C:\> $Store = [Security.Cryptography.X509Certificates.X509Certificate2Collection]::new([Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path certificate.pem)))
  6. 署名を検証します。

    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 Supportにお問い合わせください。

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

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

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