ssh是一种网络协议,用于计算机之间的加密登陆,被普遍应用于本地远程登陆服务器包括互相传送文件等。算法
ssh是一种安全的互联网协议。shell
ssh user@host
等待链接后,输入密码,登陆到远程主机上安全
ssh user@host -p 端口号 默认端口为22服务器
ssh登陆的过程以下:网络
这个过程自己是安全的,可是实施的时候存在一个风险:若是有人截获了登陆请求,而后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。由于不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是本身签发的。ssh
能够设想,若是攻击者插在用户与远程主机之间(好比在公共的wifi区域),用伪造的公钥,获取用户的登陆密码。再用这个密码登陆远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。网站
SSH协议是如何应对的呢?加密
若是你是第一次登陆对方主机,系统会出现下面的提示:code
ssh user@host The authenticity of host 'host (12.18.429.21)' can't be established. RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d. Are you sure you want to continue connecting (yes/no)?
这段话的意思是,没法确认host主机的真实性,只知道它的公钥指纹,问你还想继续链接吗?server
所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,因此对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。
很天然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在本身的网站上贴出公钥指纹,以便用户自行核对。
假定通过风险衡量之后,用户决定接受这个远程主机的公钥。
使用密码登陆,每次都必须输入密码,很是麻烦。好在SSH还提供了公钥登陆,能够省去输入密码的步骤。
所谓"公钥登陆",原理很简单,就是用户将本身的公钥储存在远程主机上。登陆的时候,远程主机会向用户发送一段随机字符串,用户用本身的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,若是成功,就证实用户是可信的,直接容许登陆shell,再也不要求密码。
如何配置公钥登陆?
先在本地生成一对密钥,执行以下命令后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。
ssh-keygen -t rsa
ssh-copy-id user@host
ok,执行上面的步骤后,你就可使用ssh user@host 免密登陆了。若是不行的话,可能须要注意下远程ssh目录的权限问题。
设置别名远程登陆
当咱们完成了公钥登陆的配置后,每次登陆依然是 ssh user@host!这样输入起来依然是不太方便,你要记ip地址,当你本地要登陆的远端机器比较多的时候就更加头大了。
那,有一个更好的方法就是用ssh config在本地配置别名来简化登陆命令。如 ssh xxx。
在~/.ssh/ 下建立 config文件,并以以下格式编辑配置文件:
Host Test HostName 111.222.331.2 User user IdentityFile ~/.ssh/id_rsa
配置完成后,保存就能够愉快的使用ssh Test登陆远端主机。