什么是ssh
SSH是一种用于安全访问远程服务器的网络协议。它将客户端与服务端之间的消息通过加密保护起来。
什么是对称加密
在对称加密中,客户端和服务端使用同一个密钥对数据进行加密和解密。这种方法的好处是加密强度高,很难破解。缺点也很明显,即密钥本身容易被泄漏。因此,如何保存密钥成为了关键问题。于是引出了第二种加密方式:非对称加密。
什么是非对称机密
在非对称加密中有两个密钥,公钥和私钥。这两个密钥配对产生和使用。用公钥加密的数据,必须用与其对应的私钥才能解开。并且,私钥无法通过公钥获取。因此,公钥是可以被公开的,而私钥则必须被安全存放。在SSH中,非对称加密被用来在会话初始化阶段为通信双方进行会话密钥的协商。由于非对称加密的计算量开销比较大,因此一旦双方的会话密钥协商完成,后续的加密都将采用对称加密来进行。
SSH会话建立的过程
- 客户端发起一个TCP连接,默认端口号为22.(1046)
- 服务端收到连接请求后,将自己的一些关键信息发给客户端。这些信息包括:服务端的公钥:客户端在收到这个公钥后,会在自己的“known_hosts”文件进行搜索。如果找到了相同的公钥,则说明此前连接过该服务器。如果没有找到,则会在终端上显示一段警告信息,由用户来决定是否继续连接。- 服务器所支持的加密算法列表:客户端根据此列表来决定采用哪种加密算法。
- 生成会话密钥。此时,客户端已经拥有了服务端的公钥。接下来,客户端和服务端需要协商出一个双方都认可的密钥,并以此来对双方后续的通信内容进行加密。密钥协商是通过Diffie - Hellman算法来实现的。具体过程是:
1)服务端和客户端共同选定一个大素数,叫做种子值;
2)服务端和客户端各自独立地选择另外一个只有自己才知道的素数;
3)双方使用相同的加密算法(如AES),由种子值和各自的私有素数生成一个密钥值,并将这个值发送给对方;
4)在收到密钥值后,服务端和客户端根据种子值和自己的私有素数,计算出一个最终的密钥。这一步由双方分别独立进行,但是得到的结果应该是相同的。
5)双方使用上一步得到的结果作为密钥来加密和解密通信内容。 - 接下来,客户端将自己的公钥id发送给服务端,服务端需要对客户端的合法性进行验证:
1)服务端在自己的“authorized_keys”文件中搜索与客户端匹配的公钥。
2)如果找到了,服务端用这个公钥加密一个随机数,并把加密后的结果发送给客户端。
3)如果客户端持有正确的私钥,那么它就可以对消息进行解密从而获得这个随机数。
4)客户端由这个随机数和当前的会话密钥共同生成一个MD5值。
5)客户端把MD5值发给服务端。
6)服务端同样用会话密钥和原始的随机数计算MD5值,并与客户端发过来的值进行对比。如果相等,则验证通过。
ssh登录退出远程主机
退出至本地bash界面:
exit
ssh默认端口为22,使用-p参数可以指定端口登录。
ssh -i id_rsa name@host -p 1046
SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。
$ ssh user@host
如果本地用户名与远程用户名一致,登录时可以省略用户名。
$ ssh host
authorized_keys文件
远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
这条命令由多个语句组成,依次分解开来看:(1)"$ ssh user@host",表示登录远程主机;(2)单引号中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登录后在远程shell上执行的命令:(3)"$ mkdir -p .ssh"的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;(4)'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。写入authorized_keys文件后,公钥登录的设置就完成了。
参考:http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html