使用 RSA-2048 签名验证 实例身份文档 - Amazon Elastic Compute Cloud

使用 RSA-2048 签名验证 实例身份文档

本主题说明如何使用 RSA-2048 签名和 AWS RSA-2048 公有证书验证实例身份文档。

使用 RSA-2048 签名和 AWS RSA-2048 公有证书验证实例身份文档。
  1. 连接到实例。

  2. 从实例元数据中检索 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
  3. AWS 公有证书 中找到您所在区域的 RSA-2048 公有证书,并将内容添加到名为 certificate 的新文件。

  4. 使用 OpenSSL smime 命令来验证签名。包括 -verify 选项以指示需要验证签名,而包括 -noverify 选项则指示不需要验证证书。

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

    如果签名有效,则会显示 Verification successful 消息。如果无法验证签名,请联系 AWS Support。

先决条件

此过程需要 System.Security Microsoft .NET Core 类。要将该类添加到 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。