Amazon EC2 密钥对和 Linux 实例 - Amazon Elastic Compute Cloud
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon EC2 密钥对和 Linux 实例

密钥对(由私有密钥和公有密钥组成)是一组安全凭证,可在连接到实例时用来证明您的身份。Amazon EC2 存储公有密钥,您存储私有密钥。您可以使用私有密钥而不是密码来安全地访问您的实例。拥有您的私有密钥的任何人都可以连接到您的实例,因此将您的私有密钥存储在一个安全位置非常重要。

启动实例时,系统会提示您输入密钥对。如果您计划使用 SSH 连接到实例,则必须指定密钥对。您可以选择现有密钥对或创建新的密钥对。当您的实例首次启动时,您在启动时指定的公有密钥的内容将放置在 Linux 实例中的 ~/.ssh/authorized_keys 的条目中。在使用 SSH 连接到 Linux 实例时,要进行登录,您必须指定与公有密钥内容对应的私有密钥。有关连接到实例的更多信息,请参阅连接到您的 Linux 实例。有关密钥对和 Windows 实例的更多信息,请参阅 Amazon EC2 用户指南(适用于 Windows 实例) 中的 Amazon EC2 密钥对和 Windows 实例

由于 Amazon EC2 不保存私有密钥的副本,因此,如果您丢失私有密钥,则无法恢复它。但是,仍可通过一种方法连接到丢失了密钥对的实例。有关更多信息,请参阅丢失私有密钥时连接到 Linux 实例

Amazon EC2 使用的密钥是 2048-bit SSH-2 RSA 密钥。每个地区最多可拥有 5,000 个密钥对。

创建或导入密钥对

您可以使用 Amazon EC2 创建新的密钥对,也可以导入现有密钥对。

选项 1:使用 Amazon EC2 创建密钥对

您可以使用以下方法之一创建密钥对。

新控制台

创建密钥对

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中的 NETWORK & SECURITY 下,选择 Key Pairs

  3. 选择 Create key pair (创建密钥对)

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

  5. 对于 File format (文件格式),选择要保存私有密钥的格式。要以可与 OpenSSH 一起使用的格式保存私有密钥,请选择 pem。要以可与 PuTTY 一起使用的格式保存私有密钥,请选择 ppk

  6. 选择 Create key pair (创建密钥对)

  7. 您的浏览器会自动下载私有密钥文件。基本文件名是指定为密钥对名称的名称,文件扩展名由您选择的文件格式确定。将私有密钥文件保存在安全位置。

    重要

    这是您保存私有密钥文件的唯一机会。

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

    chmod 400 my-key-pair.pem

    如果不设置这些权限,则无法使用此密钥对连接到实例。有关更多信息,请参阅 错误:未保护的私有密钥文件

旧控制台

创建密钥对

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中的 NETWORK & SECURITY 下,选择 Key Pairs

  3. 选择 Create Key Pair

  4. 对于 Key pair name (密钥对名称),为密钥对输入描述性名称,然后选择 Create (创建)。密钥名称最多可包含 255 个 ASCII 字符。它不能包含前导空格或尾随空格。

  5. 您的浏览器会自动下载私有密钥文件。基本文件名是您为密钥对指定的名称,文件扩展名为 .pem。将私有密钥文件保存在安全位置。

    重要

    这是您保存私有密钥文件的唯一机会。

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

    chmod 400 my-key-pair.pem

    如果不设置这些权限,则无法使用此密钥对连接到实例。有关更多信息,请参阅 错误:未保护的私有密钥文件

AWS CLI

创建密钥对

  1. 按如下方式使用 create-key-pair AWS CLI 命令生成密钥,并将其保存到 .pem 文件中。

    aws ec2 create-key-pair --key-name my-key-pair --query 'KeyMaterial' --output text > my-key-pair.pem
  2. 如果您将在 macOS 或 Linux 计算机上使用 SSH 客户端连接到您的 Linux 实例,请使用以下命令设置您私有密钥文件的权限,以确保只有您可以读取它。

    chmod 400 my-key-pair.pem

    如果不设置这些权限,则无法使用此密钥对连接到实例。有关更多信息,请参阅 错误:未保护的私有密钥文件

PowerShell

创建密钥对

按如下所示使用 New-EC2KeyPair 适用于 Windows PowerShell 的 AWS 工具 命令生成密钥,并将其保存到 .pem 文件中。

PS C:\> (New-EC2KeyPair -KeyName "my-key-pair").KeyMaterial | Out-File -Encoding ascii -FilePath C:\path\my-key-pair.pem

选项 2:将您自己的公有密钥导入到 Amazon EC2

如果不使用 Amazon EC2 创建密钥对,您可以使用第三方工具创建一个 RSA 密钥对,然后将公有密钥导入 Amazon EC2。例如,您可以使用 ssh-keygen(通过标准 OpenSSH 安装提供的工具)创建密钥对。或者,您可以使用 Java、Ruby、Python 和很多其他提供标准库的编程语言来创建 RSA 密钥对。

要求

  • 支持以下格式:

    • OpenSSH 公有密钥格式 (格式为 ~/.ssh/authorized_keys)。如果您在使用 EC2 Instance Connect API 时使用 SSH 进行连接,则也支持 SSH2 公司。

    • Base64 编码的 DER 格式

    • SSH 公有密钥文件格式如 RFC4716 所指定

    • SSH 私有密钥文件格式必须为 PEM(例如,使用 ssh-keygen -m PEM 将 OpenSSH 密钥转换为 PEM 格式)

  • 创建一个 RSA 密钥。Amazon EC2 不接受 DSA 密钥。

  • 支持的长度为 1024、2048 和 4096。如果您在使用 EC2 Instance Connect API 时使用 SSH 进行连接,则支持的长度为 2048 和 4096。

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

  1. 使用您选择的第三方工具生成密钥对。

  2. 将公有密钥保存至本地文件。例如,~/.ssh/my-key-pair.pub (Linux) 或 C:\keys\my-key-pair.pub (Windows)。此文件的文件扩展名并不重要。

  3. 将私有密钥保存至另一个扩展名为 .pem 的本地文件。例如,~/.ssh/my-key-pair.pem (Linux) 或 C:\keys\my-key-pair.pem (Windows)。将私有密钥文件保存在安全位置。当您启动实例时,您将需要提供密钥对的名称;当您每次连接到实例时,您将需要提供相应的私有密钥。

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

新控制台

导入公有密钥

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中,选择 Key Pairs (密钥对)

  3. 选择 Import key pair (导入密钥对)

  4. 对于 Name (名称),为模板输入一个描述性名称。该名称最多可包含 255 个 ASCII 字符。它不能包含前导空格或尾随空格。

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

  6. 选择 Import key pair (导入密钥对)

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

旧控制台

导入公有密钥

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中的 NETWORK & SECURITY 下,选择 Key Pairs

  3. 选择 Import Key Pair (导入密钥对)

  4. Import Key Pair (导入密钥对) 对话框中,选择 Browse (浏览),然后选择之前保存的公有密钥文件。在 Key pair name 字段中为新的密钥对键入一个名称,然后选择 Import。该名称最多可包含 255 个 ASCII 字符。它不能包含前导空格或尾随空格。

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

AWS CLI

导入公有密钥

使用 import-key-pair AWS CLI 命令。

验证密钥对是否已成功导入

使用 describe-key-pairs AWS CLI 命令。

PowerShell

导入公有密钥

使用 Import-EC2KeyPair 适用于 Windows PowerShell 的 AWS 工具 命令。

验证密钥对是否已成功导入

使用 Get-EC2KeyPair 适用于 Windows PowerShell 的 AWS 工具 命令。

标记密钥对

要对现有密钥对进行分类和管理,可以使用自定义元数据标记它们。有关标签的工作原理的更多信息,请参阅给您的 Amazon EC2 资源加标签

您可以使用新的控制台和命令行工具查看、添加和删除标签。

新控制台

查看、添加或删除现有密钥对的标签

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中,选择 Key Pairs (密钥对)

  3. 选择一个密钥对,然后依次选择 Actions (操作)Manage tags (管理标签)

  4. Manage tags (管理标签) 部分显示分配给密钥对的所有标签。

    • 要添加标签,请选择 Add tag (添加标签),然后输入标签键和值。您最多可以为每个密钥对添加 50 个标签。有关更多信息,请参阅标签限制

    • 要删除标签,请选择要删除的标签旁边的 Remove (删除)

  5. 选择保存更改

AWS CLI

查看密钥对标签

使用 describe-tags AWS CLI 命令。在以下示例中,您将描述所有密钥对的标签。

$ aws ec2 describe-tags --filters "Name=resource-type,Values=key-pair"
{ "Tags": [ { "Key": "Environment", "ResourceId": "key-0123456789EXAMPLE", "ResourceType": "key-pair", "Value": "Production" }, { "Key": "Environment", "ResourceId": "key-9876543210EXAMPLE", "ResourceType": "key-pair", "Value": "Production" }] }

描述特定密钥对的标签

使用 describe-key-pairs AWS CLI 命令。

$ aws ec2 describe-key-pairs --key-pair-ids key-0123456789EXAMPLE
{ "KeyPairs": [ { "KeyName": "MyKeyPair", "KeyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f", "KeyPairId": "key-0123456789EXAMPLE", "Tags": [ { "Key": "Environment", "Value": "Production" }] }] }

标记现有密钥对

使用 create-tags AWS CLI 命令。在以下示例中,使用 Key=Cost-CenterValue=CC-123 标记现有密钥对。

$ aws ec2 create-tags --resources key-0123456789EXAMPLE --tags Key=Cost-Center,Value=CC-123

从密钥对中删除标签

使用 delete-tags AWS CLI 命令。有关示例,请参阅 AWS CLI Command Reference 中的示例

PowerShell

查看密钥对标签

使用 Get-EC2Tag 命令。

描述特定密钥对的标签

使用 Get-EC2KeyPair 命令。

标记现有密钥对

使用 New-EC2Tag 命令。

从密钥对中删除标签

使用 Remove-EC2Tag 命令。

检索密钥对的公有密钥

在本地 Linux 或 macOS 计算机上,可使用 ssh-keygen 命令检索密钥对的公有密钥。指定您已在其中下载私有密钥的路径(.pem 文件)。

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

该命令返回公有密钥,如以下示例所示。

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

如果该命令失败,请运行以下命令以确保更改对您的密钥对文件的权限,以便只有您才能查看该文件。

chmod 400 my-key-pair.pem

通过实例元数据检索密钥对的公有密钥

您在启动实例时指定的公有密钥也可以通过实例元数据使用。要查看您在启动实例时指定的公有密钥,请从您的实例中使用以下命令:

IMDSv2
[ec2-user ~]$ 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" –v http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key

下面是一个示例输出。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE my-key-pair
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key

下面是一个示例输出。

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

如果您更改用于连接到实例的密钥对,我们不会更新实例元数据以显示新的公有密钥。相反,实例元数据将继续显示您在启动实例时指定的密钥对的公有密钥。有关更多信息,请参阅 检索实例元数据

或者,在 Linux/ 实例中,公有密钥内容放在 ~/.ssh/authorized_keys 内的条目中。您可以在编辑器中打开此文件。以下是名为 my-key-pair 的密钥对的示例条目。它包括后跟密钥对名称的公有密钥。

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

在实例上查找公有密钥

启动实例时,系统会提示您输入密钥对。如果您计划使用 SSH 连接到实例,则必须指定密钥对。您可以选择现有密钥对或创建新的密钥对。当您的实例首次启动时,您在启动时指定的公有密钥的内容将放置在 Linux 实例上的 ~/.ssh/authorized_keys 内的条目中。

在实例上查找公有密钥

  1. 连接到您的实例。有关更多信息,请参阅 连接到您的 Linux 实例

  2. 在终端窗口中,使用您常用的文本编辑器(如 vimnano)打开 authorized_keys 文件。

    [ec2-user ~]$ nano ~/.ssh/authorized_keys

    文件 authorized_keys 将打开,显示公有密钥,如以下示例所示。

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6Vhz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXrlsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZqaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3RbBQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE

确定启动时指定的密钥对

启动实例时,系统会提示您输入密钥对。如果您计划使用 SSH 连接到实例,则必须指定密钥对。

确定启动时指定的密钥对

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中,选择 Instances,然后选择您的实例。

  3. 描述选项卡上,密钥对名称字段会显示您在启动实例时指定的密钥对的名称。即使您更改实例上的公有密钥或添加密钥对,密钥对名称的值也不会更改。

(可选)验证您的密钥对的指纹

在 Amazon EC2 控制台的 Key Pairs (密钥对) 页面上,Fingerprint (指纹) 列显示从您的密钥对生成的指纹。AWS 根据密钥对是由 AWS 还是第三方工具生成以不同方式计算指纹。如果您是使用 AWS 创建的密钥对,则会使用 SHA-1 哈希函数计算指纹。如果您使用第三方工具创建了密钥对并将公有密钥上传到 AWS,或者如果您从一个现有的 AWS 创建的私有密钥生成了一个新的公有密钥并将其上传到 AWS,则会使用 MD5 哈希函数计算指纹。

您可以使用显示在 Key Pairs (密钥对) 页面上的 SSH2 指纹验证您本地计算机上的私有密钥是否与 AWS 中存储的公有密钥匹配。在您在其中已下载私有密钥文件的计算机中,从私有密钥文件生成 SSH2 指纹。输出应与控制台中显示的指纹匹配。

如果您使用 AWS 创建了密钥对,则可以使用 OpenSSL 工具生成指纹,如以下示例中所示:

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

如果您使用第三方工具创建了密钥对并将公有密钥上传到 AWS,则可以使用 OpenSSL 工具生成指纹,如以下示例中所示。

$ openssl rsa -in path_to_private_key -pubout -outform DER | openssl md5 -c

如果您使用 OpenSSH 7.8 或更高版本创建了 OpenSSH 密钥对并将公有密钥上传到 AWS,则可以使用 ssh-keygen 生成指纹,如以下示例中所示。

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

添加或替换实例的密钥对

您可以更改用于访问实例默认系统账户的密钥对。例如,如果组织中用户需要使用单独的密钥对访问系统用户账户,您可以向实例中添加一个密钥对。或者,如果某人有 .pem 文件的副本,而您想要防止他们访问实例 (例如在他们已离开组织的情况下),您可以将其替换为新密钥对。

要添加或替换密钥对,您必须能够连接到实例。如果您丢失了现有的私有密钥,或者在没有密钥对的情况下启动了实例,则您将无法连接到实例,因此无法添加或替换密钥对。如果您丢失了现有的私有密钥,则可以检索它。有关更多信息,请参阅 丢失私有密钥时连接到 Linux 实例。如果启动实例而没有密钥对,则将无法连接到此实例,除非您选择配置为允许用户以其他方式登录的 AMI。

注意

这些程序用于修改默认用户账户的密钥对,例如 ec2-user。有关向实例添加用户账户的更多信息,请参阅 在 Amazon Linux 实例上管理用户账户

添加或替换密钥对

  1. 使用 Amazon EC2 控制台第三方工具创建新的密钥对。

  2. 从新密钥对检索公有密钥。有关更多信息,请参阅 检索密钥对的公有密钥

  3. 使用现有的私有密钥文件连接到实例。

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

  5. 从实例分离,并测试能否使用新的私有密钥文件连接到实例。

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

注意

如果您使用的是 Auto Scaling 组,请确保未在启动模板或启动配置中指定您要替换的密钥对。Amazon EC2 Auto Scaling 检测到运行不正常的实例时会启动替换实例;但是,如果找不到密钥对,实例启动将失败。

删除您的密钥对

当您删除密钥对时,仅删除公有密钥的 Amazon EC2 副本。删除密钥对不影响您计算机上的私有密钥或是已使用该密钥对启动的任何实例上的公有密钥。您不能使用已删除的密钥对启动新实例,不过,只要您仍然有私有密钥 (.pem) 文件,就可以继续连接到使用已删除的密钥对启动的任何实例。

如果您使用的是 Auto Scaling 组(例如,在 Elastic Beanstalk 环境中),请确保您要删除的密钥对未在启动配置中指定。Amazon EC2 Auto Scaling 检测到运行不正常的实例时会启动替换实例;但是,如果找不到密钥对,实例启动将失败。

您可以使用以下方法之一删除密钥对。

新控制台

删除您的密钥对

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中,选择 Key Pairs (密钥对)

  3. 选择要删除的密钥对,然后选择 Delete (删除)

  4. 在确认字段中,输入 Delete,然后选择 Delete (删除)

旧控制台

删除您的密钥对

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中的 NETWORK & SECURITY 下,选择 Key Pairs

  3. 选择密钥对,然后选择 Delete

  4. 系统提示时,请选择 Yes

AWS CLI

删除您的密钥对

使用 delete-key-pair AWS CLI 命令。

PowerShell

删除您的密钥对

使用 Remove-EC2KeyPair 适用于 Windows PowerShell 的 AWS 工具 命令。

如果您从一个实例创建了一个 Linux AMI,然后在不同区域或账户中使用该 AMI 启动一个新实例,则新实例将包含来自原始实例的公有密钥。这允许您使用与原始实例相同的私有密钥连接到新实例。您可以使用任意文本编辑器从 .ssh/authorized_keys 文件中删除此公有密钥的条目,从而从实例中删除此公有密钥。有关管理您的实例用户和使用特定密钥对提供远程访问的更多信息,请参阅在 Amazon Linux 实例上管理用户账户