使用 PKCS7 签名验证 实例身份文档 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 PKCS7 签名验证 实例身份文档

本主题说明如何使用 PKCS7 签名和 Amazon DSA 公有证书验证实例身份文档。

先决条件

此过程需要 System.Security Microsoft .NET Core 类。要将该类添加到 PowerShell 会话中,请运行以下命令。

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

此命令仅将该类添加到当前 PowerShell 会话。如果您启动新会话,则必须再次运行该命令。

使用 PKCS7 签名和 Amazon DSA 公有证书验证实例身份文档
  1. 连接到实例。

  2. 从实例元数据中检索 PKCS7 签名,将其转换为字节数组并添加到名为 $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/pkcs7).Content)
    IMDSv1
    PS C:\> $Signature = [Convert]::FromBase64String((Invoke-WebRequest http://169.254.169.254/latest/dynamic/instance-identity/pkcs7).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. Amazon 公有证书 中找到您所在区域的 DSA 公有证书,并将内容添加到名为 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。如果无法验证您的签名,请联系 Amazon Web Services Support。

  7. 验证实例身份文档的内容。

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

    如果实例身份文档的内容有效,则命令返回 True。如果无法验证实例身份文档,请联系 Amazon Web Services Support。