为什么亚马逊发布私钥而不是公钥?


20

我的大脑缠绕在公钥和私钥上。当您在Amazon的EC2服务上创建云服务器(实例),然后想通过SSH连接到它时,Amazon要求您下载私有密钥以建立连接。公钥/私钥背后的想法是否暗示亚马逊应该要求您下载公钥?

此外,如果我设置了供客户使用的SFTP服务器,我应该在服务器上安装他们的密钥还是从服务器提供密钥?无论哪种情况,都应该是公钥还是私钥?


1
对于我们中不太熟悉EC2的那些人,亚马逊是否要求您下载私钥?
Zoredache

2
当您在Amazon EC2上设置云服务器并想通过SSH连接到它时,Amazon控制台允许您下载用于建立连接的私钥。当然,您需要保护密钥。
赛斯2012年

@Zoredache公平地说,这是一个选择。希望在Windows机器上快速进行工具操作的人以前可能从未使用过OpenSSH,因此这是一个不错的快速入门。
ceejayoz

Answers:


36

更深入地思考身份验证过程,需要保密什么?亚马逊知道密钥的公开部分,任何人都可以知道公开部分。密钥对的公用部分与专用部分匹配时,表示专用部分用于进行身份验证。

当Amazon为您生成密钥对时提供给您的私钥仅在您唯一拥有它的情况下才有用。如果这不是秘密,那么其他任何知道它的人也可以向持有密钥对公开一半的任何人进行身份验证。

被认证的任何人都必须拥有私人半身。如果世界上的每个人都可以通过握住公开密钥的一半来对您进行身份验证,那是可以的,但是只有您应该控制私有密钥。


18

Amazon提供密钥生成服务是因为某些操作系统(咳嗽,Windows,咳嗽)可能不容易生成SSH密钥对。

使用SSH(和SFTP),公钥将在EC2实例启动时安装在用户的authorized_keys文件中。私钥仅由用户持有,并提供以针对服务器进行身份验证。

从以下文档中:

http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateKeyPair.html

看来Amazon会在其服务器上生成密钥对,并通过HTTPS向您发送私钥。这可能并不完美(理想情况下,您和其他任何人都不会拥有私钥),但鉴于并非所有情况都如此,因为这一切都是在您的已认证会话的上下文中发生的,并且只有您(和Amazon暂时)看到私钥。您还可以始终生成并上传自己的公钥以供EC2使用,同时将私钥严格保密。

为了设置SFTP用户进行密钥身份验证,他们应该在自己的计算机上生成SSH密钥。一旦他们生成了密钥对,他们应该只向您发送公开密钥以安装在相关的authorized_keys文件中。顾名思义,私钥是私有的。


5
我定期在Windows计算机上生成密钥对。尽管这是使用已安装的软件完成的,而不是通过Windows本身完成的,但并不难。
多米尼克·克罗宁

2
同意多米尼克。更重要的是,普通Windows用户在使用CLI时感到恐惧和迷茫,并且Windows仍然没有“使用SSH密钥登录”选项。
HopelessN00b

哦,是的,同意。我将Cygwin等与openssh配合使用,因此一切工作正常。我想大多数Windows用户会使用PuTTY,并且必须进行一些密钥转换。这只是更多步骤。
cjc 2012年

1
我从未真正使用过Amazon,但不是指责Windows,而是假设Amazon向您发送密钥的原因是,如果他们没有给您提供登录密钥,您将如何登录以安装公共密钥?首先是键?
DerfK

1
@DerfK您可以提交自己的公共密钥,然后选择要安装在新EC2实例中的公共密钥。选择特定键是实例创建过程的一部分。
cjc 2012年

2

公钥身份验证的工作方式与您所考虑的方式相反。公钥对消息加密,而私钥对消息解密。服务器存储帐户持有者的公共密钥,并使用它来加密消息。只有私钥的持有者才能解密该消息。

如果您向某人发送使用其公钥加密的秘密,如果他们可以告诉您该秘密是什么,那么您知道他们拥有匹配的私钥。然后,对用户进行身份验证。

为了安全起见,AWS要求您下载并保存您的私钥,因为他们不会存储私钥。由于私钥未存储在AWS上的任何位置,因此您可以确信EC2实例是安全的。


1

从某种意义上说,没关系。私钥/公钥对由两部分组成,其中哪一部分是公共的取决于您。如果某事物使用一个密钥加密,则需要另一个密钥对其进行解密。如果您公开发布了一个密钥而不是公开发布,则私钥就是您未发布的密钥。

解决您的实际问题:大概Amazon提供给您的关键是允许您控制自己的资源,因此不应将其提供给其他人。在这种情况下,您必须信任亚马逊拥有您的私钥,至少要足够长的时间才能进行设置。

如果您希望客户以这种方式登录,则需要他们给您提供他们准备与您共享的密钥,因此也要提供他们的公共密钥。将其安装在服务器上的authenticated_keys中,这实际上是在说:“任何提出与该公共密钥匹配的私有密钥的人都可以访问此资源”。


1
嗯,不,那不是真的。至少对于RSA / DH,您可以使用公共密钥进行加密,而使用私有密钥进行解密,反之则不行。签名与加密/解密不同。
Zoredache

1
@ErikA不,不能从私钥派生公钥。私钥文件通常同时包含两个密钥。如果您真的想参加讨论,建议您使用crypto.stackexchange.com。这些人可以为您提供真正深入的内部细节,包括RSA密钥的实际差异,以及为何将哪个密钥视为公开密钥与私有密钥并不只是一掷千金。
杰夫·弗兰

@Zoredache-我不知道:谢谢。你有一个好的参考链接吗?
多米尼克·克罗宁

en.wikipedia.org/wiki/Asymmetric_key_algorithm-一个密钥锁定或加密明文,另一个密钥解锁或解密密文。两个键都不能执行这两个功能。- en.wikipedia.org/wiki/RSA_(algorithm) - RSA涉及公钥和私钥。该公钥可以为大家所熟知,并用于加密消息。使用公钥加密的邮件只能使用私钥解密。
Zoredache

这两个参考文献都没有暗示您在说@Zoredache。当然,一旦确定了哪个密钥是私有密钥和哪个公共密钥,就决定了使用它的方式。在密钥生成方面,尚未做出此决定。值得一提的是,围绕签名的逻辑完全取决于围绕加密的逻辑,因为签名需要加密。
多米尼克·克罗宁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.