标签:
// 以下记录基于 ubuntu:
ssh的简单认识:
安装ssh sudo apt-get install ssh // 假定当前配置的软件源可用
ssh服务器监听的端口默认为22.
ssh服务器的配置文件位于:/etc/ssh/sshd_config // 也可以 cat 一下 /etc/ssh/ 下的其他文件。多逛逛无害,如果时间允许
登录远程主机的命令: ssh user@remoteHost // remotHost为远程主机的ip地址,或者域名
衍生的命令(远程拷贝) scp /home/xiaocc/demo.war stage@remoteHost:/var/tomcat/webapps/ // 该命令将本地的demo.war 文件拷贝到远程主机: remoteHost 的stage用户的 /var/tomcat/webapps目录下
生成公钥和私钥匙的命令:
ssh-keygen -t rsa // -t 后面跟上 rsa 或者dsa
生成的公钥和对应的密钥默认位于 ~/.ssh/
~/.ssh/id_rsa // 私钥
~/.ssh/id_rsa.pub
同时加个命令 chmod 600 ~/.ssh/id_rsa //仅对当前用户可读可写
==========================================
以上:可以满足基本干活的需要了。
接着,简单说说原理:
ssh 的客户端和服务器都会拥有一个公钥和对应的私钥。用公钥对一段数据进行加密,有且仅有对应的私钥能对该段数据解密,反之亦然。公钥会在网络上传播,但私钥不会在网络上传输。
登录方式1:基于远程主机的用户和密码登录
客户端 通过 ssh 命令请求登录 远程服务器
服务器 收到请求后,将自己的公钥发送给客户端
客户端利用收到的服务端的公钥对登录密码进行加密,将加密后的密码发送给服务器。
服务器利用自己的私钥对收到的密码进行解密,并且验证其密码,如果密码正确,允许该客户端登录。
// 客户端登录成功。 用 exit 命令退出登录。 登录超时 时间取决于服务器的配置。
登录方式2:基于客户端公钥的登录 //必须对服务器进行配置,并且使配置生效。
具体 cat /etc/ssh/sshd_config。
客户端将自己的公钥事先保存在服务器中,一般为 ~/.ssh/authorized_keys 中。 这就是为什么上司不用告诉我们远程主机的密码,只叫我们把 ~/.ssh/id_rsa.pub 发给他我们就能登录远程服务器干活了。。。
客户端 通过ssh 命令请求 登录远程服务器时,服务器将一段随机码发回给客户端。客户端用自己私钥对该随机串加密后发送到服务器。服务器利用该客户端的公钥解密之后即可完成认证。
//至于:为啥服务器端会知道,当前登录的客户端是否已经把公钥保存在本服务器中了? 这就是具体实现上的事情了。现在还没有去看具体的实现是怎样的。 如果有人知道,请多多赐教。
中间人攻击:
真对于第一种登录方式,
可能会有第三方截获ssh登录请求,并且将第三方自己的公钥发过来,客户端不知道收到的公钥是不是目的服务器的,就把远端的登录密码加密后发出去了,第三方用私钥解密之后就可以得到真正的远端服务器的密码。从而第三方再以客户端的身份登录到远程服务器。对服务器进行破坏。
// 突然想到一句话:请不要将钱转到陌生的声称电信,公安的银行卡中。
造成该问题的原因:
客户端不知道收到的公钥到底是不是由真正的目的服务器发来的。
这下好了,目的服务器得事先公布自己的公钥。当客户端收到远端服务器的公钥时,与目的服务器自己事先公布的公钥对比,
就可以知道来者何人了。
在linux中,第一次登录一个陌生的远端服务器时,会有这样的提示:
The authenticity of host ‘127.0.0.1 (127.0.0.1)‘ can‘t be established.
ECDSA key fingerprint is 50:76:f4:8e:eb:38:c6:e9:d5:5b:c7:49:77:a9:4c:b4.
Are you sure you want to continue connecting (yes/no)?
//重要提醒:请不要将钱转到陌生的声称电信,公安的银行卡中。 哈哈,一样的道理。
当对一个远程主机进行了第一次登录之后,在客户端本身的 ~/.ssh/ 目录下会生成:
know_hosts // 好了,我记着这个仔了,他是我远方亲戚,信得过。
以后再登录这个远程服务器,就不会有上面的提示了。
======
个人的目前为止的理解,以上。
标签:
原文地址:http://my.oschina.net/u/1466553/blog/384574