SSH是一种网络协议,用于计算机之间的加密登录。由于对称加密很难保证客户端不将秘钥泄漏,存在安全性问题,ssh使用非对称加密
密码认证
- 服务器收到客户端的连接请求,将自己的公钥发送给客户端
- 客户端收到公钥后,将密码用公钥加密后发送给服务器
- 服务器收到加密后的密码后,用自己的私钥解密,得到密码,然后验证密码是否正确
- 如果密码正确,则登录成功,给客户端响应
存在的问题:中间人攻击
中间人拦截了客户端的请求,然后伪装成服务器,将自己的公钥发送给客户端,客户端将密码用公钥加密后发送给中间人,中间人用自己的私钥解密后得到密码,窃取了用户的登录信息
解决方案:口令登录
第一次登录服务器(ssh user@host)时,无法确认服务器的真实性,只会输出对方的公钥指纹(RSA 1024位公钥使用MD5计算得到的128位指纹,或者其他加密方式),用户需要自行确认指纹是否正确,如果正确,则接受服务器的公钥,该服务器得到认可。
服务器公钥被接受后,会被保存在~/.ssh/known_hosts文件中,下次登录服务器时,系统认出服务器公钥,就不再提示用户确认了。
秘钥认证
- 客户端生成一对秘钥,公钥和私钥,将公钥存放在服务器上
- 服务器收到客户端的连接请求后,本地查找客户端的公钥,然后用公钥加密一个随机数发送给客户端
- 客户端收到加密后的随机数后,用自己的私钥解密,然后将解密后的随机数发送给服务器
- 服务器收到解密后的随机数后,验证是否正确,如果正确,则登录成功,给客户端响应,不再需要密码
生成秘钥对:ssh-keygen
执行后在~/.ssh/目录下生成id_rsa和id_rsa.pub两个文件,前者是私钥,后者是公钥
传输公钥:ssh-copy-id user@host
从此就不用输入密码了,直接使用ssh user@host登录
对于像github这样的网站,可以将公钥添加到网站上。
此时远程主机将你的公钥加入到登录用户主目录~/.ssh/authorized_keys文件