如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了
1 ssh密码登录
ssh使用的非对称加密,非对称加密中有两个密钥:公钥和私钥。公钥由私钥产生,但却无法推算出私钥;公钥加密后的密文,只能通过对应的私钥来解密。
ssh密码登录流程:
服务器A
给服务器B
送登录请求服务器B
接收到请求后将公钥发送给服务器A
服务器A
使用服务器B
的公钥对登录密码进行加密生成密文服务器A
将密文发送给服务器B
服务器B
使用私钥将密文解密,获得服务器A
输入的密码服务器B
校验密码是否合法(此为本机work密码)服务器B
返回登录结果给服务器A
:成功登录或密码错误
2 中间人攻击
在非对称加密中可以有效保护登录密码不被泄漏,但这是在建立连接到真实服务器的情况下。设想一下,如果拦截者并不监听密码或公钥,而是直接伪装成服务器呢:
拦截者
在获取了服务器B的密码,就可以攻击服务器B
了,ssh为了解决这个问题,将问题抛给了用户,如图
第一次连接一个陌生服务器,会询问发起者是否相信这个主机,发起者输入yes后,将该服务器加到known_hosts文件中,下次连接不在确认。
3 ssh免密登录
如果每次ssh都需要输入密码,非常麻烦,ssh又提供了一个免密方式,公钥登录。
服务器A
将公钥发送给服务器B
服务器B
将服务器A
的公钥写入authorized_keys
文件中服务器A
发起登陆请求,并将自己的公钥一起发送服务器B
将接收到的公钥和authorized_keys
进行比对。- 如果有相同的公钥,生成一个随机数
R
,使用服务器A
的公钥对随机数R
进行加密,生成pubKey(R)
服务器B
将pubKey(R)
发送给服务器A
服务器A
使用私钥 对pubKey(R)
进行解密,得到随机数R
服务器A
将R
和SessionKey
(每个会话的唯一密钥)使用MD5
进行加密,生成Digest1
服务器A
将Digest1
发送给服务器B
服务器B
同样把随机数R
和SessionKey
使用MD5
进行加密,生成Digest2
服务器B
比较Digest1
和Digest2
是否相同,相同则登录成功。
4 具体操作
4.1 服务器A生成密钥对
执行下面的命令,一路回车即可
ssh-keygen
4.2 将公钥写入authorized_keys文件
cd ~/.ssh
touch authorized_keys
cat id_rsa.pub >> authorized_keys
4.3 将authorized_keys发送给服务器B
scp authorized_keys root@you_ip
4.4 验证免密登录
在服务器A ssh连接服务器B,如图
参考博客
https://www.cnblogs.com/276815076/p/10449354.html
https://www.cnblogs.com/shireenlee4testing/p/10366061.html