参考资料SSH登录原理_藏红的博客-CSDN博客

SSH全称是Secure Shell,SSH协议是基于应用层的协议,为远程登录会话和其他网络服务提供安全性的协议。SSH使用最多的是远程登录和传输文件,实现此功能的传统协议都不安全(ftp,telnet等),因为它们使用明文传输数据。而SSH在传输过程中的数据是加密的,安全性更高。

需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。

工作原理

SSH协议是基于非对称加密方法的,服务器和客户端都会生成自己的公钥和私钥。

(1) 服务器建立公钥。若远程服务器是新系统,会在/etc/ssh目录下生成一个名为ssh_host_ecdsa_key.pub的公钥,同时生成一个名为ssh_host_ecdsa_key的私钥,这一对就是远程服务器的公钥与私钥。之后每回启动sshd服务的时候,系统会自动在此路径下查找公钥。

远程服务器的公钥:

(2) 客户端请求连接(linux或者mac系统可以直接通过自带的shell连接)

(3) 服务器发送公钥给客户端。服务器接到请求后,把公钥传给客户端使用。

(4) 客户端记录服务器公钥并计算自己的公私钥。客户端将服务器传来的公钥文件记录在~/.ssh/known_hosts中(linux系统下,若是windows系统,远程服务器的公钥可能存放在C:\Users\Administrator\.ssh\known_hosts中,不同的ssh客户端实现,位置可能不同),若是已经记录有该服务器公钥,则比对是否一致,一致后就计算客户端自己的公私钥。

(5) 客户端发送自己的公钥给服务器。客户端将自己的公钥发送给服务器,这样服务器端就有客户端公钥+服务器自己私钥,客户端就有服务器公钥+客户端自己私钥,组成了非对称加密系统。

(6) 开始双向加解密。服务器发送数据:用客户端公钥加密,客户端收到数据后用自己私钥解密。客户端发送数据:用服务器公钥加密,服务器收到数据后用自己私钥解密。

SSH验证原理详解

SSH验证方式主要有以下两种:

1.基于口令的验证

如果你是第一次登录对方主机,系统会出现下面的提示:

$ 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主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?

所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是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)? yes

系统会出现一句提示,表示host主机已经得到认可。

Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.

然后,要求输入密码

Password: (enter password)

如果密码正确,就可以登录了。

当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。

2.基于公钥的验证

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。

所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:

$ ssh-keygen

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。

这时再输入下面的命令,将公钥传送到远程主机host上面:

$ ssh-copy-id user@host

好了,从此你再登录,就不需要输入密码了。

如果还是不行,就打开远程主机的/etc/ssh/sshd_config这个文件,检查下面几行前面"#"注释是否取掉。

RSAAuthentication yes

  PubkeyAuthentication yes

  AuthorizedKeysFile .ssh/authorized_keys

远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。

这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:

$ 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文件后,公钥登录的设置就完成了。

ssh配置简单了解

以下内容基于linux系统

以下截图来自centos7。/etc/ssh目录下已经自动生成了3对不同加密方式的密钥对。以及ssh服务的默认系统配置。

ssh_configsshd_config都是ssh服务器的配置文件,二者区别在于,前者是针对客户端的配置文件,后者则是针对服务端的配置文件。两个配置文件都允许你通过设置不同的选项来改变客户端程序的运行方式

ssh客户端配置ssh_config

参考文档:ssh_config(5) - Linux manual page

ssh_config按顺序从以下来源获取配置数据:

           1.   command-line options2.   user's configuration file (~/.ssh/config)3.   system-wide configuration file (/etc/ssh/ssh_config)

对于每个参数,使用第一个获取的值,即命令行设置优先于用户配置,再优于系统配置。用户配置应当位于用户目录下,仅对该用户生效。(不太重要:每个配置参数一旦被赋值就不再改变,因此将你需要修改的参数放在配置文件开头,默认参数放在文件末尾,PS:文档里这么说的,不知道自己有没有理解错,即用户配置文件中,同一个配置参数可以出现多次,但只取第一次赋值)

具体配置项的意义及默认值,请查阅文档。

ssh服户端配置sshd_config

sshd_config 文件中也默认启用了三个私钥,对于上面系统自带的3组密钥

启用公钥验证,此项配置默认是开启的,可不进行修改

#PubkeyAuthentication yes

关闭密码登录,默认是开启密码登录的,如果要禁用,修改此项为no

配置修改后,需要重启sshd服务

PasswordAuthentication yes

开启密钥登录验证,并添加公钥至远程服务器

假定你的服务器为A,远程服务器为B。

1. 先在服务器A上生成你的密钥对,

根据操作系统自行生成,windows下可以使用putty或者命令行ssh-keygen

linux下使用ssh-keygen命令

2. 将公钥传到远程

假如你即服务器B的管理者,执行命令

ssh-copy-id -i /home/mika/.ssh/id_rsa.pub username@ip  

注意,-i 后面接的参数是保存你公钥的文件

/home/mika/.ssh/id_rsa.pub就是我在服务器A上保存的公钥位置

username@ip 表示连接远程服务器B,ip是B的连接地址,username是你准备登录B服务器的用户

登录过程中,如果是第一次登录会提示,确认后会将B的公钥存在A服务器~/.ssh/known_hosts中

之后需要你输入B用户的密码以登入服务器B

成功后,会在B服务器目录~/.ssh上保存A公钥,若不存在该目录,ssh-copy-id命令会自动创建。

操作成功后,在B服务器上查看一下公钥

假如你没有权限的话,将公钥交给服务器B的管理者...可以直接修改authorized_keys文件,将你的公钥加入到此文件中即可

SSH远程连接原理及操作详解相关推荐

  1. 使用Navicat进行ssh通道连接mysql数据库操作详解

    这里以腾讯云mysql数据库连接为案例,步骤如下: 1.首先,需要安装一个navicat 2.打开Navicat,点击连接按钮,选择常规,配置数据 3.点击SSH通道按钮 ,进行配置 4.点击 '测试 ...

  2. pymssql mysql_Python数据库模块pymssql连接SQLServer数据库操作详解

    Python数据库模块pymssql连接SQLServer数据库操作详解 发布时间:2018-08-23 19:32, 浏览次数:720 , 标签: Python pymssql SQLServer ...

  3. SSH 远程连接原理及故障排错详解

    1.SSH 远程连接介绍 最常用的 Linux 提供远程连接服务的工具就是 SSH 软件,SSH 分为 SSH 客户端和 SSH 服务端两部分.其中,SSH服务端包含的软件程序主要有 openssl ...

  4. Spark RDD、DataFrame原理及操作详解

    RDD是什么? RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用. RDD内部可以 ...

  5. rdp远程连接windows和linux,详解 Linux 和 Windows 间的远程桌面访问

    在Windows上面,我们都用过系统自带的远程桌面连接或者TeamViewer这样的工具,可以方便的让我们用图形化方式远程操作其他计算机.但是在Linux上,我们一般都是使用SSH来操作终端.那么在L ...

  6. RDD 与 DataFrame原理-区别-操作详解

    1. RDD原理及操作 RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用.RDD内 ...

  7. mysql打开网络访问权限_远程连接mysql 授权方法详解

    今在服务器上 有mysql 数据库,远程访问,不想公布root账户,所以,创建了demo账户,允许demo账户在任何地方都能访问mysql数据库中shandong库. 方案一: 在安装mysql的机器 ...

  8. MySQL 传统复制与 GTID 复制原理及操作详解

    MySQL 复制在业界里有叫:mysql 同步,ab 复制等.专业名称就是叫:复制. 复制是单向的,只能从 master 复制到 slave 上,延时基本上是毫秒级别的. 一组复制结构中可以有多个 s ...

  9. 【Linux 主机ssh远程连接暴力破解详解】

    昨天,安全老师布置了一个安全的小作业,在下想了想,做什么好呢?最近学了很多.那就做一个Linux主机远程连接的暴力破解密码的作业. 一.前期信息搜集 kali 作为黑客主机,centos作为被攻击主机 ...

最新文章

  1. Android系统编译时集成三方APK
  2. Web Application Stress Tool(WAS)性能测试
  3. 设计模式之工厂方法模式学习笔记
  4. 深入理解 Spring 之源码剖析IOC
  5. 【机器学习基础】深入讨论机器学习 8 大回归模型的基本原理以及差异!
  6. Python3可变字符串代码实现
  7. mybatis解决属性名和数据列名不一致
  8. Starling 2D框架简介
  9. python查看系统句柄数量_linux下查看系统进程占用的句柄数方法
  10. js小学生图区_推荐12个最好的 JavaScript 图形绘制库
  11. 【转】【Linux】sed命令详解
  12. 洲明科技与意法半导体合作开发新一代LED显示屏
  13. python迭代函数例题_python map 函数使用,遍历访问可迭代对象
  14. 前端常用插件、工具类库汇总,新手必收藏!!!
  15. 5G 手机的“高端”战事
  16. java多线程总结二(转)
  17. 每天学点Shiro-say hello
  18. IE、FF CSS 兼容性、兼容浏览器的技巧 2
  19. sql相关日期截取函数
  20. 精准测分:基于函数调用关系链的用例消振算法(上帝视角)

热门文章

  1. 第一章 Java程序设计-开发入门1
  2. 连接计算器与计算机之间的总线属于,中国 人口出版社
  3. io.protostuff.ProtostuffIOUtil序列化
  4. openmpi参数_OpenMPI源码剖析:网络通信原理(一)
  5. JAVA判断两个时间戳,相隔多少分钟
  6. 【酒店、宾馆】无线局域网方案!~
  7. 因式分解之十字相乘法
  8. 内蒙古农业大学的计算机专业怎样,内蒙古农业大学计算机与信息工程学院
  9. 三星s4是android4.0吗,三星Galaxy S4 LTE-A的手机系统是什么?能升级安卓4.2吗?
  10. 虚拟轮杆实现触摸屏模拟游戏手柄