Vagrant SSH 鉴权失败

173

SSH认证的问题:

==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: bridged
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Authentication failure. Retrying...
    default: Error: Authentication failure. Retrying...
    default: Error: Authentication failure. Retrying...
    default: Error: Authentication failure. Retrying...
    default: Error: Authentication failure. Retrying...

我可以通过 Ctrl+C 退出身份验证循环,然后手动成功进行ssh。

我在虚拟机中执行了以下步骤:

  • 启用了所有用户的远程登录

  • 使用0700权限创建了~/.ssh目录。

  • 使用0600权限创建了~/.ssh/authorized_keys文件。

  • 此公钥粘贴到~/.ssh/authorized_keys中。

我还尝试使用私有(hostonly)网络而不是公共(bridged)网络,使用Vagrantfile中的以下行:

config.vm.network "private_network", ip: "172.16.177.7"

我得到相同的输出(除了Adapter 2: hostonly),但无法手动ssh。

我还尝试过 config.vm.network "private_network", ip: "10.0.0.100"

我还尝试在Vagrantfile中设置config.ssh.password。这确实输出了SSH auth method: password,但仍无法通过身份验证。

我还尝试重新构建虚拟机并重新检查上述所有内容。

其他人的成功配置,所以肯定是我做错了些什么。

我在这个帖子中找到了一些线索并启用了GUI,但没有帮助。

32个回答

187

一般信息: 默认情况下,要ssh连接您只需要使用

用户:vagrant 密码:vagrant

https://www.vagrantup.com/docs/boxes/base.html#quot-vagrant-quot-user

首先, 请尝试: 查看您机器配置中的vagrant insecure_private_key是什么

$ vagrant ssh-config

示例:

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/Users/konst/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

http://docs.vagrantup.com/v2/cli/ssh_config.html

第二步,执行: 用你个人电脑中的私钥替换insecure_private_key文件的内容

或者,也可以: 将其添加到Vagrantfile文件中:

Vagrant.configure("2") do |config|
  config.ssh.private_key_path = "~/.ssh/id_rsa"
  config.ssh.forward_agent = true
end
  1. config.ssh.private_key_path是您的本地私钥。
  2. 您的私钥必须对本地ssh-agent可用。您可以使用 ssh-add -L 检查。如果未列出,请使用 ssh-add ~/.ssh/id_rsa 添加它。
  3. 不要忘记将您的公钥添加到 Vagrant VM 上的 ~/.ssh/authorized_keys 中。您可以通过复制和粘贴或使用类似ssh-copy-id (用户:root 密码:vagrant 端口:2222)ssh-copy-id '-p 2222 root@127.0.0.1' 的工具来执行此操作。

如果仍然无法正常工作,请尝试以下方法:

  1. c:\Users\USERNAME\.vagrant.d\insecure_private_key 删除 insecure_private_key 文件。

  2. 运行 vagrant up(vagrant 将生成一个新的 insecure_private_key 文件)。

在其他情况下,只需在 Vagrantfile 中设置forward_agent,可能会有所帮助:

Vagrant::Config.run do |config|
   config.ssh.forward_agent = true
end

有用的:

配置 git 可以通过git-scm.com进行。

安装此程序并创建个人系统私钥后,将位于您的配置文件路径:c:\users\USERNAME\.ssh\id_rsa.pub

PS:最后 - 建议您查看Windows 10上的Ubuntu


5
在我的情况下,问题出在config.ssh.private_key_path = "~/.ssh/id_rsa"这一行,必须将其删除才能使配置生效。 - holms
所有这些都可以工作,但我还必须删除我的已知主机条目。当我移动位置并登录时,我遇到了问题。 - Pumphouse
2
@shilovk +1 谢谢你,非常感谢你。"Second, do" 的方法起了很大的作用。再次感谢你的帮助! - whitesiroi
1
请将文件 insecure_private_key 的内容更改为您个人系统私钥的内容,对我来说已经足够了。非常感谢! - Adrian Kalinowski
1
我的解决方法是删除insecure_private_key,然后执行任何 Vagrant命令(例如vagrant destroy),这将重新生成密钥。我处于这种状态的原因可能与在Windows/Cygwin上尝试交换密钥以使用纯ssh补丁有关。 - Richard
显示剩余2条评论

88

对我来说以上的方法都不起作用。不知何故,该框中的authorized_keys文件中添加了错误的公钥。

如果您仍然可以使用vagrant密码(密码为vagrant)ssh到该框,即

ssh vagrant@localhost -p 2222

然后,从https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub复制公钥内容,并使用以下命令将其添加到authorized_keys文件中:

echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key" > .ssh/authorized_keys

完成后退出虚拟机,然后再尝试运行vagrant ssh。现在应该可以正常工作了。


4
在更新了authorized_keys文件后,运行vagrant reload命令。 Vagrant将自动检测到不安全的密钥并重新生成它。之后应该就可以正常工作了。 - ProfileTwist

49
如果您在vagrant 1.8.5上遇到此问题,请查看github上的此线程:

https://github.com/mitchellh/vagrant/issues/7610

它基本上是由权限问题引起的,解决方法很简单。
vagrant ssh 
password: vagrant 
chmod 0600 ~/.ssh/authorized_keys
exit

然后

vagrant reload 

提示:此问题仅影响CentOS,而Ubuntu工作正常。


假设我有一个 Vagrant 文件,需要用到 5 台机器。每次重新运行时,我都需要对每台机器进行操作。有没有一种方法可以永久地解决这个问题,在使用 CentOS 的给定 Vagrant 设置中? - Pol
刚刚不得不升级Vagrant到1.8.6版本,之前使用的是1.8.5版本,存在一个bug。 - Pol

44

在虚拟机/客户机中运行以下命令:

wget https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub -O ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R vagrant:vagrant ~/.ssh

然后执行 vagrant halt 命令。这将删除并重新生成您的私钥。

(这些步骤假定您已经创建或已经拥有了位于您的主文件夹下的~/.ssh/和~/.ssh/authorized_keys目录。)


对我来说没有用。使用带有Ubuntu 20.04客户端的Vagrant版本2.2.15。 - Buttle Butkus

27
在我的经验中,这是新的vagrant机器常见的问题之一。远比修改配置本身更容易解决的方法是,在客户端手动创建所需的ssh密钥,然后在主机上使用私钥。
  1. 登录vagrant虚拟机:vagrant ssh,使用默认密码vagrant
  2. 创建ssh密钥:例如,ssh-keygen -t rsa -b 4096 -C "vagrant"(如GitHub相关指南所建议)。
  3. 重命名公钥文件(默认为id_rsa.pub),覆盖旧文件:mv .ssh/id_rsa.pub .ssh/authorized_keys
  4. 如果需要,重新加载ssh服务:sudo service ssh reload
  5. 将私钥文件(默认为id_rsa)复制到主机:例如,使用cat和剪贴板的良好组合,cat .ssh/id_rsa,然后复制(可能存在更好的方法,请自行发明!)。
  6. 从vagrant虚拟机注销:logout
  7. 通过查看其配置找到vagrant当前使用的私钥:vagrant ssh-config(例如查找ÌdentityFile "/[...]/private_key")。
  8. 用主机上创建的私钥替换当前私钥:例如,nano /[...]/private_key并从剪贴板粘贴,如果其他方法都失败了。但是请注意,如果您的private_key不是特定于项目的,而是由多个vagrant虚拟机共享的,则最好自己配置路径,以免破坏其他完美工作的虚拟机!更改路径很简单,只需在Vagrantfile中添加一行config.ssh.private_key_path = "path/to/private_key"即可。此外,如果您使用PuPHPet生成的虚拟机,可以将私钥存储到文件puphpet/files/dot/ssh/id_rsa中,它将自动添加到Vagrantfile的ssh配置中。
  9. 测试设置:vagrant ssh现在应该可以正常工作。
如果是这种情况,恭喜您,登出并在需要时运行“vagrant provision”,然后继续进行有意义的任务。
如果仍然遇到问题,可以在ssh命令中添加verbose标志以便于调试。您可以在双破折号之后传递该选项(或任何其他选项)。例如,键入“vagrant ssh -- -v”。随意添加所需数量的v,每个v都会提供更多信息。

这个答案帮了我很多。分享一下我的经验:不知怎么的(可能是在安装Capistrano时,但没有确认),我的guest VM上的authorized_key文件被删除了。使用以下步骤重新创建它可以解决问题,现在我可以无需密码提示就可以ssh进去了。谢谢。 - Martin Joiner
在从主机中删除了公钥和私钥之后,我能够使用此过程重新执行并解决问题。 - vrwired
使用Git可以使文件内容的传输更快。 - lloan
1
这个对我很有用,在尝试了其他所有方法失败之后。非常感谢! - nikolas
这对我有用。我所做的唯一不同之处是使用 ssh vagrant@10.0.0.0 -p 22 (password: vagrant) 登录到虚拟机,因为 vagrant ssh 对我来说无法工作。10.0.0.0 是我在 vagrantfile 中设置的私有 IP 地址。 - turrican_34
我使用PHP内置的Web服务器从Virtualbox传输密钥。 - Dpetrov

17

无法运行 vagrant up,因为它会卡住并超时?最近我遇到了一次“笔记本电脑进水事件”,不得不迁移到新设备上(顺便说一下,是在 MAC 上)。我成功地将所有项目都恢复正常运行,除了一个使用 vagrant 的项目。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 8000 (guest) => 8877 (host) (adapter 1)
    default: 8001 (guest) => 8878 (host) (adapter 1)
    default: 8080 (guest) => 7777 (host) (adapter 1)
    default: 5432 (guest) => 2345 (host) (adapter 1)
    default: 5000 (guest) => 8855 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...

它无法进行身份验证,重试了多次最终放弃了。


以下是我用三个步骤使它恢复正常的方法:

1 - 找到Vagrant使用的IdentityFile

$ vagrant ssh-config

Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/ned/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

2 - 检查IdentityFile中的公钥:

$ ssh-keygen -y -f <path-to-insecure_private_key>

它会输出类似于这样的结果:

ssh-rsa AAAAB3Nyc2EAAA...9gE98OHlnVYCzRdK8jlqm8hQ==

3 - 使用密码vagrant登录Vagrant客户机:

ssh -p 2222 -o UserKnownHostsFile=/dev/null vagrant@127.0.0.1

The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established.
RSA key fingerprint is dc:48:73:c3:18:e4:9d:34:a2:7d:4b:20:6a:e7:3d:3e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[127.0.0.1]:2222' (RSA) to the list of known hosts.
vagrant@127.0.0.1's password: vagrant
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-31-generic x86_64)
...

注意: 如果vagrant guest配置为禁止密码验证,则需要打开VBox的GUI,双击guest名称,以vagrant/vagrant登录,然后sudo -s并编辑/etc/ssh/sshd_config,查找PasswordAuthentication no行(通常在文件末尾),将no替换为yes并重新启动sshd(即systemctl reload sshd/etc/init.d/sshd restart)。

4- 将公钥添加到/home/vagrant/authorized_keys文件中。

$ echo "ssh-rsa AA2EAAA...9gEdK8jlqm8hQ== vagrant" > /home/vagrant/.ssh/authorized_keys

5 - 退出 (CTRL+d) 并停止 Vagrant 客户机,然后重新启动它。

重要提示:如果您使用任何配置工具(例如 Ansible 等),请在重新启动客户机之前禁用它,因为由于使用不安全的私钥,Vagrant 将认为您的客户机未被配置。 它将重新安装密钥,然后运行您的配置工具!

$ vagrant halt
$ vagrant up

希望现在你已经举起了双臂...

我从Ned Batchelders的文章中获取了这个内容,只做了一点修改 - Ned,你真是太棒了!


您真是个天才,或者说Ned Batchelders是。无论哪种方式,它都解决了我的问题! - Adsy2010
我以为这个方法也能解决我的问题,但是执行 vagrant destroy 后再执行 vagrant up 却没有保留这些更改。MacOS Catalina/Big Sur 给我带来了很多问题,但最终,卸载 VirtualBox/Vagrant,确保删除剩余文件夹,再重新安装让我重新运行起来。对于 Catalina 及以上版本,我必须从 Vagrant wiki 上进行内核扩展(Kext)更新:https://www.google.com/url?q=https://www.virtualbox.org/wiki/Mac%2520OS%2520X%2520build%2520instructions&sa=D&source=editors&ust=1624061160498000&usg=AOvVaw02udTpVoDzajEDX64IJFcD - AZRckCrwler

11

如果您试图强制使虚拟机默认使用根用户进行SSH,则也可能发生这种情况。

例如,在您的Vagrantfile中使用以下配置可能会导致此故障:

config.ssh.username = 'root'
config.ssh.password = 'vagrant'
config.ssh.insert_key = 'true'

解决方案:注释掉那些行,然后再尝试一次!


3
只针对我而言,仅设置 config.ssh.username = "vagrant" 和 config.ssh.password = "vagrant" 就解决了问题。 - psychok7

10
我发现了一个解决Win 8.2键盘混乱问题的方法,但在这里提到的所有方法都没有成功。有趣的是,VirtualBox、Vagrant和box在Win 7 Ultimate上完全相同的组合却没有任何问题。
我通过在Vagrantfile中添加以下命令来切换到密码验证:
config.ssh.password = "vagrant"
config.ssh.insert_key = false

请注意,我不确定这是唯一需要更改的内容,因为我已经执行了以下操作:
  1. I generated a new RSA key pair and changed authorized_keys file accordingly (all in the virtual machine, see the suggestions above and elsewhere)

  2. I copied the private key to the same directory where Vagrantfile resides and added

     config.ssh.private_key_path = "./id_rsa"
    

但我相信这些变化是无关紧要的。我花了很多时间尝试,所以出于明显的原因,我没有改变工作配置 :)


10

问题:我在配置的一个计算机上遇到了 ssh 认证错误,而原始计算机却没有问题。

对我来说,问题是我的 .vagrant/machines/default/virtualbox/private_key 文件中缺失了私钥。我复制了原始计算机相同位置处的私钥文件,问题迎刃而解!


作为一名优秀的开发者,我想补充一点,我们会将.vagrant文件提交到git中...因此,通过快速的git checkout命令,可以轻松解决问题! - Ian Vaughan

6

对我来说,这个问题是通过更改vagrant主目录下(即“~vagrant/.ssh”).ssh文件夹的权限来解决的。我想当我为我的应用程序设置ssh密钥时把权限搞乱了。

看起来,“authorized_keys”文件必须仅对“vagrant”用户具有“rw”权限,因此“chmod 600 authorized_keys”;同样适用于目录本身及其父目录:

所以:

chmod 600 authorized_keys
chmod 700 .
chmod 700 ..

只有在我恢复了所有这些权限之后,vagrant ssh才开始正常工作。

我认为这与ssh安全有关。如果证书可以被当前用户以外的任何方式访问,它会拒绝识别证书,因此vagrant的登录尝试会被拒绝。


有时候我无法更改权限,即使运行sudo chmod 600 authorized_keys,但它仍然保持不变。我认为这与它在Windows上共享有关。 - Dariux
有时候这种情况会发生在目录位于共享文件夹上,例如/vagrant/... - robert
2
除了我的答案之外,我想投票支持这个答案。在我的另一台机器上,正是这个问题——/home/vagrant/.ssh目录的所有者错误。它是“root:root”,但必须是“vagrant:vagrant”。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接