ssh 公钥认证是 ssh 认证的方式之一。
通过公钥认证可实现 ssh 免密码登陆,Github 也可以通过公钥进行认证的。
文件目录
不论是 Windows
、Mac
还是 Linux
,在用户目录下,有一个 .ssh
的目录(如果在生成 SSH KEY
的时候不指定目录,就会放到例如 /Users/xuan/.ssh
这个目录下)
在这个目录下就是和该用户 ssh 配置相关的文件,主要有如下几个
- id_rsa 私钥文件,不要给他人
- id_rsa.pub 公钥文件,用来验证
- authorized_keys 存放其他机器公钥,可以免密登陆这台计算机
- known_hosts 存放已经验证过密钥的网站
密钥使用
使用命令生成密钥
在命令行输入 $ ssh-keygen
可用来生成 ssh 公钥认证所需的公钥和私钥文件。
即 id_rsa
和 id_rsa.pub
两个文件
然后回车默认设置即可看到在.ssh 文件中生成了需要的内容
使用 id_rsa.pub 免密码登录
- 对于 GitHub|Coding 这样的网站
在网站找到个人设置的 SSH 公钥设置,将id_rsa.pub
的内容添加进去,在进行git clone
等操作拉取SSH 类型的 Remote 地址仓库
时便可以不需要输入密码。 - 想要免密码登陆某台计算,例如某个服务器
如果你想要可以免密登陆某台计算机,则需要将自己的公钥的内容拷贝到需要连接的电脑上的~/.ssh/authorized_keys
中,可以使用文本编辑器复制粘贴,也可以使用命令$ cat id_rsa.pub >> ~/.ssh/authorized_keys
- 需要注意的是
~/.ssh/authorized_keys
的权限是 600,否则可能 client 进行 ssh 的时候需要输入密码 - 添加完成之后就可以直接使用 ssh 命令进行登录了。eg.
ssh root@192.168.0.101
已存记录的删除方法
之前在使用树莓派的时候遇到了一个问题,树莓派的工作环境在变动,有两个不一样的电脑对树莓派进行 ssh 连接,但是由于路由器分配 ip 的时间不同,出现了第二台电脑在某一时刻分配到了之前第一台电脑的 ip,但是树莓派的
know_hosts
文件中记录的是之前的电脑的认证信息,所以会出现第二台电脑验证错误情况。
在这里需要清除原有公钥信息,重新输入密码进行链接。在树莓派上使用命令 $ ssh-keygen -R 192.168.1.112
,然后就可以重新 ssh 输入密码连接。
SSH 公钥登陆的过程
- 客户端发出公钥登陆的请求
ssh user@host
- 服务端返回一段随机字符串
- 客户端用私钥
Private Key(id_rsa)
加密这个字符串,再发送回服务端 - 服务端用
~/.ssh/authorized_keys
里面存储的公钥Public Key
去解密收到的字符串。如果成功,就表明这个客户端是可信的,客户端就可以成功登陆
多电脑使用同一个 SSH KEY
每次自己换电脑总是很麻烦,需要自己重新生成一对 KEY
,然后传到网上。其实我们可以自己将两个文件备份,然后在重装系统或者换电脑之后拷贝过去即可,但是需要注意的是文件的权限问题
- .ssh 文件夹的权限应该是 700
- id_rsa 权限应该是 600
- id_rsa.pub 权限应该是 644
- authorized_keys 权限应该是 600
总结
ssh 免密码连接是非常常见的一种使用进行连接的方法。对于目前的需求来说也就只有几个命令。
1 | 创建 `.ssh`文件夹和其中的文件的命令 |
补充
之前在 Ubuntu16.04 在服务器添加完公钥后,客户端连接的时候报错sign_and_send_pubkey: signing failed: agent refused operation
执行下面的命令即可
1 | $ eval "$(ssh-agent -s)" |