

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

# 驗證 Amazon EC2 執行個體的執行個體身分文件
<a name="verify-iid"></a>

如果您打算將 執行個體身分文件 的內容用於重要目的，您應該在使用它之前驗證其內容與真實性。

純文字 執行個體身分文件 會伴隨著三個雜湊和加密的簽章。您可以使用這些簽章來驗證 執行個體身分文件 的來源和真實性及其包含的資訊。提供的簽章如下：
+ 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>

**先決條件**  
此程序需要 `System.Security` Microsoft .NET Core 類別。若要將該類別新增至 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>

**先決條件**  
此程序需要 `System.Security` Microsoft .NET Core 類別。若要將該類別新增至 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 支援。