推荐文章 : https://github.com/luokuning/blogs/issues/8
加密
ssh在认证时采用的是非对称加密,而在会话中采用的是对称加密,因为对称加密更快,这个和TLS是一样的
密码登录
1 客户端先在known_hosts文件中找有没有对应ip的公钥:
(1) 如果有,与服务器返回的公钥比较,如果是一样的那么允许登录,进入下一步,如果不一样那么直接断开连接
(2) 如果没有,那么直接将服务器返回的公钥与服务器的ip保存在known_hosts文件中,并进入下一步
2 客户端利用服务器的公钥加密登录密码,发给服务器
3 服务器利用私钥来解密登录密码,如果密码正确则允许登录
在用密码登录时公钥是用来验证服务器是否是客户端要连接的服务器,这可以避免中间人攻击
在用密码登录时私钥是用来解密登录密码的,因为采用公钥加密只有对应的私钥才能解密,连公钥本身都无法解密
密钥登录
前提
密钥对中的私钥在客户端这里,而公钥已保存在服务器的authorized_keys文件中(可以用ssh-copy-id命令)
过程
1 服务器接收到登录请求,根据客户端的主机名在authorized_keys中找到对应的公钥
2 服务器发送一串随机数给客户端
3 客户端用私钥加密这串随机数回传给服务器
4 服务器尝试用公钥解密这串随机数,如果成功,那么允许登录
在用密钥登录时公钥是放在服务器这里的,并且与主机名绑定,当有相同主机名的客户端发来请求时,就可以发一串随机数给客户端,客户端用自己的私钥加密(签名)后,服务器再用公钥来解密,成功的话就允许登录
实战密钥登录
1 生成密钥对
在客户端键入 : ssh-keygen 生成密钥对(可以为私钥设置口令)
2 将密钥对中的公钥写入服务器的authorized_keys文件
在客户端键入 : ssh-copy-id user@hostname
3 在服务器上设置可以用密钥登录ssh
修改服务器上的/etc/ssh/sshd_config :
RSAAuthentication yes
PubkeyAuthentication yes
4 修改服务器的.ssh目录权限
在服务器上键入 : chmod 700 ~/.ssh
5 重启sshd服务
在服务器上键入: systemctl restart sshd
之后客户端即可免密登录