本文是笔者查阅网上资料做的总结,关于SSH原理,什么是对称加密和非对称加密,本文不过多介绍。这里介绍一下SHH的工作过程、配制方法,可能出现的问题及解决方法。
说明:本文中涉及的例子,SSH客户端为:本地主机A,SSH服务器为:服务器B
SSH协议采用C-S(客户端-服务器端)架构进行双方的身份验证以及数据的加密。
服务器端组件监听指定的端口,负责安全连接的建立、对连接方的身份认证、以及为通过身份认证的用户建立正确的环境。
客户端负责发起最初的TCP握手、安全连接的建立、验证服务器的身份与之前记录中的一致、并将自己的验证信息提供给服务器。
一个SSH会话的建立过程分为两个阶段。第一阶段,双方沟通并同意建立一个加密连接通道以供后续信息传输用。第二阶段,对请求接入的用户进行身份验证以确定服务器端是否要给该用户开放访问权限。
当客户端发起TCP连接时,服务器端返回信息说明自己支持的协议版本,如果客户端上支持的协议与之匹配,则连接继续。服务器会提供自己的公共主机密钥(public host key)以让客户端确认自己访问的是正确的机器。
然后,双方采用一种Diffie-Hellman算法共同为该会话建立密钥。每一方的一部分私有数据,加上来自对方的一部分公共数据,通过这种算法计算,能够得出完全相同的密钥用于本次会话。
整个会话的通讯内容都使用该密钥进行加密。这个阶段使用的公钥/私钥对与用户验证身份用的SSH密钥是完全无关的。
经典Diffie-Hellman算法的计算步骤如下:
这个共享密钥的加密方式被称为二进制数据包协议(binary packet protocol)。该过程能够让双方平等的参与密钥生成的过程,而不是由单方掌握。这种共享密钥生成的过程是安全的,双方没有交换过任何未经加密的信息。
生成的密钥是对称式密钥,一方用于加密信息的密钥等同于另一方用于解密信息的密钥,而任何第三方由于不持有该密钥,是无法解密双方传递的内容的。
会话加密通道建立后,SSH开始进入用户认证阶段。
下一步,服务器验证用户身份以决定是否准许其访问。验证有不同的方式,选择的验证方式取决于服务器的支持。
最简单的验证是密码验证:服务器要求客户端输入密码,客户端输入的密码经过上述的通道加密传输给服务器。
虽然密码是加密过的,然而该方法仍然不被推荐,因为用户经常为了省事而使用过于简单的密码,而这类密码很容易就能够被自动化脚本破解。
最流行的验证方式是SSH密钥对,这也是当前最推荐的方式。SSH密钥对是非对称密钥,私钥和公钥分别用于不同的功能。
公钥用于加密,而私钥用于解密。公钥可以随意上传、共享,因为公钥的流通并不会危及到私钥的保密性。
SSH密钥对的验证过程起始于上一部分加密通道建立之后,其具体执行步骤如下:
简单来说,服务器端用公钥加密信息,客户端用私钥解密信息以证明自己持有私钥。该过程同时使用了对称加密和非对称加密,两种方式各有自己的功用。
命令如下:
用户名:为要登录的服务器B中已存在的用户账户名
IP地址:为服务器B的IP地址
-p 端口号:用来指定端口号,默认为22
第一次登录时,会提示如下提示:
大概意思是说,你正在访问的主机不能验证它的真实性,它的RSA key(当前访问主机的公钥)指纹是怎样的,你确定要继续连接吗?
输入yes继续,会提示,已永久把当前访问主机的RSA key添加到了已知主机文件(用户目录下,.ssh 文件夹中的knwon_hosts文件)中。之后再次 SSH 登录就不再有该提示了。
接着,输入登录账户的密码即可。
SSH 密码登录,需要服务器开启密码验证权限,编辑服务器SSH配置命令如下:
在 sshd_config 文件中,Protocol 2 下面 #PasswordAuthentication yes,将前面的#号去掉,保存退出。
公钥登录,即免密码登录。避免的每次登录都要输入的麻烦,也防止了中间人攻击。是SSH远程登录最常用的登录方式。
提示输入密钥对名称,直接回车,使用默认名称即可;
提示输入密码(使用私钥时,要输入密码),直接回车,不使用密码即可。
首先,登录服务器B,在进行下面的 *** 作。
找到 #PubkeyAuthentication yes,删除 #号,保存退出。
重启 ssh 服务
也可指定验证私钥:
本地主机A,生成密钥对后:
sudo vim /etc/selinux/config
在CRT本地建立密钥对,在CRT里的配置有如下几步:
1、 打开你的CRT,并且点开工具,点击创建公钥;
2、 这里是密钥类型的选择;
3、虽然日后我们可以不再通过密码进行认证,但是如果你想更加安全还是可以加上额外的口令,如果不设置短语可以留空;
4、密钥会自己生成,点击下一步
5、这里我使用的是默认的标准公钥和VanDyke私钥格式
6、根据安全需求选择你的长度,这里我选择的是默认的1024
7、选择完密钥长度会d出这个选择,因为我只配置一个连接,所以我选择的否
8、接下来我们打开要实现CRT远程连接的linux系统命令终端,进行如下配置:
oldman@apache:~$ cd ~ 进入家目录
oldman@apache:~$ pwd 查看路径
/home/oldman
oldman@apache:~$ mkdir .ssh 创建.ssh目录
oldman@apache:~$ ls -la 查看列表可以看到.ssh已经创建
drwx------ 3 oldman oldman 4096 3月 2 13:59 .
drwxr-xr-x. 28 root root 4096 3月 2 13:52 ..
-rw-r--r-- 1 oldman oldman 18 10月 16 21:56 .bash_logout
-rw-r--r-- 1 oldman oldman 176 10月 16 21:56 .bash_profile
-rw-r--r-- 1 oldman oldman 124 10月 16 21:56 .bashrc
drwx------ 2 oldman oldman 4096 3月 2 13:59 .ssh
oldman@apache:~$ chmod 700 .ssh/ 修改.ssh目录权限,权限一定要对
oldman@apache:~$ ls -ld .ssh/ 检查一下
drwx------ 2 oldman oldman 4096 3月 2 13:59 .ssh/
oldman@apache:~$ cd .ssh/ 进入到.ssh
oldman@apache:~/.ssh$ rz -y 把之前的.pub结尾的公钥文件上传到服务器
oldman@apache:~$ ls -ll 检查
-rw-r--r-- 1 oldman oldman 725 3月 9 2015 Identity.pub 刚刚的公钥文件
9、名字改为服务器下sshd配置文件下设定好的公钥名字 authorized_keys
oldman@apache:~/.ssh$ ssh-keygen -i -f Identity.pub >authorized_keys oldman@apache:~/.ssh$ ll 进行检查
-rw------- 1 oldman oldman 1200 3月 2 19:58 authorized_keys
-rw-r--r-- 1 oldman oldman 725 3月 9 2015 Identity.pub
至此,服务器端的配置就OK啦!
SSH有两种登录方式, 一是口令登录, 即常规的用户名密码登录二是公钥登录, 只要在server端配置好client端的公钥, 就可以实现免密登录. 控制端为client端, 远程主机为server端, 下同.
在client端输入命令然后一路回车
运行结束以后,在client端~/.ssh/目录下,会新生成两个文件: id_rsa.pub 和 id_rsa 。前者是你的公钥,后者是你的私钥。这时再输入如下命令,将公钥传送到远程主机host上面:
server端将用户上传的公钥,保存在用户主目录的 ~/.ssh/authorized_keys 文件中。
原本以上配置就ok了,但是OpenWrt的ssh采用的是dropbear,一种轻量级的ssh服务。需要对其进行额外配置:
大功告成 ->
SSH参考资料: SSH原理与运用(一):远程登录
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)