如何通过 SSH 使用 RSA 密钥对登录主机?
通过RSA认证SSH实现免密登录,当你需要使用一些自动化脚本(如 rsync )时,这将尤为有用。除了详细配置外,本文还进行一些错误排查
关于SSH
首先,无论是Linux还是Windows都同时可以作为ssh的客户端或者ssh的服务端。我出过一篇详细教程可供参考:
配置sftp&&ssh服务
Step1:生成密钥对
这些操作都在客户端上进行。(客户端是发送请求的那方)
1 | ssh-keygen -t ed25519 -C "your_email@example.com" |
这里使用的 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来说,你需要进行这步操作:

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

其中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 | chmod 700 ~/.ssh |
这个命令将文件权限设置为只有所有者可以读取和写入。 完事了再进行测试连接即可
对于Windows:
在 cmd 或者 PowerShell 中使用如下命令即可:
1 | icacls C:\Users\你的用户名\.ssh\id_rsa /reset |
2. 配置文件问题
前面的步骤都没问题,但是 ssh 时候还是要求输入密码?
这有可能是公钥认证被禁用了,我们来到这里:
1 | vim ~/.ssh/authorized_keys |
找到这个配置项,设置为 yes:
1 | PubkeyAuthentication 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 进行许可。