XingYun blog
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具

XingYun

冲!
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具
  • 有了MAC地址 为什么还需要IP地址
  • 为什么IP地址老是变
  • 我们为什么需要IPV6
  • TCP与IP协议
  • TCP与UDP
  • https与http
  • DNS域名解析
  • 进程与线程
  • SSH
    • 正向代理与反向代理
    • 程序猿必须掌握的英语单词
    • ASCII、Unicode、UTF-8和UTF-16
    • 异或门怎么连
    • 前端够用的linux命令
    • http1.1与http2
    • 与服务器保持连接的几种方式
    • base64编码
    • 关于URL
    • http请求方式
    • 图解http阅读笔记
    • 计算机
    XingYun
    2021-11-27
    目录

    SSH

    SSH (Secure SHell)

    # 一、什么是SSH?

    简单说,SSH是一种网络协议,用于计算机之间的加密登录。

    如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

    最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密

    成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

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

    # 二、公钥加密

    SSH之所以能够保证安全,原因在于它采用了公钥加密。

    整个过程是这样的:

    (1)远程主机收到用户的登录请求,把自己的公钥发给用户。

    (2)用户使用这个公钥,将登录密码加密后,发送回来。

    (3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

    这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。

    因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。

    可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。

    再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。

    # 三、口令登录

    SSH协议是如何解决这个问题的呢?

    $ ssh user@162.14.118.99
    
      The authenticity of host 'host (162.14.118.99)' 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)?
    
    1
    2
    3
    4
    5
    6
    7

    这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?

    所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0de: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.
    
    # 然后,输入密码就可以登陆了。
    
    1
    2
    3
    4
    5
    6
    7

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

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

    # 四、公钥登录

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

    所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。

    登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。

    远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

    实际开发中一般也是采用公钥登录,简单快捷

    # 生成SSH私钥和公钥
    ssh-keygen -t rsa
    
    1

    这样会在当前目录生成名为id_rsa的私钥文件和名为id_rsa.pub的公钥文件,-t表示密钥类型是rsa。

    如果你只输入ssh-keygen生成的RSA密钥长度为2048,如果你对安全性要求比较高可以指定4096位的长度:

    ssh-keygen -b 4096 -t rsa
    
    1

    这里-b就是多少位,当然你对这些参数感兴趣可以使用--help参数看看具体的含义和解释。

    当你在生成SSHKEY的时候在命令行下会提示你Enter file in which to save the key,让你确认密钥文件保存的路径,
    一般回车即可(一般默认会在当前用户家目录下的.ssh目录下)。

    第二个提示是 Enter passphrase (empty for no passphrase) 让你输入一个密钥的密码,如果不输入则留空;回车生成公私钥完毕 😃
    此时你可以使用cat命令看下自己的公私钥。

    上传公钥文件

    将本地的公钥文件上传到服务器上,然后在服务器需要免密登录的用户家目录下查看是否有 ~/.ssh/authorized_keys 这个文件,
    如果没有手动创建一个:

    touch ~/.ssh/authorized_keys
    
    1

    然后我们将公钥内容写入到authorized_keys文件中,因为这个文件可能已经有内容了,所以你可以使用如下方式

    cat -n ~/.ssh/rsa.pub ~/.ssh/authorized_keys
    
    1

    这样就将公钥内容追加到authorized_keys中了,然后需要注意配置权限了,否则SSH不会工作的,我在这里踩了坑。。

    1. 将.ssh目录的权限为700
    2. 将authorized_keys目录的权限为600

    ssh-copy-id 复制公钥

    这个工具还蛮有用的,不过它会将我本地的所有公钥都传到服务器,使用方法:

    ssh-copy-id username@remote-server
    
    1

    服务器SSH端口一般为22,所以使用 ssh-copy-id 登录用户@服务器IP -p端口

    完成了这些步骤是不是就可以免密登录了呢?是的,现在可以直接免密登录服务器了:

    ssh user@host -p22
    
    1
    #网络
    上次更新: 2023/04/05, 09:41:10
    进程与线程
    正向代理与反向代理

    ← 进程与线程 正向代理与反向代理→

    最近更新
    01
    JavaScript-test
    07-20
    02
    二维码的原理
    07-20
    03
    利用ChatGPT优化代码
    07-20
    更多文章>
    Theme by Vdoing | Copyright © 2021-2023 XingYun | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式