我脑子里想的都是公钥和私钥。当你在亚马逊的 EC2 服务上创建一个云服务器(实例)然后想要通过 SSH 连接到它时,亚马逊要求你下载一个私钥来建立连接。公钥/私钥背后的想法难道不意味着亚马逊应该要求你下载一个公钥吗?
此外,如果我为客户设置了一个 SFTP 服务器,我应该在服务器上安装他们的密钥还是从服务器上给他们一个密钥?无论哪种情况,它应该是公钥还是私钥?
答案1
更深入地思考一下身份验证过程,什么需要保密?亚马逊知道密钥的公开部分,并且任何人可以知道公开的一半。密钥对的公开部分与私有部分匹配时,表示使用私有部分进行身份验证。
亚马逊为您生成密钥对时提供给您的私钥只有在您是唯一拥有它的人的情况下才有用。如果它不是秘密,那么任何知道它的人也可以向持有密钥对公钥部分的任何人进行身份验证。
无论是谁正在认证必须持有私人的一半。如果世界上每个人都可以通过持有密钥的公钥部分来验证您的身份,那么就可以了,但只有您才能控制密钥的私钥部分。
答案2
亚马逊提供密钥生成服务,因为某些操作系统(咳,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 文件中。顾名思义,私钥是私有的。
答案3
公钥认证的工作方式可能与你的想法相反。公钥加密消息,私钥解密消息。服务器存储帐户持有者的公钥并使用它来加密消息。只有私钥持有者才能解密该消息。
如果你向某人发送了一个用其公钥加密的秘密,如果他们能告诉你这个秘密是什么,那么你就知道他们拥有匹配的私钥。然后用户就通过了身份验证。
出于安全原因,AWS 要求您下载并保存私钥,因为他们不会存储它。由于私钥未存储在 AWS 的任何地方,因此您可以确信您的 EC2 实例是安全的。
答案4
从某种意义上说,这并不重要。私钥/公钥对由两部分组成,其中哪部分是公钥由您决定。如果使用一个密钥加密了某些内容,则需要另一个密钥来解密。如果您公开发布了一个密钥而没有发布另一个密钥,则私钥就是您未发布的密钥。
回到你的实际问题:亚马逊给你的密钥可能是为了让你控制自己的资源,所以不应该把它交给别人。在这种情况下,你必须相信亚马逊有你的私钥,至少在设置时间足够长的时间里。
如果您希望客户以这种方式登录,您需要他们向您提供他们愿意与您共享的密钥,也就是他们的公钥。您将其安装在服务器上的 authorized_keys 中,这实际上是在说“任何拥有与此公钥匹配的私钥的人都可以访问此资源”。