如何解决 SSH Copy-ID 'No Identities Found' 错误

LinuxBeginner
立即练习

介绍

ssh-copy-id 命令是一个非常有用的工具,可以方便地在服务器之间设置基于 SSH 密钥的身份验证。但是,在尝试使用此命令时,你可能会偶尔遇到“/usr/bin/ssh-copy-id: error: no identities found”错误。本教程将指导你完成故障排除和解决此问题的步骤,确保顺利完成基于 SSH 密钥的身份验证过程。在本「实验」结束时,你将了解 SSH 密钥身份验证的工作原理,并能够在你的系统上正确配置它。

了解 SSH 密钥身份验证

在我们深入研究“no identities found”错误进行故障排除之前,重要的是要了解什么是 SSH 密钥身份验证以及它的工作原理。

什么是 SSH 密钥身份验证?

SSH(安全外壳协议)密钥身份验证是一种安全登录远程系统的方法,无需每次都输入密码。它使用一对加密密钥:

  • 保留在你本地机器上的私钥 (private key)
  • 复制到远程服务器的公钥 (public key)

当你尝试连接到远程服务器时,你的 SSH 客户端使用你的私钥来创建签名。服务器使用存储在其 authorized_keys 文件中的公钥来检查此签名。如果签名有效,你无需输入密码即可获得访问权限。

什么是 ssh-copy-id?

ssh-copy-id 命令是一个实用程序,可简化将你的公钥复制到远程服务器的过程。它将你的公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中,从而允许在将来的连接中进行无密码身份验证。

让我们检查一下你的系统上是否已经有任何 SSH 密钥。在你的终端中运行以下命令:

ls -la ~/.ssh

如果你没有看到任何文件,或者 .ssh 目录不存在,请不要担心——我们将在下一步中创建所有内容。

生成 SSH 密钥

如果你没有 SSH 密钥或想要创建新的密钥,你可以使用 ssh-keygen 命令来生成它们。这通常是解决“no identities found”错误的第一步。

创建新的 SSH 密钥对

让我们通过运行以下命令来生成一个新的 SSH 密钥对:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

这个命令:

  • -t rsa 指定要创建的密钥类型 (RSA)
  • -b 4096 指定位长度(更强的加密)
  • -C 添加注释(通常是电子邮件),以帮助识别密钥

当你运行此命令时,系统将提示你:

  1. 输入文件位置以保存密钥(按 Enter 键使用默认位置 ~/.ssh/id_rsa
  2. 输入密码短语(你可以按 Enter 键两次以不使用密码短语,但使用密码短语会增加额外的安全层)

输出应类似于:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/labex/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/labex/.ssh/id_rsa
Your public key has been saved in /home/labex/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:abcdefghijklmnopqrstuvwxyz1234567890ABCD your_email@example.com
The key's randomart image is:
+---[RSA 4096]----+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+

验证 SSH 密钥的创建

现在让我们验证密钥是否已正确创建:

ls -la ~/.ssh

你现在应该在输出中看到私钥 (id_rsa) 和公钥 (id_rsa.pub) 文件:

total 20
drwx------ 2 labex labex 4096 Sep 15 10:10 .
drwxr-xr-x 5 labex labex 4096 Sep 15 09:55 ..
-rw------- 1 labex labex 3389 Sep 15 10:10 id_rsa
-rw-r--r-- 1 labex labex  746 Sep 15 10:10 id_rsa.pub
-rw-r--r-- 1 labex labex  444 Sep 15 10:00 known_hosts

让我们也看看你的公钥文件的内容:

cat ~/.ssh/id_rsa.pub

输出应该是一行以 ssh-rsa 开头,后跟一长串字符,并以你的电子邮件地址或注释结尾。

现在我们已经确认我们的 SSH 密钥存在,我们可以继续下一步:故障排除并解决“no identities found”错误。

了解并解决“No Identities Found”错误

现在我们已经准备好了 SSH 密钥,让我们了解为什么会出现“no identities found”错误以及如何修复它。

错误的常见原因

“no identities found”错误通常由于以下原因之一而发生:

  1. SSH 密钥不存在
  2. SSH 密钥不在默认位置
  3. SSH 密钥的权限不正确
  4. ssh-copy-id 命令找不到任何要使用的公钥

由于我们已经确认我们的 SSH 密钥存在于默认位置,让我们检查权限。

检查和修复 SSH 密钥权限

出于安全原因,SSH 对文件权限非常挑剔。运行以下命令来检查你的 .ssh 目录及其内容的权限:

ls -la ~/.ssh

为了保证适当的安全性:

  • .ssh 目录应具有 700 (rwx------) 权限
  • 私钥 (id_rsa) 应具有 600 (rw-------) 权限
  • 公钥 (id_rsa.pub) 应具有 644 (rw-r--r--) 权限

如果你的权限不正确,你可以使用以下命令修复它们:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

正确使用 ssh-copy-id

现在让我们尝试正确使用 ssh-copy-id 命令。正确的语法是:

ssh-copy-id -i ~/.ssh/id_rsa.pub username@remote_host

其中:

  • -i 指定要使用的身份文件(公钥)
  • username 是你在远程服务器上的用户名
  • remote_host 是远程服务器的主机名或 IP 地址

对于我们的实验 (Lab) 环境,我们将通过使用本地机器来模拟这一点。运行:

ssh-copy-id -i ~/.ssh/id_rsa.pub labex@localhost

系统将提示你输入远程用户的密码。

在桌面环境中打开一个终端窗口,只有桌面环境终端才会设置环境变量。

Retrieve Password

要检索密码,请运行以下命令。

printenv | grep PASSWORD

注意: 你必须在桌面环境终端中运行此命令,而不是从顶部菜单栏打开的终端中运行。

此命令将显示所有包含“PASSWORD”的环境变量。查找包含 LABEX_PASSWORD=... 的行。等号后面的字符是你的密码。

你将输入该密码,公钥将被复制到远程服务器。

如果你看到类似“Number of key(s) added: 1”的消息,则表示你的密钥已成功复制。

验证 SSH 密钥认证

现在我们已经解决了“no identities found”错误,并成功地将我们的 SSH 密钥复制到远程服务器,让我们验证 SSH 密钥认证是否正常工作。

测试 SSH 密钥认证

在真实环境中,你将通过连接到远程服务器来测试 SSH 密钥认证:

ssh username@remote_host

如果你的 SSH 密钥设置正确,你应该能够在不输入密码的情况下登录(除非你为你的密钥设置了密码短语,在这种情况下你需要输入该密码短语)。

对于我们的实验 (Lab) 环境,我们可以通过尝试 SSH 连接到 localhost 来进行测试:

ssh labex@localhost

如果你收到提示,要求你确认连接(因为 localhost 不在你的 known hosts 文件中),请键入 yes

你可能会看到类似这样的消息:

The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:abcdefghijklmnopqrstuvwxyz1234567890ABCD.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

如果系统要求你输入密码,则表示 SSH 密钥认证尚未生效。但是,如果你在不输入密码的情况下成功登录,则表示你的 SSH 密钥认证工作正常。

常见的 SSH 密钥认证问题和解决方案

如果你仍然遇到 SSH 密钥认证问题,以下是一些常见问题和解决方案:

  1. SSH 服务器配置:必须将 SSH 服务器配置为允许公钥认证。通常默认情况下启用此功能,但你可以通过检查远程服务器上的 /etc/ssh/sshd_config 文件来检查:

    grep PubkeyAuthentication /etc/ssh/sshd_config
    

    它应该显示 PubkeyAuthentication yes

  2. 文件所有权:你的主目录和 .ssh 目录必须由你拥有:

    ls -ld ~ ~/.ssh
    

    两者都应显示你的用户名作为所有者。

  3. 调试 SSH 连接:你可以使用 verbose 标志来调试 SSH 连接:

    ssh -v labex@localhost
    

    这将显示有关认证过程的详细信息,这可以帮助识别问题。

SSH 密钥管理最佳实践

以下是一些管理 SSH 密钥的最佳实践:

  1. **使用密码短语 (passphrase)**:生成 SSH 密钥时,请考虑使用密码短语以增加安全性。
  2. 为不同的服务器使用不同的密钥:为了增强安全性,请考虑为不同的服务器或目的使用不同的密钥。
  3. 备份你的密钥:将你的 SSH 密钥备份保存在安全的位置。
  4. 定期轮换密钥:对于敏感环境,请考虑定期轮换你的 SSH 密钥。

通过遵循这些步骤和最佳实践,你可以确保 SSH 密钥认证能够可靠且安全地工作。

总结

在这个实验 (Lab) 中,你学习了如何在使用 SSH copy-id 命令时排除故障并解决“no identities found”错误。我们涵盖了:

  1. 了解 SSH 密钥认证以及 ssh-copy-id 命令的工作原理
  2. 使用 ssh-keygen 命令生成 SSH 密钥对
  3. 检查和修复 SSH 密钥权限
  4. 正确使用 ssh-copy-id 将你的公钥复制到远程服务器
  5. 测试和验证 SSH 密钥认证
  6. SSH 密钥管理的常见问题和最佳实践

掌握了这些技能,你现在可以设置系统之间安全、无密码的 SSH 连接,这对于高效的系统管理和自动化至关重要。SSH 密钥认证不仅比密码认证提供更好的安全性,而且还简化了合法用户的登录过程。

请记住,正确保护你的 SSH 密钥至关重要,因为它们提供对你的系统的直接访问。始终确保你的私钥安全,并考虑使用密码短语 (passphrase) 以获得额外的保护。