如何通过 SSH 使用 RSA 密钥对登录主机?

三葉Leaves Author

通过RSA认证SSH实现免密登录,当你需要使用一些自动化脚本(如 rsync )时,这将尤为有用。除了详细配置外,本文还进行一些错误排查

关于SSH

首先,无论是Linux还是Windows都同时可以作为ssh的客户端或者ssh的服务端。我出过一篇详细教程可供参考:
配置sftp&&ssh服务

Step1:生成密钥对

这些操作都在客户端上进行。(客户端是发送请求的那方)

1
ssh-keygen -t ed25519 -C "your_email@example.com"
Note

这里使用的 ed25519 是相较于 RSA 更优的算法,对于不支持此算法的老旧系统,也可以使用 ssh-keygen -t rsa -b 4096 -C "你的邮箱"代替,获得更好的兼容性。
-C 后的部分不一定要填邮箱,只是一个注释,为了表明这是干嘛用的罢了。

邮箱替换成你实际的邮箱即可
一般情况下,你一路按Enter就行,最后会给你rsa图像,如下:

正常的情况
正常的情况

如果顺利进行,那么你就可以进入下一步了。
然而有时候,就连这一步都会出问题。我使用的是群晖NAS,而群晖本身对home这个目录有一种多用户管理,这往往会造成很多困惑(当时我是真被他给搞麻了,因为他改了home的策略,弄得我一头雾水),比如情况可能如下:

1
/var/services/homes/leaves/.ssh:No such file or directory

这里就必须搞清楚一件事:
对于Linux,公钥和私钥都固定在这个路径:home/.ssh/,有时被写做~/.ssh,这个.ssh目录通常还会被隐藏,无法通过ls查看。
当你的命令提示符像这样:leaves@Webbernas:/时,你可以使用cd变更到这种状态:leaves@Webbernas:~$,这其实就是进入了你的 home 。如果你能进入这个目录,那通常问题都不大,即便没有.ssh文件夹,你也可以自己mkdir一个,但问题就在于有时你进不了,比如对于群晖的DSM来说,你需要进行这步操作:

在群晖界面启用home目录
在群晖界面启用home目录

这简直就是个天坑,有违于市面上广为流传的各种教程和勘误,问 GPT 也无果,天知道我是怎么发现这个的。如果你也遇到了类似的问题,这是个很好的警示:快去读你硬件提供商或者你所用的定制版Linux系统(就比如群晖的DSM)的帮助文档 ,他会解释自己对自己的系统做了什么(群晖的文档可以看这里:如何通过 SSH 使用 RSA 密钥对登录 DSM? - Synology 知识中心

Step2:复制公钥到远程服务器:

一个正常的.ssh文件夹(通常在home文件夹里,且是隐藏文件夹,可以用cd进入)可能长这样:

.ssh文件夹结构
.ssh文件夹结构

其中authorized_keys是用来存他人的公钥的,id_rsa是你的私钥,id_rsa.pub是你的公钥

我们要做的就是把自己的id_rsa.pub的信息复制进目标服务器的authorized_keys里,这里我们可以在自己的电脑上(也就是客户端)用这个命令:

1
ssh-copy-id -p 40022 user@host

如果没有 ssh-copy-id,也可以用这个:

1
cat ~/.ssh/id_rsa.pub | ssh -p 40022 leaves@192.168.2.248 'cat >> ~/.ssh/authorized_keys'

其中:

  • -p参数指定了ssh用的端口号(默认22),我这里是自定义的40022,对方的ssh端口号是什么就填什么
  • leaves是我在服务器那边的用户名,替换成你自己的。
  • 192.168.2.248是服务器的ip,这个公网ip还是私网ip都无碍
    执行以后会要求你输一遍你在对方服务器上的密码,完事以后没报错那就是命令完成了。

如果出问题了,你可以手动去服务端那边检查~/.ssh/authorized_keys这个文件的情况,遇到问题了可以往前翻这篇教程,step1里有说

Step3:测试连接

这步也有几个坑,首先,你应当使用这个命令:

1
ssh username@hostIP -p 22
  • 22替换成对方实际的ssh端口
  • username替换成你在对方服务器上的用户名,不要忘记加username!
    或者用这个命令:
1
ssh -i ~/.ssh/id_rsa username@hostIP -p 22

这可以指定连接对方使用的私钥文件。
通常这时不需要输入密码,就已经可以连上服务器了,然后你会发现你的命令提示符已经变成你在对方主机上的账号,那么就大功告成了!

错误解决

1. 私钥文件权限问题

然而有时,又有这样的报错:

权限设置错误导致问题
权限设置错误导致问题

这个说人话就是你私钥所在目录的chmod权限没弄好,权限太过宽松,有安全风险,所以他给你禁止了。那么我们重新设置一些权限:

对于Linux:

更改私钥文件权限和 .ssh 目录权限

1
2
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

这个命令将文件权限设置为只有所有者可以读取和写入。 完事了再进行测试连接即可

对于Windows:

在 cmd 或者 PowerShell 中使用如下命令即可:

1
2
3
icacls C:\Users\你的用户名\.ssh\id_rsa /reset
icacls C:\Users\你的用户名\.ssh\id_rsa /inheritance:r
icacls C:\Users\你的用户名\.ssh\id_rsa /grant:r "%USERNAME%":RW

2. 配置文件问题

前面的步骤都没问题,但是 ssh 时候还是要求输入密码?

这有可能是公钥认证被禁用了,我们来到这里:

1
vim ~/.ssh/authorized_keys

找到这个配置项,设置为 yes

1
PubkeyAuthentication yes

将配置项设置为 yes
将配置项设置为 yes

完成后,别忘了更新配置:

1
sudo systemctl restart ssh
  • 标题: 如何通过 SSH 使用 RSA 密钥对登录主机?
  • 作者: 三葉Leaves
  • 创建于 : 2024-11-13 00:00:00
  • 更新于 : 2026-03-16 12:05:05
  • 链接: https://blog.oksanye.com/9224400cbc96/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论