ssh无密码登陆原理
公钥认证:公钥认证是使用一对加密字符串,一个为公钥,一个为私钥。公钥可以被任何人获得,私钥只有自己知道,公钥加密之后的字符串只有私钥能解密。所以如果A和B之间进行加密通信,则可以A和B相互把自己的公钥发送给对方,如A要向B发送信息,则A使用B的公钥对要发送的信息进行加密,B收到之后,用B自己的私钥解密;同样,如果B要向A发送消息,则B使用A的公钥加密消息,A收到之后用A自己的私钥解密。
记 Ac = 客户端公钥, Bc = 客户端密钥 , As = 服务器公钥, Bs = 服务器密钥。在认证之前,客户端需要通过某种方法将公钥 Ac 登录到服务器上。
认证过程分为两个步骤。
- 会话密钥(session key)生成
- 客户端请求连接服务器,服务器将 As 发送给客户端。
- 服务器生成会话ID(session id),设为 p,发送给客户端。
- 客户端生成会话密钥(session key),设为 q,并计算 r = p xor q。
- 客户端将 r 用 As 进行加密,结果发送给服务器。
- 服务器用 Bs 进行解密,获得 r。
- 服务器进行 r xor p 的运算,获得 q。
- 至此服务器和客户端都知道了会话密钥q,以后的传输都将被 q 加密。
- 认证
- 服务器生成随机数 x,并用 Ac 加密后生成结果 S(x),发送给客户端
- 客户端使用 Bc 解密 S(x) 得到 x
- 客户端计算 q + x 的 md5 值 n(q+x),q为上一步得到的会话密钥
- 服务器计算 q + x 的 md5 值 m(q+x)
- 客户端将 n(q+x) 发送给服务器
- 服务器比较 m(q+x) 和 n(q+x),两者相同则认证成功
服务器端设置
使用公钥认证需要对服务器进行一些设置。修改 /etc/sshd_config 的以下配置。
RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥认证
PasswordAuthentication no # 禁止密码认证
然后重新启动 sshd。
实现无密码登陆
客户机 ip_client
服务器 ip_server
需要实现在客户机上不用密码登陆服务器。
1. 客户机上生成 ssh 公私密钥
ssh-keygen -t rsa
一直enter进行默认选项
此时生成私钥 ~/.ssh/id_rsa 以及公钥 ~/.ssh/id_rsa.pub
2. 将客户机上生成的公钥拷贝到服务器中需要登陆的用户名下的 ~/.ssh/authorized_keys文件中
scp id_rsa.pub(in client) --> server
在服务器上 cat id_rsa.pub >> ~/.ssh/authorized_keys
或者在客户机上使用: ssh-copy-id user_name@server_ip.
3.更改权限,在服务器server上
chmod 644 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
4. 在客户机上将私钥添加给ssh-agent 管理
ssh-agent bash //开启ssh-agent
ssh-add ~/.ssh/id_rsa //把专用密钥添加到 ssh-agent 的高速缓存中
5.从客户机上登陆 服务器
ssh test_user@ip_server 就可以不输入密码直接登陆
(ssh-agent介绍)
ssh-agent就是一个管理私钥的代理,受管理的私钥通过ssh-add来添加,所以ssh-agent的客户端都可以共享使用这些私钥。
好处1:不用重复输入密码。
用 ssh-add 添加私钥时,如果私钥有密码的话,照例会被要求输入一次密码,在这之后ssh-agent可直接使用该私钥,无需再次密码认证。
好处2:不用到处部署私钥
假设私钥分别可以登录同一内网的主机 A 和主机 B,出于一些原因,不能直接登录 B。可以通过在 A 上部署私钥或者设置 PortForwarding 登录 B,也可以转发认证代理连接在 A 上面使用ssh-agent私钥登录 B。 编缉/etc/ssh/ssh_config文件:ForwardAgent yes
linux ssh客户端密钥转发
如果是linux客户端,从linux客户端的ssh跳转过去时,一般我们会执行命令
ssh blue@跳板机ip
然后我们在跳本机上跳转到目标机器
ssh blue@目标机器ip
跳板机ip和目标机器ip,blue账户下已经在相应的.ssh/authorized_keys加入了公钥,配置是没有问题了,但是我们会遇到一个错误,叫Pubkey Unauthorization,因为跳板机没有blue的私钥。问题总是会有,解决方法也总是有,ssh是有转发密钥的功能,所以我们从本机跳转到跳板机是,可以把私钥转发过去。
所以正确做法是,在本机linux客户端执行命令
ssh -A blue@跳板机ip
-A表示转发密钥,所以跳转到跳板机,密钥也转发了过来。
接下来我们再在跳板机执行命令
ssh -A blue@目标机器ip
这里的-A参数非必要,如果你不需要从目标机器跳转到其他目标机器,也不需要继续转发密钥了。
另外可以配置本机客户端的默认配置文件,修改为默认转发密钥:
修改ssh_config(不是sshd_config,一般在/etc或者/etc/ssh下):把#ForwardAgent no改为ForwardAgent Yes
跳板机是否需要配置,同理参考你的需要。