这是我最后的办法。我已经花了好几个小时试图解决这里的问题。
情况是这样的:我已将我的私钥从机器 #1 复制到机器 #2。机器 #1 能够使用我的公钥通过 ssh 顺利连接到服务器,但机器 #2 在尝试连接到服务器时给出了以下输出:
$ ssh -vvv -i /home/kevin/.ssh/kev_rsa [email protected] -p 22312
OpenSSH_5.3p1 Debian-3ubuntu6, OpenSSL 0.9.8k 25 Mar 2009
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to 192.168.1.244 [192.168.1.244] port 22312.
debug1: Connection established.
debug3: Not a RSA1 key file /home/kevin/.ssh/kev_rsa.
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug3: key_read: missing keytype
debug3: key_read: missing whitespace
debug3: key_read: missing whitespace
debug3: key_read: missing whitespace
debug3: key_read: missing whitespace
...
Permission denied (publickey).
显然我省略了更多调试输出,我可以根据要求提供。但我确信它不喜欢我的私钥文件。
我还怀疑这与我如何将其从机器 #1 复制到机器 #2 有关。我将私钥中的文本复制/粘贴到闪存驱动器上。这可能是问题所在,但是,当我在另一个有效的私钥文件上复制此方法并对原始文件和复制/粘贴的文件进行差异分析时,它们是相同的。
我一直在为此苦苦挣扎。如果我能得到更多关于它为什么不喜欢我的密钥的信息,我确信我可以解决这个问题。有人对此有什么想法吗?是否有一些元数据告诉 ssh 文件实际上是 RSA 密钥?
答案1
根据我的经验,最常见的两个基于密钥的身份验证错误是
$HOME/.ssh
目录的权限范围过宽- 将公钥复制到远程系统时出错
文件权限
OpenSSH 做了很多工作来保护您免受自身攻击。对用户影响最大的方式是对有权访问本地 ssh 文件夹的人实施严格限制。您实际上只希望您自己访问该目录。好吧,任何具有 uid=0 的人都可以访问,但是没有好办法可以解决这个问题。因此,您需要做的只是更改您的权限:chmod -R go-rwx ~/.ssh
这将从除所有者之外的所有用户中删除对 .ssh 目录下任何文件的读取、写入和执行权限,即你。
授权密钥问题
包含公钥的文件通常$HOME/.ssh/authorized_keys
必须符合非常具体的形式,以便 SSH 了解如何接受私钥。每个密钥必须至少包含 2 个字段
- 使用的密钥类型(RSA、DSA、RSA1 等)
- 钥匙
每个键及其所有选项和组件都必须在此文件中每行列出。由于键通常很长,它们通常会换行并在终端上显示为两行。这有时会在尝试复制/粘贴时造成混乱,因为有时屏幕上键换行的位置会插入一个或多个换行符。修复此问题能对于 shell 初学者来说可能有点棘手。
尝试运行
wc -l ~/.ssh/authorized_keys
这将打印出文件中的行数。将该数字与您期望文件中的密钥数量进行比较。如果您只接受这一个密钥,您也可以复制公钥文件,因为它的格式与您的授权密钥文件相同。或者
scp -p ~/.ssh/kev_rsa.pub remotehost:~/.ssh/authorized_keys
,如果您在同一系统上有公钥,您可以执行
cat ~/.ssh/kev_rsa.pub >> ~/.ssh/authorized_keys
此外,查看远程主机上的日志文件,看看那里是否报告了任何错误。文件很可能是/var/log/secure.log
或/var/log/auth
。
答案2
不过,您可能需要为计算机 2 生成新的密钥对才能连接到服务器。公钥通常会列出生成它们的用户和计算机名称。这应该在服务器上的 authorized_keys 文件中显而易见。
答案3
您给出的调试消息意味着读取私钥文件时假设它实际上是公钥/授权主机文件。这可能不是致命错误(即使连接正常,我也会收到此类消息)。它是否提到了“提供”或“我们已发送”?
答案4
尝试比较两个服务器之间的 ssh 配置文件。
例如 cat /etc/sshd_config