使用 PKCS7 簽章驗證 執行個體身分文件 - Amazon Elastic Compute Cloud

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 PKCS7 簽章驗證 執行個體身分文件

本主題說明如何使用 PKCS7 簽章和 AWS DSA 公用憑證來驗證執行個體身分識別文件。

使用 PKCS7 簽名和 AWS DSA 公用憑證來驗證執行個體身分證明文件
  1. 連線到執行個體。

  2. 從執行個體中繼資料擷取 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
  3. AWS 公開憑證 尋找您所在區域的 DSA 公有憑證,並將內容新增至名為 certificate 的新檔案。

  4. 使用 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

    如果無法驗證簽章,請聯絡 AWS Support。

必要條件

此程序需要 System.Security Microsoft .NET Core 類別。若要將類別新增至您的 PowerShell 工作階段,請執行下列命令。

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

該命令僅將類添加到當前 PowerShell 會話中。如果您啟動新的工作階段,您必須再次執行命令。

使用 PKCS7 簽名和 AWS 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. AWS 公開憑證 尋找您所在區域的 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。如果無法驗證您的簽章,請聯絡 AWS Support。

  7. 驗證執行個體身分文件的內容。

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

    如果執行個體身分文件的內容有效,則命令會傳回 True。如果無法驗證執行個體身分文件,請聯絡 AWS Support。