一、ssh登录过程

在实际开发中,经常使用ssh进行远程登录。ssh 登录到远程主机的过程包括:

  1. 版本号协商
  2. 密钥和算法协商
  3. 认证
  4. 交互

1.1 版本号协商阶段 
(1) 服务端打开22端口(也可以为了避免攻击,重定义ssh端口),等待客户连接 
(2) 客户端向服务端发起TCP连接,连接建立后,服务端向客户端发送第一个报文,包括版本标志字符串,格式为“协议版本号 次协议版本号 软件版本号”。 
(3) 客户端收到报文后进行解析,如果服务端的协议版本号比自己的低,则使用服务端的协议版本号,否则使用客户端自己的协议版本号。然后客户端回复给服务端一个报文,包含客户端决定使用的协议版本号。 
(4) 服务端比较客户端发过来的版本号,决定是否能同客户端交互。 
(5) 如果协商成功,则进入密钥和算法协商阶段,否则服务端断开TCP连接。

1.2 密钥和算法协商阶段 
(1) 服务端和客户端分别发送算法协商报文给对方,报文中包含自己支持的公钥算法列表、加密算法列表、消息验证码算法列表、压缩算法列表等。 
(2) 服务端和客户端根据对方和自己支持的算法得出最终使用的算法。 
记 c公 为客户端公钥,c私 为客户端私钥, s公 为服务端公钥, s私 为服务端私钥 
(3) 服务端将 s公 发送给客户端 
(4) 服务端生成 会话ID,发送给客户端 
(5) 客户端生成 会话密钥, 设为key,并计算 res = ID 异或 key 
(6) 客户端将 res 用 s公 进行加密,结果发送给服务端 
(7) 服务端用 s私 解密,得到 res, 计算 res 异或 ID 得到 key 
至此,服务端和客户端都得到了会话密钥和会话ID,以后的数据传输都使用会话密钥(为对称性加密算法的密钥)进行加密和解密。

1.3 认证阶段 
1.3.1 . 基于账号和口令的认证 
(1) 客户端使用密钥和算法协商阶段生成的会话密钥加密账号、认证方式、口令,将结果发送给服务器。 
(2) 服务端使用获得的会话密钥解密报文,得到账号和口令。 
(3) 服务端对这个账号和口令进行判断,如果失败,向客户端发送认证失败报文,其中包含了可以再次认证的方法列表,客户端从认证方法列表中选择一种方法再次认证,这个过程反复进行直到认证成功或者认证次数达到上限,服务端关闭本次TCP连接; 如果成功,则进行交互阶段

1.3.2 . 基于公钥和私钥的认证

(0) 客户端使用ssh-keygen 程序生成公钥 id_rsa.pub 和 私钥 id_rsa, 然后把id_rsa.pub 通过某种方式发送给服务端 
(0) 服务端把客户端的公钥放在将要远程登录过来的那个账号的 .ssh 目录下面 
(1) 客户端使用密钥和算法协商阶段生成的会话密钥加密账号、认证方法、id_rsa.pub,将结果传给服务端
(2) 服务端使用会话密钥解密报文,得到账号、id_rsa.pub, 服务端在这个账号的目录的 .ssh 目录下找对应的公钥,如果没有找到,则发送失败消息给客户端;如果找到,比较客户端发送来的公钥和找到的公钥,如果内容相同,则服务端生成一个随机的字符串,称为“质询”,然后使用找到的公钥加密这个质询,然后使用会话密钥再次加密,将这个双重加密的数据传送给客户端 
(3) 客户端使用会话密钥解密报文,然后使用id_rsa私钥再次解密数据,得到质询 
(4) 客户端使用会话密钥加密质询,发送给服务端 
(5) 服务端使用会话密钥解密报文,得到质询,判断是不是自己生成的那个质询。如果不相同,则发送失败消息给客户端;如果相同,则认证通过。

二、linux下实现无密码登录ssh

由以上介绍可以知道,使用基于公钥和私钥的验证方式可以不使用密码进行ssh登录。如果要实现在machine A的账号X 下无密码登录到 machine B的账号Y,在linux下的具体操作步骤如下: 
(1) 在machine A的账号 X下调用ssh-keygen 生成公私钥对 ssh-keygen -t rsa 
(2) 将公钥 id_rsa.pub 传到machine B的账户Y的目录 /home/Y/.ssh/下,然后将id_rsa.pub的内容添加到文件 authorized_keys 末尾 cat X.id_rsa.pub >> authorized_keys 
(3) 注意 authorized_keys 不能有group的write权限 chmod 644 authorized_keys 
(4) 这样,在machine A上账户X就可以直接登录到machineB的账户Y中,而不需要使用密码。

其中步骤(2) 可以有更简洁的做法:在machine A的账户X下执行 ssh-copy-id Y@machineB 
或者 ssh Y@machineB 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub 
    ssh Y@machineB,表示登录远程主机; 
    单引号中的mkdir .ssh && cat >>.ssh/authorized_keys,表示登录后在远程shell上执行的命令: 
"$ mkdir -p .ssh"的作用是,如果用户主目录中的.ssh目录不存在,就创建一个; 
    'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。

三、实际应用

ssh登录有密码登录和证书登录,实际的工作环境中,尤其是互联网公司,基本都是证书登录。内网的机器有可能通过密码登录,但在外网的机器,如果是密码登录,很容易受到攻击,真正的生产环境中,ssh登录都是证书登录。 
    而且在客户端生成公私钥对的时候,也需要设置密码,以后每次ssh登录的时候,客户端都需要输入密码(如果工作中,使用了一个没有密码的私钥,则私钥就可能被别人盗取,进而服务器被黑....)。当然在保密性要求不是很严格的场景下,一般都是不设置证书密码的.

参考

ssh登录详细过程

ssh 登录的更多相关文章

  1. ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题

    scp免密码登录:Linux基础 - scp免密码登陆进行远程文件同步 执行scp一直是OK的,某天在本地生成了公钥私钥后,scp到某个IP报以下错误 The authenticity of host ...

  2. Azure PowerShell (12) 通过Azure PowerShell创建SSH登录的Linux VM

    <Windows Azure Platform 系列文章目录> 本章将介绍如何使用Azure PowerShell,创建SSH登录的Linux VM 前提要求: 1.安装Azure Pow ...

  3. Linux SSH登录慢案例分析

    手头有台Linux服务器ssh登录时超级慢,需要几十秒.其它服务器均没有这个问题.平时登录操作都默默忍了.今天终于忍不住想搞清楚到底什么原因.搜索了一下发现了很多关于ssh登录慢的资料,于是自己也学着 ...

  4. DAY6 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单

    设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP(如公司IP)访问,但是当我们出差或在家情况需要登录服务器怎么办呢? 常用两种解决方案:1.通过VPN操作登录主机: ...

  5. Mac下,使用sshpass让iterm2支持多ssh登录信息保存

    windows里有个Xshell非常的方便好使,因为它能保存你所有的ssh登录帐号信息.MAC下并没有xshell,有些也提供这样的功能,但效果都不好.iterm2是很好的终端,但却不能很好的支持多p ...

  6. sudo,linux 新建账号,并开通ssh登录

    新建账号需要root账号或sudo权限,sudo配置保存在/etc/sudoers文件. sudoers的配置格式一般为: root ALL=(ALL:ALL) ALL %sudo ALL=(ALL: ...

  7. 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单

    设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP(如公司IP)访问,但是当我们出差或在家情况需要登录服务器怎么办呢? 常用两种解决方案:1.通过VPN操作登录主机: ...

  8. Windows Azure Virtual Machine (25) 使用SSH登录Azure Linux虚拟机

    <Windows Azure Platform 系列文章目录> 本文介绍内容适合于Azure Global和Azure China 为什么使用SSH登录Azure Linux虚拟机? 我们 ...

  9. 终端ssh登录mac用shell打包ipa报错:replacing existing signature

    终端ssh登录mac用shell打包ipa报错:replacing existing signature 报错原因:login.keychain被锁定,ssh登录的没有访问权限 解决方法:终端敲入 s ...

随机推荐

  1. Learning From Data 第一章总结

    之前上了台大的机器学习基石课程,里面用的教材是<Learning from data>,最近看了看觉得不错,打算深入看下去,内容上和台大的课程差不太多,但是有些点讲的更深入,想了解课程里面 ...

  2. 【原创】我所理解的自动更新-APP发布与后台发布

    发布后台 创建渠道:添加新的渠道,设置渠道名称,自动生成渠道id.    查看渠道:查看渠道基本信息,渠道app版本号,资源版本号,是否开启更新.    创建/更新APP:选择打包ios,androi ...

  3. iOS 图片轮播图(自动滚动)

    iOS 图片轮播图(自动滚动) #import "DDViewController.h" #define DDImageCount 5 @interface DDViewContr ...

  4. babel 解构赋值无法问题

    这个东西需要第二级, babel-preset-stage-2,然后再presets里引入stage-2的设置,再plugins离引入对应的插件 { "presets": [&qu ...

  5. html5——自定义属性

    自定义属性:添加前缀"data-" dataset属性:添加自定义属性后,通过元素的dataset属性来访问自定义属性的值(属性名没有data-前缀) data-name:data ...

  6. 判断浏览器是pc端还是手机端

    1. 判断浏览器是pc端还是手机端 <script type="text/javascript"> var browser = { versions: function ...

  7. bzoj1007[HNOI2008]水平可见直线

    cycleke神说要用半平面交(其实他也用的凸包),把我吓了一跳,后来发现(看题解)其实可以先按斜率排序,再将最小的两条线入栈,如果其与栈顶元素的交点在上一个点的左边,则将栈顶元素出栈.这是一个开口向 ...

  8. EPSON LQ610K 设置税控盘打印发票的格式

    问题困扰 之前一直是手动调试发票打印格式,浪费发票纸张不说,而且还浪费时间.今天在Parrells Desktop里利用Bonjour设置打印机的时候,找到了EPSON网站有这方面的介绍,根据上面的提 ...

  9. Android first---SQLite

    SQLite数据库 轻量级关系型数据库 创建数据库需要使用的api:SQLiteOpenHelper 必须定义一个构造方法: public MyOpenHelper(Context context, ...

  10. Java8的伪共享和缓存行填充--@Contended注释

    在我的前一篇文章<伪共享和缓存行填充,从Java 6, Java 7 到Java 8>中, 我们演示了在Java 8中,可以采用@Contended在类级别上的注释,来进行缓存行填充.这样 ...