SSH实现原理

功能:
SSH可以提供两种功能:
1、SSH服务,提供远程登录
2、类似于FTP的sftp-server,用于基于ssh的文件传输

组成:
SSH和其他的服务器软件一样,在链路上也有两部分组成,分别是客户端软件和服务端软件。SSH有两个不兼容的版本分别是:1.x和2.x,使用SSH 2.x的客户程序是不能连接到SSH1.x的服务端程序上的。OpenSSH 2.x同时支持SSH 1.x和2.x
服务端其实是一个守护进程(daemon),他在后台运行并相应来自客户端的连接请求。服务端一般是sshd进程,提供了对远程连接的处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接
客户端程序包括ssh程序,以及scp(远程拷贝)、slogin(slogin)、sftp(安全文件传输)等其他的应用程序

工作机制:
他们的工作机制大致是本地客户端发送一个连接请求到远程服务器,服务端检查申请的包和ip地址再发送密钥给ssh的客户端,本地再将密钥发送给服务端,自此建立连接。
ssh在连接方式上有两种:
-------version 1--------
ssh主机(Server端)用RSA加密方式产生一个1024bit的RSA-key,用来产生公约与私钥的演算方法:
1、当ssh daemon(sshd)启动时,就会产生一个768-bit的公钥(或称为Server Key)存放在Server中
2、当client端的联机请求发送后,Server将公钥发送给client,此时client会对比判断公钥的正确性,判断的依据/etc/ssh/ssh_knownhosts、$HOME/.ssh/known_hosts
3、client端接收768bit的Server Key之后,client自己也随机产生一个256bit的私钥(private key,或host key),并且以加密的方式传送给Server
4、Server与client在此联机过程中,就以一对1024bit的key pair来进行数据的传递
补充说明:
Public Key是放在Server上,而Client的软件需要能接收Public Key,计算出Private key,并把二者的组合成一把独一无二的key pair(因为Client每次的256bit的Private key是随机产生的),在Client端的用户默认目录下$HOME/.ssh/known_keys会记录曾经联机过的主机的Public Key,用以确认每次来自该主机的联机是否正确
--------version 2---------------
在version 1的联机过程中,当Server接收Client的Private key之后,就不会针对该联机的key pair进行校验,如过黑客传送了恶意代码,由于主机端部会检验联机的正确性,所以可能会接收该程序代码。
在version 2中增加了一个确认联机正确性的diff-hellman机制在每次数据传输中Server都会以这种机制校验资料来源是否正确

OperSSL软件:
OpenSSL是一种比较常见的SSH服务端和客户端软件。提供了sshd、shell、sftp功能,其默认端口是22,在Redhat、CentOS等Linux操作系统中的默认SSH Daemon就是这个了。
下面对这个软件的几种用法加以说明:
A. Server keys记录:$HOME/.ssh/known_hosts
当Client端接收来自Server端的Public key之后,会主动的对比这个key的正确性,有下面的两种情况:
1、没有记录,那么会出现提示,是否接收来自Server的Public Key
2、对比成功,直接提示输入密码
如果出现了这样的登录提示:warning: Remote host identification has changed
那么说明上次登录的远程ssh主机的key已经被更改了,原因可能是Server的重启、重装或者更新了相关的软件,这时候的处理方式是将$HOME/.ssh/known_hosts文件中与主机相关的字段删除,重新接收来自Server的Public key
B. 设置不用输入用户名和密码就能立即登录的目标主机
原理:将Client端产生的key复制到Server中
在Client向Server登录时,由于两者在ssh要联机的信号传递中,就已经对比过key了,因此可以立即进入数据传输,而不需要输入密码。
1、在Client端建立Public key和Private key两个密钥,命令为ssh-keygen
2、将Private-key放在client的默认目录下,$HOME/.ssh,并为该用户可读的状态
3、把Public key放在任何一个你希望要用来登录主机的Server的某user的默认目录中的认证文件中
举例:
--Client:
# SHELL>> ssh-keygen -t rsa
$HOME/.ssh/id_rsa 私钥
$HOME/.ssh/id_rsa.pub 公钥
-t参数是指使用何种加密方式,可以是用rsa和dsg等
id_rsa文件需要放到Client,需要是当前用户有可读可写权限
id_rsa.pub需要放置到Server端
# SHELL>> scp id_rsa.pub IP_ADDRESS:~/.ssh
--Server:
cat id_rsa.pub >> authorized_keys
注意:
Client必须制作出Private,Public两个key,且Private需要放置到.ssh文件夹内
Server端需要有Public key,$HOME/.ssh/authorized_keys
这个东西在Oracle的RAC集群中会用到,两个机器的Oracle用户可以通过ssh命令不需要输入密码的情况下进行互相登录!
附录:SSH 传输文件

在linux下一般用scp这个命令来通过ssh传输文件。
1、从服务器上下载文件

scp username@servername:/path/filename /var/www/local_dir(本地目录)

 例如scp root@192.168.0.101:/var/www/test.txt  把192.168.0.101上的/var/www/test.txt 的文件下载到/var/www/local_dir(本地目录)
2、上传本地文件到服务器

scp /path/filename username@servername:/path   

例如scp /var/www/test.php  root@192.168.0.101:/var/www/  把本机/var/www/目录下的test.php文件上传到192.168.0.101这台服务器上的/var/www/目录中

3、从服务器下载整个目录

scp -r username@servername:/var/www/remote_dir/(远程目录) /var/www/local_dir(本地目录)

例如:scp -r root@192.168.0.101:/var/www/test  /var/www/  

4、上传目录到服务器
scp  -r local_dir username@servername:remote_dir
例如:scp -r test  root@192.168.0.101:/var/www/   把当前目录下的test目录上传到服务器的/var/www/ 目录

注:目标服务器要开启写入权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值