

# Amazon EC2 密钥对和 Amazon EC2 实例
密钥对

密钥对（由公有密钥和私有密钥组成）是一组安全凭证，可在连接到 Amazon EC2 实例时用来证明您的身份。对于 Linux 实例，私有密钥可使您安全地 SSH 到您的实例。对于 Windows 实例，需要用私有密钥才能解密管理员密码，然后您可以使用该密码连接到您的实例。

Amazon EC2 在您的实例上存储公有密钥，您需要存储私有密钥，如下图所示。重要的是，您要将您的私有密钥存储在一个安全的位置，因为拥有您的私有密钥的任何人都可以连接到使用密钥对的实例。

![\[密钥对包含您的计算机的私有密钥，以及您的实例的公有密钥。\]](http://docs.amazonaws.cn/AWSEC2/latest/UserGuide/images/ec2-key-pair.png)


启动实例时，您可以[指定密钥对](ec2-instance-launch-parameters.md#liw-key-pair)，这样便可使用需要密钥对的方法连接到您的实例。根据安全管理方式的不同，您可以为所有实例指定相同的密钥对，也可以指定不同的密钥对。

对于 Linux 实例，实例首次启动时，您在启动时指定的公有密钥将放在 Linux 实例 `~/.ssh/authorized_keys` 内的条目中。在使用 SSH 连接到 Linux 实例时，要进行登录，您必须指定与公有密钥对应的私有密钥。

有关连接到 EC2 实例的更多信息，请参阅 [连接到您的 EC2 实例](connect.md)。

**重要**  
由于 Amazon EC2 不保存私有密钥的副本，因此，如果您丢失私有密钥，则无法恢复它。但是，仍可通过一种方法连接到丢失了密钥对的实例。有关更多信息，请参阅 [我丢失了私有密钥。如何连接到我的实例？](TroubleshootingInstancesConnecting.md#replacing-lost-key-pair)。

作为密钥对的替代，您可以使用 [Amazon Systems Manager Session Manager](https://docs.amazonaws.cn/systems-manager/latest/userguide/session-manager.html)，通过基于浏览器的交互式、一键式 Shell 或 Amazon Command Line Interface（Amazon CLI）连接到您的实例。

**Topics**
+ [

# 为您的 Amazon EC2 实例创建密钥对
](create-key-pairs.md)
+ [

# 描述密钥对
](describe-keys.md)
+ [

# 删除您的密钥对
](delete-key-pair.md)
+ [

# 在 Linux 实例上添加或更换公有密钥
](replacing-key-pair.md)
+ [

# 验证您的密钥对的指纹
](verify-keys.md)

# 为您的 Amazon EC2 实例创建密钥对
创建密钥对

您可以使用 Amazon EC2 创建密钥对，或者可以使用第三方工具创建密钥对，然后将它们导入 Amazon EC2。

Amazon EC2 支持适用于 Linux 和 Windows 实例的 2048 位 SSH-2 RSA 密钥。Amazon EC2 还支持 Linux 实例的 ED25519 密钥。

有关在创建密钥对后如何连接到实例的说明，请参阅[使用 SSH 连接到 Linux 实例](connect-to-linux-instance.md)和[使用 RDP 连接到 Windows 实例](connecting_to_windows_instance.md)。

**Topics**
+ [

## 使用 Amazon EC2 创建密钥对
](#having-ec2-create-your-key-pair)
+ [

## 使用 Amazon CloudFormation 创建密钥对
](#create-key-pair-cloudformation)
+ [

## 使用第三方工具创建密钥对，并将公有密钥导入 Amazon EC2
](#how-to-generate-your-own-key-and-import-it-to-aws)

## 使用 Amazon EC2 创建密钥对


当您使用 Amazon EC2 创建密钥对时，公有密钥将存储在 Amazon EC2 中，您需要存储私有密钥。

您最多可以为每个区域创建 5000 个密钥对。要申请增加，请创建支持案例。有关更多信息，请参阅 *Amazon Web Services 支持 用户指南*中的[创建支持案例](https://docs.amazonaws.cn/awssupport/latest/user/case-management.html#creating-a-support-case)。

------
#### [ Console ]

**要使用 Amazon EC2 创建密钥对**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。

1. 在导航窗格中的 **Network & Security** 下，选择 **Key Pairs**。

1. 选择 **Create key pair (创建密钥对)**。

1. 对于 **Name (名称)**，为模板输入一个描述性名称。Amazon EC2 将公有密钥与您指定的密钥名称相关联。密钥名称最多可包含 255 个 ASCII 字符。它不能包含前导空格或尾随空格。

1. 选择适合您操作系统的密钥对类型：

   （Linux 实例）对于**密钥对类型**，选择 **RSA** 或者 **ED25519**。

   （Windows 实例）对于**密钥对类型**，请选择 **RSA**。Windows 实例不支持 **ED25519** 密钥。

1. 对于 **Private key file format**（私有密钥文件格式），选择要保存私有密钥的格式。要以可与 OpenSSH 一起使用的格式保存私有密钥，请选择 **pem**。要以可与 PuTTY 一起使用的格式保存私有密钥，请选择 **ppk**。

1. 要添加标签到公有密钥，请选择 **Add tag**（添加标签），然后输入标签的键和值。对每个标签重复此操作。

1. 选择 **Create key pair (创建密钥对)**。

1. 您的浏览器会自动下载私有密钥文件。基本文件名是指定为密钥对名称的名称，文件扩展名由您选择的文件格式确定。将私有密钥文件保存在安全位置。
**重要**  
这是您保存私有密钥文件的唯一机会。

1. 如果您计划在 macOS 或 Linux 计算机上使用 SSH 客户端连接到 Linux 实例，请使用以下命令设置私有密钥文件的权限，以确保只有您可以读取该文件。

   ```
   chmod 400 key-pair-name.pem
   ```

   如果不设置这些权限，则无法使用此密钥对连接到实例。有关更多信息，请参阅 [错误：未保护的私有密钥文件](TroubleshootingInstancesConnecting.md#troubleshoot-unprotected-key)。

------
#### [ Amazon CLI ]

**要使用 Amazon EC2 创建密钥对**

1. 按如下方式使用 [https://docs.amazonaws.cn/cli/latest/reference/ec2/create-key-pair.html](https://docs.amazonaws.cn/cli/latest/reference/ec2/create-key-pair.html) 命令生成密钥对，并将私有密钥保存到 `.pem` 文件中。`--query` 选项会将私有密钥材料打印到输出中。`--output` 选项会将私有密钥材料保存到指定的文件中。扩展名应为 `.pem` 或 `.ppk`，具体取决于密钥格式。私有密钥名称可以与公有密钥名称不同，但为方便起见，建议使用相同的名称。

   ```
   aws ec2 create-key-pair \
       --key-name my-key-pair \
       --key-type rsa \
       --key-format pem \
       --query "KeyMaterial" \
       --output text > my-key-pair.pem
   ```

1. 如果您计划在 macOS 或 Linux 计算机上使用 SSH 客户端连接到 Linux 实例，请使用以下命令设置私有密钥文件的权限，以确保只有您可以读取该文件。

   ```
   chmod 400 key-pair-name.pem
   ```

   如果不设置这些权限，则无法使用此密钥对连接到实例。有关更多信息，请参阅 [错误：未保护的私有密钥文件](TroubleshootingInstancesConnecting.md#troubleshoot-unprotected-key)。

------
#### [ PowerShell ]

**要使用 Amazon EC2 创建密钥对**  
按如下所示使用 [https://docs.amazonaws.cn/powershell/latest/reference/items/New-EC2KeyPair.html](https://docs.amazonaws.cn/powershell/latest/reference/items/New-EC2KeyPair.html) cmdlet 生成密钥，并将其保存到 `.pem` 或 `.ppk` 文件中。**Out-File** cmdlet 会将私有密钥材料保存到具有指定扩展名的文件中。扩展名应为 `.pem` 或 `.ppk`，具体取决于密钥格式。私有密钥名称可以与公有密钥名称不同，但为方便起见，建议使用相同的名称。

```
(New-EC2KeyPair `
    -KeyName "my-key-pair" `
    -KeyType "rsa" `
    -KeyFormat "pem").KeyMaterial | Out-File -Encoding ascii -FilePath C:\path\my-key-pair.pem
```

------

## 使用 Amazon CloudFormation 创建密钥对
使用 Amazon CloudFormation 创建密钥对

当您使用 Amazon CloudFormation 创建新的密钥对时，私有密钥会保存到 Amazon Systems Manager Parameter Store。参数名称有以下形式：

```
/ec2/keypair/key_pair_id
```

有关更多信息，请参阅《Amazon Systems Manager 用户指南》**中的 [Amazon Systems Manager Parameter Store](https://docs.amazonaws.cn/systems-manager/latest/userguide/systems-manager-parameter-store.html)。

**使用 Amazon CloudFormation 创建密钥对**

1. 在您的模板中指定 [AWS::EC2::KeyPair](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-keypair.html) 资源。

   ```
   Resources:
     NewKeyPair:
       Type: 'AWS::EC2::KeyPair'
       Properties: 
         KeyName: new-key-pair
   ```

1. 按如下方式使用 [https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-key-pairs.html](https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-key-pairs.html) 命令获取密钥对的 ID。

   ```
   aws ec2 describe-key-pairs --filters Name=key-name,Values=new-key-pair --query KeyPairs[*].KeyPairId --output text
   ```

   下面是示例输出。

   ```
   key-05abb699beEXAMPLE
   ```

1. 按如下方式使用 [https://docs.amazonaws.cn/cli/latest/reference/ssm/get-parameter.html](https://docs.amazonaws.cn/cli/latest/reference/ssm/get-parameter.html) 命令获取密钥的参数，并将密钥材料保存在 `.pem` 文件中。

   ```
   aws ssm get-parameter --name /ec2/keypair/key-05abb699beEXAMPLE --with-decryption --query Parameter.Value --output text > new-key-pair.pem
   ```

**所需的 IAM 权限**

要启用 Amazon CloudFormation 以代表您管理 Parameter Store 参数，由 Amazon CloudFormation 或您用户担任的 IAM 角色必须拥有以下权限：
+ `ssm:PutParameter` – 授予权限以创建私有密钥材料的参数。
+ `ssm:DeleteParameter` – 授予权限以删除存储私有密钥材料的参数。无论密钥对是由 Amazon CloudFormation 导入还是创建的，都需要此权限。

当 Amazon CloudFormation 删除由堆栈创建或导入的密钥对时，它会执行权限检查，以确定您是否有权删除参数，即使 Amazon CloudFormation 仅在创建密钥对而非导入密钥对时才创建参数。Amazon CloudFormation 使用与您账户中的任何参数都不匹配的虚构参数名称测试所需的权限。因此，您可能会在 `AccessDeniedException` 错误消息中看到虚构的参数名称。

## 使用第三方工具创建密钥对，并将公有密钥导入 Amazon EC2
将公有密钥导入 Amazon EC2

如果不使用 Amazon EC2 创建密钥对，则可以使用第三方工具创建一个 RSA 或 ED25519 密钥对，然后将公有密钥导入 Amazon EC2。

**密钥对的要求**
+ 支持的类型：
  + （Linux 和 Windows）RSA
  + （仅限 Linux）ED25519
**注意**  
Windows 实例不支持 ED25519 密钥。
  + Amazon EC2 不接受 DSA 密钥。
+ 支持的格式：
  + OpenSSH 公有密钥格式（对于 Linux，格式为 `~/.ssh/authorized_keys`）。
  + （仅限 Linux）如果您在使用 EC2 Instance Connect API 时使用 SSH 进行连接，则也支持 SSH2 格式。
  + SSH 私有密钥文件格式必须为 PEM 或 PPK
  + （仅 RSA）Base64 编码的 DER 格式
  + （仅 RSA）SSH 公有密钥文件格式如 [RFC 4716](https://www.ietf.org/rfc/rfc4716.txt) 所指定
+ 支持的长度：
  + 1024、2048 和 4096。
  + （仅限 Linux）如果您在使用 EC2 Instance Connect API 时使用 SSH 进行连接，则支持的长度为 2048 和 4096。

**要使用第三方工具创建密钥对**

1. 使用您选择的第三方工具生成密钥对。例如，您可以使用 **ssh-keygen**（通过标准 OpenSSH 安装提供的工具）。也可以使用 Java、Ruby、Python 以及多种其他提供标准库的编程语言来创建密钥对。
**重要**  
私有密钥必须采用 PEM 或 PPK 格式。例如，使用 `ssh-keygen -m PEM` 生成 PEM 格式的 OpenSSH 密钥。

1. 将公有密钥保存至本地文件。例如，`~/.ssh/my-key-pair.pub`（Linux、macOS）或 `C:\keys\my-key-pair.pub`（Windows）。此文件的文件扩展名并不重要。

1. 将私有密钥保存至扩展名为 `.pem` 或 `.ppk` 的本地文件。例如，`~/.ssh/my-key-pair.pem` 或 `~/.ssh/my-key-pair.ppk`（Linux、macOS）或 `C:\keys\my-key-pair.pem` 或 `C:\keys\my-key-pair.ppk`（Windows）。文件扩展名很重要，因为根据您用来连接实例的工具不同，您将需要特定的文件格式。OpenSSH 需要一个 `.pem` 文件，而 PuTTY 需要一个 `.ppk` 文件。
**重要**  
将私有密钥文件保存在安全位置。当您启动实例时，您将需要提供公有密钥的名称；当您每次连接到实例时，您将需要提供相应的私有密钥。

创建密钥对后，使用以下方法之一将公有密钥导入到 Amazon EC2。

------
#### [ Console ]

**要将公有密钥导入至 Amazon EC2**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。

1. 在导航窗格中，选择 **Key Pairs (密钥对)**。

1. 选择 **Import key pair (导入密钥对)**。

1. 对于 **Name**（名称），为公有密钥输入一个描述性名称。该名称最多可包含 255 个 ASCII 字符。它不能包含前导空格或尾随空格。
**注意**  
当您从 EC2 控制台连接到实例时，控制台会建议使用此名称作为私有密钥文件的名称。

1. 选择 **Browse (浏览)** 以导航到您的公有密钥并选择它，或者将公有密钥的内容粘贴到 **Public key contents (公有密钥内容)** 字段中。

1. 选择 **Import key pair (导入密钥对)**。

1. 验证您导入的公有密钥是否显示在密钥对列表中。

------
#### [ Amazon CLI ]

**要将公有密钥导入至 Amazon EC2**  
使用 [https://docs.amazonaws.cn/cli/latest/reference/ec2/import-key-pair.html](https://docs.amazonaws.cn/cli/latest/reference/ec2/import-key-pair.html) 命令。

```
aws ec2 import-key-pair \
    --key-name my-key-pair \
    --public-key-material fileb://path/my-key-pair.pub
```

**验证密钥对是否已成功导入**  
使用 [https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-key-pairs.html](https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-key-pairs.html) 命令。

```
aws ec2 describe-key-pairs --key-names my-key-pair
```

------
#### [ PowerShell ]

**要将公有密钥导入至 Amazon EC2**  
使用 [https://docs.amazonaws.cn/powershell/latest/reference/items/Import-EC2KeyPair.html](https://docs.amazonaws.cn/powershell/latest/reference/items/Import-EC2KeyPair.html) cmdlet。

```
$publickey=[Io.File]::ReadAllText("C:\Users\TestUser\.ssh\id_rsa.pub")
Import-EC2KeyPair `
    -KeyName my-key-pair `
    -PublicKey $publickey
```

**验证密钥对是否已成功导入**  
使用 [https://docs.amazonaws.cn/powershell/latest/reference/items/Get-EC2KeyPair.html](https://docs.amazonaws.cn/powershell/latest/reference/items/Get-EC2KeyPair.html) cmdlet。

```
Get-EC2KeyPair -KeyName my-key-pair
```

------

# 描述密钥对


您可以描述存储在 Amazon EC2 中的密钥对。您还可以检索公有密钥材料并识别启动时指定的公有密钥。

**Topics**
+ [

## 描述密钥对
](#describe-public-key)
+ [

## 检索公有密钥材料
](#retrieving-the-public-key)
+ [

## 确定启动时指定的公有密钥
](#identify-key-pair-specified-at-launch)

## 描述密钥对


您可以查看有关存储在 Amazon EC2 中的公有密钥的以下信息：公有密钥名称、ID、密钥类型、指纹、公有密钥材料、Amazon EC2 创建密钥的日期和时间（采用 UTC 时区）（如果密钥是由第三方工具创建的，则是将该密钥导入 Amazon EC2 的日期和时间），以及与该公有密钥相关联的所有标签。

------
#### [ Console ]

**查看有关密钥对的信息**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。

1. 在左侧导航器中，选择 **Key Pairs**（密钥对）。

1. 您可以在**Key pairs**（密钥对）表中查看每个公有密钥的相关信息。  
![\[密钥对表。\]](http://docs.amazonaws.cn/AWSEC2/latest/UserGuide/images/key-pairs-describe-console.png)

1. 要查看公有密钥的标签，请选中密钥旁边的复选框，然后选择**操作**、**管理标签**。

------
#### [ Amazon CLI ]

**查看有关密钥对的信息**  
使用 [https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-key-pairs.html](https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-key-pairs.html) 命令。

```
aws ec2 describe-key-pairs --key-names key-pair-name
```

------
#### [ PowerShell ]

**查看有关密钥对的信息**  
使用 [https://docs.amazonaws.cn/powershell/latest/reference/items/Get-EC2KeyPair.html](https://docs.amazonaws.cn/powershell/latest/reference/items/Get-EC2KeyPair.html) cmdlet。

```
Get-EC2KeyPair -KeyName key-pair-name
```

------

## 检索公有密钥材料


您可以获取密钥对的公有密钥材料。以下是一个示例公有密钥。请注意，添加的换行符是为了提高可读性。

```
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V
hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr
lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ
qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb
BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE
```

------
#### [ Private key ]

**使用 ssh-keygen 检索公有密钥材料（Linux）**  
在本地 Linux 或 macOS 计算机上，使用 **ssh-keygen** 命令。指定您已在其中下载私有密钥的路径（`.pem` 文件）。

```
ssh-keygen -y -f /path_to_key_pair/my-key-pair.pem
```

如果此 **ssh-keygen** 命令运行失败，请运行以下 **chmod** 命令，确保私有密钥文件具有所需的权限。

```
chmod 400 key-pair-name.pem
```

**使用 PuTTYgen 检索公有密钥材料（Windows）**  
在本地 Windows 计算机上，启动 PuTTYgen。选择 **Load**（加载）。选择 `.ppk` 或者 `.pem` 私有密钥文件。PuTTYgen 在 **Public key for pasting into OpenSSH authorized\$1keys file (粘贴到 OpenSSH authorized\$1keys 文件的公有密钥)** 下方显示公有密钥。也可以通过以下方式查看公有密钥：选择 **Save public key (保存公有密钥)**，请指定文件的名称，然后打开文件。

------
#### [ Amazon CLI ]

**检索公有密钥材料**  
使用以下 [describe-key-pairs](https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-key-pairs.html) 命令并指定 `--include-public-key` 选项。

```
aws ec2 describe-key-pairs \
    --key-names key-pair-name \
    --include-public-key \
    --query "KeyPairs[].PublicKey"
```

------
#### [ PowerShell ]

**检索公有密钥材料**  
使用 [Get-EC2KeyPair](https://docs.amazonaws.cn/powershell/latest/reference/items/Get-EC2KeyPair.html) cmdlet。

```
(Get-EC2KeyPair -KeyName key-pair-name -IncludePublicKey $true).PublicKey
```

------
#### [ IMDSv2 ]

**Linux**  
在 Linux 实例上运行以下命令。

```
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/meta-data/public-keys/0/openssh-key
```

**Windows**  
在 Windows 实例上运行以下 cmdlet。

```
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
```

------
#### [ IMDSv1 ]

**Linux**  
在 Linux 实例上运行以下命令。

```
curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
```

**Windows**  
在 Windows 实例上运行以下 cmdlet。

```
Invoke-RestMethod -uri  http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
```

------

## 确定启动时指定的公有密钥


如果您在启动实例时指定公有密钥，则该实例将记录公有密钥名称。即使更改了实例上的公有密钥或添加了公有密钥，报告的实例公有密钥对名称也不会更改。

------
#### [ Console ]

**识别在实例启动时指定的公有密钥**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。

1. 在导航窗格中，选择**实例**。

1. 选择实例。

1. 在**详细信息**选项卡的**实例详细信息**下，找到**启动时分配的密钥对**。

------
#### [ Amazon CLI ]

**识别在实例启动时指定的公有密钥**  
使用以下 [describe-instances](https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-instances.html) 命令。

```
aws ec2 describe-instances \
    --instance-id i-1234567890abcdef0 \
    --query "Reservations[].Instances[].KeyName" \
    --output text
```

下面是示例输出。

```
key-pair-name
```

------
#### [ PowerShell ]

**识别在实例启动时指定的公有密钥**  
使用 [Get-EC2Instance](https://docs.amazonaws.cn/powershell/latest/reference/items/Get-EC2Instance.html) cmdlet。

```
(Get-EC2Instance -InstanceId i-1234567890abcdef0).Instances | Select KeyName
```

下面是示例输出。

```
KeyName
-------
key-pair-name
```

------

# 删除您的密钥对


您可以删除密钥对，这将移除存储在 Amazon EC2 中的公有密钥。删除密钥对不会删除匹配的私有密钥。

使用以下方法删除公有密钥时，您仅删除了[创建](create-key-pairs.md#having-ec2-create-your-key-pair)或[导入](create-key-pairs.md#how-to-generate-your-own-key-and-import-it-to-aws)密钥对时在 Amazon EC2 中存储的公有密钥。删除公有密钥并不会从您添加公有密钥的任何实例中删除公有密钥，无论是在启动实例时还是启动后。也不会删除本地计算机上的私有密钥。您可以继续连接到使用已从 Amazon EC2 删除的公有密钥启动的实例，只要您仍然拥有私有密钥（`.pem`）文件。

**重要**  
如果您使用的是自动扩缩组（例如，在 Elastic Beanstalk 环境中），请确保您要删除的公有密钥未在关联的启动模板或启动配置中指定。如果 Amazon EC2 Auto Scaling 检测到运行不正常的实例，它将启动替代实例。但是，如果找不到公有密钥，则实例启动失败。有关更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的[启动模板](https://docs.amazonaws.cn/autoscaling/ec2/userguide/launch-templates.html)。

------
#### [ Console ]

**要在 Amazon EC2 上删除您的公有密钥**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/)。

1. 在导航窗格中，选择 **Key Pairs (密钥对)**。

1. 选择要删除的密钥对，然后依次选择 **Actions**（操作）、**Delete**（删除）。

1. 在确认字段中，输入 `Delete`，然后选择 **Delete (删除)**。

------
#### [ Amazon CLI ]

**要在 Amazon EC2 上删除您的公有密钥**  
使用 [https://docs.amazonaws.cn/cli/latest/reference/ec2/delete-key-pair.html](https://docs.amazonaws.cn/cli/latest/reference/ec2/delete-key-pair.html) 命令。

```
aws ec2 delete-key-pair --key-name my-key-pair
```

------
#### [ PowerShell ]

**要在 Amazon EC2 上删除您的公有密钥**  
使用 [https://docs.amazonaws.cn/powershell/latest/reference/items/Remove-EC2KeyPair.html](https://docs.amazonaws.cn/powershell/latest/reference/items/Remove-EC2KeyPair.html) cmdlet。

```
Remove-EC2KeyPair -KeyName my-key-pair
```

------

# 在 Linux 实例上添加或更换公有密钥



|  | 
| --- |
| 如果您丢失了私有密钥，则无法访问任何使用该密钥对的实例。有关使用与您在启动时指定的密钥对不同的密钥对连接到实例的更多信息，请参阅[我丢失了私有密钥](TroubleshootingInstancesConnecting.md#replacing-lost-key-pair)。 | 

启动实例时，您可以[指定密钥对](ec2-instance-launch-parameters.md#liw-key-pair)。如果您在启动时指定密钥对，当您的实例首次启动时，公有密钥将放置在 `~/.ssh/authorized_keys` 内的一个条目中的 Linux 实例中。使用 SSH 初次连接到 Linux 实例时，您需要指定默认用户和与存储在 Linux 实例上的公有密钥对应的私有密钥。

连接到实例后，您可以更改用于访问实例默认系统账户的密钥对，方法是在实例上添加新的公有密钥，或者替换实例上的公有密钥（删除现有公有密钥并添加新的公有密钥）。您还可以从实例中删除所有公有密钥。

您可能会出于以下原因添加或替换密钥对：
+ 如果组织中有用户需要使用单独的密钥访问系统用户，您可以将此公有密钥添加到实例。
+ 如果某人有私有密钥的副本（`.pem` 文件），而您想要防止他们连接到实例（例如在他们已离开企业的情况下），您可以删除实例上的公有密钥，并将其替换为新的密钥。
+ 如果您从实例创建 Linux AMI，则公有密钥材料将从实例复制到 AMI。如果您从 AMI 启动实例，则新实例将包含来自原始实例的公有密钥。要防止拥有私有密钥的用户连接到新实例，您可以在创建 AMI *之前*从原始实例中删除公有密钥。

使用以下程序修改默认用户的密钥对，例如 `ec2-user`。有关向实例添加用户的信息，请参阅实例上的操作系统的文档。

**添加或替换密钥对**

1. 使用 [Amazon EC2 控制台](create-key-pairs.md#having-ec2-create-your-key-pair)或[第三方工具](create-key-pairs.md#how-to-generate-your-own-key-and-import-it-to-aws)创建新的密钥对。

1. 从新密钥对检索公有密钥。有关更多信息，请参阅 [检索公有密钥材料](describe-keys.md#retrieving-the-public-key)。

1. [连接到您的 实例](connect-to-linux-instance.md)。

1. 在实例上，使用您选择的文本编辑器，打开 `.ssh/authorized_keys` 文件。将新密钥对的公有密钥信息粘贴到现有公有密钥信息下，然后保存该文件。

1. 从实例断开连接。测试您是否可以使用新密钥对的私有密钥文件连接到实例。

1. 如果您使用 Auto Scaling、EC2 实例集或启动模板来启动实例，请检查您要替换的密钥对是否在启动模板或启动配置中已指定。如果未指定，实例启动将失败。

1. (可选) 如果您要替换现有密钥对，请连接到实例并从 `.ssh/authorized_keys` 文件中删除原始密钥对的公有密钥信息。

**要从实例中删除公有密钥**

1. [连接到您的实例](connect-to-linux-instance.md)。

1. 使用您选择的文本编辑器，在实例上打开 `.ssh/authorized_keys` 文件。删除公有密钥信息，然后保存该文件。

**警告**  
如果从实例中删除所有公有密钥并断开与实例的连接，除非配置了其他登录方式，否则将无法再次连接该实例。

# 验证您的密钥对的指纹
验证指纹

要验证您的密钥对的指纹，请将在 Amazon EC2 控制台的**密钥对**页面上显示的或由 [describe-key-pairs](https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-key-pairs.html) 命令返回的指纹与您在本地计算机上使用私有密钥生成的指纹进行比较。这些指纹应该一致。

当 Amazon EC2 计算指纹时，Amazon EC2 可能会用 `=` 字符在指纹上添加填充。**ssh-keygen** 等其他工具可能会省略此填充。

如果您尝试验证 Linux EC2 实例的指纹，而不是密钥对的指纹，则请参阅[获取实例指纹](connection-prereqs-general.md#connection-prereqs-fingerprint)。

## 指纹如何计算


Amazon EC2 使用不同的哈希函数来计算 RSA 和 ED25519 密钥对的指纹。此外，对于 RSA 密钥对，Amazon EC2 使用不同的哈希函数以不同方式计算指纹，具体取决于密钥对是由 Amazon EC2 创建还是导入到 Amazon EC2 的。

下表所列的哈希函数用于计算由 Amazon EC2 创建以及导入到 Amazon EC2 的 RSA 和 ED25519 密钥对的指纹。


**（Linux 实例）用于计算指纹的哈希函数**  

| 密钥对来源 | RSA 密钥对（Windows 和 Linux） | ED25519 密钥对（Linux） | 
| --- | --- | --- | 
| 由 Amazon EC2 创建 | SHA-1 | SHA-256 | 
| 导入到 Amazon EC2 | MD5¹ | SHA-256 | 

¹ 如果您将公有的 RSA 密钥导入到 Amazon EC2，系统会使用 MD5 哈希函数计算指纹。无论您如何创建密钥对（例如，通过使用第三方工具或者从使用 Amazon EC2 创建的现有私有密钥生成新的公有密钥），都是如此。

## 在不同区域使用相同的密钥对时


如果您计划使用相同的密钥对连接到不同 Amazon Web Services 区域 中的实例，必须将公有密钥导入到将在其中使用公有密钥的所有区域。如果使用 Amazon EC2 创建密钥对，您可以 [检索公有密钥材料](describe-keys.md#retrieving-the-public-key) 以便将公有密钥导入到其他区域。

**注意**  
如果您使用 Amazon EC2 创建 RSA 密钥对，然后从 Amazon EC2 私有密钥生成公有密钥，则导入的公有密钥的指纹将与原始公有密钥不同。这是因为使用 Amazon EC2 创建的原始 RSA 密钥的指纹是使用 SHA-1 哈希函数计算的，而导入的 RSA 密钥的指纹则使用 MD5 哈希函数计算。
对于 ED25519 密钥对，无论它们是由 Amazon EC2 创建还是导入到 Amazon EC2 的，指纹都将相同，因为两种情况下都使用相同的 SHA-256 哈希函数来计算指纹。

## 从私有密钥生成指纹


使用以下命令之一可从本地机器上的私有密钥生成指纹。

如果您使用的是 Windows 本地计算机，您可以使用 Windows Subsystem for Linux (WSL) 运行以下命令。按照[如何使用 WSL 在 Windows 上安装 Linux](https://learn.microsoft.com/en-us/windows/wsl/install) 中的说明来安装 WSL 和 Linux 发行版。说明中的示例安装的是 Linux 的 Ubuntu 发行版，但您可以安装任意发行版。系统会提示您重新启动电脑以使更改生效。
+ **如果您使用 Amazon EC2 创建密钥对**

  如以下示例中所示，使用 OpenSSL 工具生成指纹。

  对于 RSA 密钥对：

  ```
  openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
  ```

  （Linux 实例）对于 ED25519 密钥对：

  ```
  ssh-keygen -l -f path_to_private_key
  ```
+ **（仅限 RSA 密钥对）如果您将公有密钥导入 Amazon EC2**

  无论密钥对的创建方式如何（例如，使用第三方工具或者从使用 Amazon EC2 创建的现有私有密钥生成新的公有密钥），都可以遵循此过程。

  如以下示例中所示，使用 OpenSSL 工具生成指纹。

  ```
  openssl rsa -in path_to_private_key -pubout -outform DER | openssl md5 -c
  ```
+ **如果您使用 OpenSSH 7.8 或更高版本创建 OpenSSH 密钥对，并将公有密钥导入到 Amazon EC2**

  如以下示例中所示，使用 **ssh-keygen** 生成指纹。

  对于 RSA 密钥对：

  ```
  ssh-keygen -ef path_to_private_key -m PEM | openssl rsa -RSAPublicKey_in -outform DER | openssl md5 -c
  ```

  （Linux 实例）对于 ED25519 密钥对：

  ```
  ssh-keygen -l -f path_to_private_key
  ```