如何将SSH密钥添加到authorized_keys文件?


185

我在Amazon EC2上有一台Ubuntu服务器,用于开发,今天我愚蠢地从~/.ssh/authorized_keys文件中清除了所有内容。幸运的是,我已经打开了SSH,所以我仍然可以连接,并且可以修复文件,但是当我尝试将密钥文件放回原位时,它不起作用。我仍然从本地计算机上的服务器获得拒绝权限。

authorized_keys拥有600的权限。我尝试将SSH密钥附加到ssh-rsa并关闭ssh-rsa。我还尝试过将SSH密钥全部设置为一行,但这也不起作用。

还有其他我需要做的事情,例如如何重新加载文件吗?


3
多年后,这种“似乎”仍然有意义且活跃。我只想做个观察,谈论一下躲过了一个子弹:“幸运的是我已经打开了SSH,所以我仍然可以连接[..]”-嘘!; dP
Nostromov

1
这个帖子是在我生日那天编辑的,两个月前在我生日那天救了我。
ytpillai

Answers:


198

永远不要将文件及其内容从-----BEGIN RSA PRIVATE KEY-----服务器上开始保存,这就是您的私钥。相反,你必须把公共钥匙插入~/.ssh/authorized_keys文件。

这种公共密钥具有.pub在使用中产生的扩展ssh-keygen,其内容与开始ssh-rsa AAAAB3。(在此问题的答案中描述了二进制格式)。

~/.ssh在服务器上的权限应为700。文件~/.ssh/authorized_keys(在服务器上)的模式应为600。客户端上的(专用)密钥的权限应为600。

如果私钥没有受到密码保护,并且将其放在服务器上,建议您生成一个新的私钥:

ssh-keygen -t rsa

如果您完全确定没有人可以从服务器中恢复已删除的私钥,则可以跳过此步骤。

如果这没有帮助,运行ssh与更多的详细程度选项:

ssh -vvv user@example.com

在服务器端,您可以查看/var/log/auth.log详细信息。


1
使用Amazon EC2服务器,我得到的只是私钥(key.pem)。我在任何地方都没有公共密钥。
戴夫·

3
@戴夫龙:您必须使用生成新的密钥ssh-keygen -t rsa,并把新创建的id_rsa.pub文件在~/.ssh/authorized_keys您的服务器上。另请参阅docs.amazonwebservices.com/AWSEC2/latest/UserGuide/…– Lekensteyn 2011
6

15
@DaveLong:您可以随时从私钥生成公钥。您可以使用以下命令轻松完成此操作: ssh-keygen -y -f key.pem > key.pub
Morgan Blackthorne

5
@MorganBlackthorne确实如此,我建议您生成私钥,而不是从远程来源接受私钥。您不能完全确定私钥没有泄漏。
Lekensteyn

2
@Gerrat固定²。
Lekensteyn 2014年

175

将公钥安装到远程计算机的另一种方法authorized_keys

cat ~/.ssh/id_rsa.pub | ssh USER@HOST "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

一些优点:

  • 不需要ssh-copy-id安装。

  • 保证mkdir在尝试附加id_rsa.pub到 之前起作用authorized_keys


10
您的回答帮助我在多台远程计算机上执行了此操作,而没有任何其他软件包,谢谢。
2014年

这不能保证将使用正确的权限创建“〜/ .ssh”目录和“〜/ .ssh / authorized_keys”文件。
尼克

1
@尼克,我有这个问题。因此,那么也许真的必须首先检查它们的存在,如果丢失,请使用chmod(700 /文件夹,600 /文件)正确创建,然后再添加?那么,也许它不能成为一个班轮吗?
AnneTheAgile 2014年

7
@AnneTheAgile我认为将mkdir -p ~/.ssh@MariusButuc给出的答案的一部分更改umask 077 && mkdir -p ~/.ssh为确保其正常工作所需要做的一切。
尼克

1
ty @尼克!我会去的。
AnneTheAgile 2014年

128

如果您具有基于登录的身份验证,则用于ssh-copy-id将您的公钥附加到远程服务器。

ssh-copy-id user@host

1
在Mac上,这似乎不是有效的命令,这就是我的客户端计算机。
戴夫·


13
在OSX上,您可以安装brew:brew install ssh-copy-id
phil

在Macports上,可以使用来安装此命令sudo port install openssh +ssh_copy_id。在+ssh_copy_id与ssh_copy_id变种OpenSSH安装。
Stefan Lasiewski 2014年

6
请注意,phildawson.tumblr.com上的说明要求您以root用户身份安装不受信任的软件。除非您知道可以信任作者,否则这是非常危险的,也是被黑客入侵的好方法。
Stefan Lasiewski 2014年

38
local> scp .ssh/id_dsa.pub remote.com:
local> ssh remote.com
remote> cat id_dsa.pub >> .ssh/authorized_keys
remote> rm id_dsa.pub
remote> exit

16

最简单的方法是复制并粘贴...

首先查看/复制本地公钥的内容,id_rsa.pub包括开头的“ ssh-rsa”,直到其以您的电子邮件地址结尾:

cat ~/.ssh/id_rsa.pub

然后authorized_keys在服务器上进行编辑,然后将剪贴板中的内容粘贴到该文件中其他任何键下方:

nano ~/.ssh/authorized_keys

然后保存Ctl+O,退出文件Ctl+X,退出SSH会话,exit然后尝试重新登录以确认其正常工作。如果不要求输入密码,它就可以工作。


5

我认为我可以为此做出贡献,因为它专门针对AWS实例,并且所有答案仅将问题视为Linux问题,就好像它是硬件一样。您需要了解的第一件事是,永远不要将EC2实例视为硬件。这只会为您创造更多的工作。这是我看到人们使用AWS的最大障碍。对您的实例进行AMI,然后将所需的密钥注入新实例。cloud-init将为您解决这个问题。更详细地讲,您要做的就是在原始AMI之外创建新实例时使用正确的公钥。如果像在批准的答案的评论中一样想要生成自己的pub和pem文件密钥对,AWS为您提供了上载公钥以供EC2使用的选项。

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#how-to-generate-your-own-key-and-import-it-to-aws


3

保存公钥后,应将私钥保存到PC上的目录和文件中。在腻子ssh的auth部分中,您应该指向保存在桌面上的私钥文件。它将起作用。这个对我有用。


1
如果Windows控制台可以将所有ssh功能添加到其解释器中,我就是喜欢它
Dennis

2

在要放置密钥的远程计算机上获取一个Shell,然后可以运行此单行代码创建必要的文件和目录,设置它们的权限并将密钥附加到文件中。当然,您必须更改KEYGOESHERE下面的部分及其后的注释。

mkdir -p ~/.ssh && chmod 700 ~/.ssh && touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && echo "ssh-rsa KEYGOESHERE user@remotehost or note" >> ~/.ssh/authorized_keys

1

这是一个变体,您可能会在文本文件中有一个公用密钥文件名列表,而大批公用密钥文件也位于同一目录中。

如果您要提供大量要导入的公钥文件列表,则此变体会有所帮助:-)

$ for i in $(cat ListOfPubKeyFiles.txt) ; do cat $i | ssh User@Hostname "cat >> ~/.ssh/authorized_keys"; done
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.