我再学习SSH登陆的时候google搜索到的各种资料基本都会说到这样一段:
在 SSH 使用密码的方式登陆整个过程是这样的:
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
这段是在描述这样的一个过程:
$ ssh foo@remote_serv The authenticity of host 'virtural (xxx.xxx.xxx.xxx)' can't be established. ECDSA key fingerprint is SHA256:0yMAAeWwuLywagT2CORdVWO4uHTGILtrh+0XRah6FWQ. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'virtural,xxx.xxx.xxx.xxx' (ECDSA) to the list of known hosts. foo@virtural's password: Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-38-generic x86_64) Last login: Tue Sep 27 18:28:34 2016 from xxx.xxx.xxx.xxx foo@@localhost:~$
注意: 本次SSH使用密码登陆的
亲测实践过程:
remote_serv(远程主机) foo 用户并未生成公钥和密钥,也就是 /home/foo/.ssh/目录下并未存在 id_rsa.pub和id_rsa之类的密钥文件;
本地主机 bar 用户并未生成公钥和密钥,也就是/home/bar/.ssh/目录下并未存在 id_rsa.pub和id_rsa之类的密钥文件;
本地主机 bar 用户运行 ssh foo@remote_serv, 输入yes加入known_hosts后再输入密码可成功登入 remote_serv
疑问: 远程主机未生成公钥和私钥,如何发送自己的公钥给本地主机用于本地主机加密登陆密码呢?
截图如下:
公钥认证跟你上面贴出来的过程不是一个问题。
通过普通密码登录的时候,为了防止密码被中间人截获,需要利用非对称加密理论,这里发送给客户端的公钥是sshd
程序生成的,跟用户无关。
通过公钥登录的过程,无需传输密码
服务端生成一段随机字符串,给客户端
客户端用自己的私钥加密这个字符串,将加密结果发给服务端
服务端用存储在该用户目录下的公钥解开,并对于字符串
所以实际上,两种登录方式,刚好相反。
……难道生成的公私钥就一定要存在于.ssh目录下吗?……
……难道OpenSSH就不能把它存在于内存中吗?……
……更何况为了保证安全,这个公私钥是动态生成的,不是固定不变的……
…….ssh文件夹只是用在使用公私钥登录的时候,而非使用其他方式登录的时候……