1、SSH工作原理

从ssh的加密方式说开去,看下文

1.1、对称加密

客户端和服务端采用相同的密钥进行数据的加解密,很难保证密钥不丢失,或者被截获。隐藏着中间人攻击的风险

如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就不存在了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack

为了解决对称加密的漏洞,就出现了非对称加密。非对称加密有两个密钥:“公钥”和“私钥”。公钥加密后的密文,只能通过对应的私钥进行解密。想从公钥推理出私钥几乎不可能,所以非对称加密的安全性比较高。

1.2、非对称加密

ssh连接远程git仓库时的登录验证原理:本地主机向远程主机发送登录请求,远程主机收到请求后,返回给本地主机一个随机字符串A,本地主机用私钥加密字符串A得到密文B,并把密文B发送给远程主机,远程主机用公钥解密密文A得到字符串B,并判断A是否等于B,如果相等,则认证成功,反之,则反之。

不在要求使用密码登录,以公私钥的方式实现免密登录

1.3、基于口令和公钥认证

只有在第一次连接的时候需要,通信双方验证身份之后就可以通过在客户端的私钥和你存放在服务器的公钥进行认证。(通过服务器上的公钥加密,客户端的私钥解密来验证)

第一次登录:

如果不是第一次登录,想看一下效果的话,可以修改一下本地的 ~/.ssh/known_hosts 文件名(~/.ssh/known_hosts文件中保存的是已经认证过的公钥信息),重命名该文件之后,相当于清空了认证过的公钥信息,再次连接的时候就会重新认证

  1. ssh连接远程主机
$ git clone git@gitcode.net:xxx.git
Cloning into 'xxx'...
The authenticity of host 'gitcode.net (119.3.229.170)' can't be established.
RSA key fingerprint is SHA256:pyrMa3p0o90Qsuz2+kMX3CIBl+S1cZsdRlCoaosSg00Qs.
Are you sure you want to continue connecting (yes/no/[fingerprint])?yes
Warning: Permanently added 'gitcode.net,119.3.229.170' (RSA) to the list of known hosts.
  1. 查看 known_hosts 文件
# 查看known_hosts文件
$ cat known_hosts
gitcode.net,119.3.229.170 ssh-rsa AAAAB3NzaC1yc2EAAAL......
  • 因为公钥长度较长(采用RSA算法),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹,如上fingerprint,这样比对就容易多了。

  • 当远程主机的公钥被接受以后,它就会被永久保存在文件 ~/.ssh/known_hosts 文件之中,下次再登录就会跳过Warning部分



上图来源网络,侵删

下面以多个主机配置ssh连接时怎么指定使用哪个公钥为切入点,讲解ssh config。讲透、看明白!

2、多个代码仓库配置ssh连接问题

SSH 是连接远程主机最常用的方式,尽管连接到单个主机的基本操作非常直接,但当你开始使用大量的远程系统时(比如:配置多个代码托管平台的ssh),这就会成为笨重和复杂的任务。

幸运的是,OpenSSH 允许您提供自定义的客户端连接选项。这些选项可以被存储到一个配置文件中,这个配置文件可以用来定义每个主机的配置。这有助于保持每个主机的连接选项更好的独立和组织,也让你在需要连接时避免在命令行中写繁琐的选项。

目前我使用的代码托管平台有GitHub、Gitee、Gitlab、Gitcode(瞎折腾),即使只使用一个平台,比如 gitlab,也会存在公司账号跟个人账号的ssh配置问题,下面讲解ssh连接远程主机时怎么指定使用哪个公钥

下面展示都在Windows 系统下

3、ssh config 自定义主机配置

3.1、ssh config 介绍

解决多个ssh密钥使用问题的最佳方案就是通过维护一个本地配置 config,指定主机使用哪个密钥。

其他方案:(需要连接的主机多了同样很难管理,不建议使用,了解即可)

  1. 设置环境变量GIT_SSH_COMMAND解决

  2. 指定命令行参数:ssh -i ~/.ssh/xxx.pub -p 22 www.example.com

用户级设置的路径: ~/.ssh/config

3.1.1、文件格式

Host firsthost
SSH_OPTIONS_1 custom_value
SSH_OPTIONS_2 custom_value
SSH_OPTIONS_3 custom_value Host secondhost
ANOTHER_OPTION custom_value Host *host
ANOTHER_OPTION custom_value # 公用配置在最下面
Host *
CHANGE_DEFAULT custom_value

解释:Host:ssh连接主机的别称 alias

3.1.2、尝鲜一下

本地系统的每个用户都可以维护一个客户端的 SSH 配置文件,这个配置文件可以包含你在命令行中使用 ssh 时参数,也可以存储公共连接选项并在连接时自动处理。你可以在命令中使用 ssh 来指定 flag ,以覆盖配置文件中的选项。

看一个例子:

  • ssh命令行的方式:
ssh -i ~/.ssh/xxx -p 22 -l admin \ www.example.com

上面的命令可以转换成 config 的形式,如下:

  • ssh/config 定义主机连接参数配置
Host myserver1
Hostname www.example.com
# User admin
Port 22
IdentityFile ~/.ssh/xxx # 公共配置, 必须在文件最下面
Host *
User admin

3.2、解释算法

它从文件顶部向下执行此操作,所以顺序非常重要,了解这个之后,方便我们写出更好的主机定义配置选项、方便运维管理。

当匹配到第一个主机定义时,并不会终止,而是继续往下查找,检查是否有其他匹配的 Host 定义。如果有另一个 Host 定义匹配,SSH 将该 Host 定义下的配置选项跟前面匹配到的主机定义配置选项合并(随着继续往下读取配置,最终配置选项是叠加的

3.3、ssh_config 的工作原理

3.3.1、ssh 客户端按以下顺序从三个地方读取配置:

  1. 系统范围内 /etc/ssh/ssh_config(适用于主机下的所有用户,系统级 System)

  2. 用户特定的 ~/.ssh/config (用户级)

  3. ssh直接提供给的命令行标志 (命令参数可以重写已有的固定配置)

我通常使用的用户级的配置,下面是我个人的配置,仅供参考:

# gitcode - csdn
Host gitcode.net
HostName gitcode.net
Preferredauthentications publickey
IdentityFile ~/.ssh/gitcode # gitlab
Host gitlab.com
HostName gitlab.com
IdentityFile ~/.ssh/gitlab-rsa # github
Host github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa # gitee
Host gitee.com
HostName gitee.com
IdentityFile ~/.ssh/id_rsa # 共享配置,文件最下面
Host *
# 认证方式首选 publickey(公钥), 可选: publickey,gssapi-keyex,gssapi-with-mic,password
PreferredAuthentications publickey
User git # ssh [Host] === ssh [User]@[HostName]

解释:

  • Host:ssh的别称

    比如 Host 设置成 xiao ,使用的时候 ssh xiao(注意设置User)

  • HostName: 服务器的地址

  • PreferredAuthentications : 认证方式

    可选: publickey,gssapi-keyex,gssapi-with-mic,password

  • IdentityFile: 指定连接HostName的密钥文件的路径

3.3.2、主机别名设置例子

Host dev1
HostName dev1.example.com
User jeery

现在要连接到 jeery@dev1.example.com,就可以通过在命令行中输入如下命令:

ssh dev1

# 相当于
ssh jeery@dev1.example.com

3.3.3、git 仓库连接别名设置例子

3.4、连接问题

PS C:\Users\xiao\.ssh>vim .\config
PS C:\Users\xiao\.ssh>ssh -T git@gitcode.net
Bad owner or permissions on C:\\Users\\xiao/.ssh/config
PS C:\Users\xiao\.ssh>

解决:

修改 config 文件 权限

cd ~/.ssh/
chmod 600 config

4、git仓库设置ssh连接

下面演示我的设置步骤,仅供参考

4.1、本地生成公私钥对

ssh-keygen -o -t rsa -C "yourmail" -b 4096

记得设置key的名字哟,默认是 id_rsa(如果不设置key,新生成的 id_rsa 文件会覆盖原有的id_rsa文件,之前添加过的就不能用啦!),参考下图

4.2、配置远程主机ssh

登录要连接的远程主机,这里演示 gitcode 平台

4.3、设置 ssh_config

这里我统一维护在 ~/.ssh/config里面维护,增加gitcode主机定义配置, 如下:

# gitcode - csdn
Host gitcode.net
HostName gitcode.net
IdentityFile ~/.ssh/gitcode # 共用配置,文件最下面
Host *
# 认证方式首选 publickey(公钥), 可选: publickey,gssapi-keyex,gssapi-with-mic,password
PreferredAuthentications publickey
User git # ssh [Host] === ssh [User]@[HostName]

4.4、测试连接

xiao@LAPTOP-L6TI0438 MINGW64 ~/.ssh
ssh -T gitagitcode.net
Welcome to GitLab,@heyYouU!
xiao@LAPTOP-L6TI0438 MINGW64 ~/.ssh

最后

相信看完上面的讲解,会对ssh理解的更清除一点。So,快来更换 ssh 试试吧

连接远程仓库可以选择https,也可以选择ssh

区别:

  1. https 连接有文件传输大小限制,ssh没有

  2. ssh传输速度比https协议快

  3. https 连接提交代码的时候需要输入账户密码登录,ssh则是以公私钥加解密随机数的方式免密登录

连接仓库的方式可以转换,如: https 转成 ssh,比较简单,不作介绍。

SSH东西超多的,光 SSH 配置选项就几十个,本文抛砖引玉,大家可以继续往下探索

参考文档:


持续更文,关注我,你会发现一个踏实努力的宝藏程序员,让我们一起学习,共同成长吧。

喜欢的小伙伴记得点赞关注收藏哟,回看不迷路

欢迎大家评论交流, 蟹蟹

常用的SSH,你了解多少?(长文警告)的更多相关文章

  1. 常用的SSH注解标签

    常用的SSH注解标签 1.Spring的注解 关于配Bean用的        @Component        @Controller @Service @Repository        作用 ...

  2. Linux常用指令-ssh

    目录 ssh远程登陆 ssh免密码登陆 生成公钥和私钥 将公钥复制到其他从机 文件说明 id_rsa id_rsa.pub authorized_keys known_host SSH(远程连接工具) ...

  3. [Xcode 实际操作]四、常用控件-(10)动作表样式警告窗口的使用

    目录:[Swift]Xcode实际操作 本文将演示动作表单窗口的使用. 动作表单可以给用户展现一系列的选项, 和警告窗口不同的是,动作表单的展示形式和设备的尺寸有关. 在项目导航区,打开视图控制器的代 ...

  4. Linux环境下常用的SSH命令

    目录操作: rm -rf mydir /*删除mydir目录*/ mkdir dirname /*创建名为dirname的目录*/ cd mydir /*进入mydir目录*/ cd – /*回上一级 ...

  5. ssh常用操作

    介绍ssh.sshpass.scp等linux下远程操作常用的命令 ssh 通过终端远程linux服务器的常用命令 ssh root@192.168.1.100 #以root用户链接到目标服务器,连通 ...

  6. google关于ssh key的解释(转)转的google的wiki的

    SSH keys (简体中文)     SSH 密钥对可以让您方便的登录到 SSH 服务器,而无需输入密码.由于您无需发送您的密码到网络中,SSH 密钥对被认为是更加安全的方式.再加上使用密码短语 ( ...

  7. 远程之SSH

    SSH(Secure Shell的缩写),由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目前较可靠,专为远 ...

  8. ssh和mvc理论基础

    ssh中mvc到底指的什么 mvcsshhibernatespringstrutsioc在SSH整合的架构中,Spring充当了一个容器的作用,Spring使用IOC和AOP技术接管了Hibernat ...

  9. ssh 命令

    常用的ssh命令 cd 切换目录 1.查看日志:举例: tail -f tomcat/apache-tomcat-6.0.26/logs/catalina.2010-11-10.out 2.pwd   ...

随机推荐

  1. 国内外组态软件对比分析(InTouch、WinCC、iFix、iNeuOS)

    在我国自动化控制领域应用较广泛的工业自动化组态软件有Wonderware公司InTouch.西门子公司Wincc.GE公司iFix.国内也有一些传统组态软件厂商,使用的功能和形式基本上十分类似,受当时 ...

  2. kubernetes之常用核心资源对象

    部门产品线本身是做DEVOPS平台,最近部署架构也在往K8S上靠了,不得不学一下K8S.自己搭建了K8S集群与harbor仓库来学习. 1.kubernetes之常用核心资源对象 1.1.K8s服务部 ...

  3. Kali信息收集

    前言 渗透测试最重要的阶段之一就是信息收集,需要收集关于目标主机的基本细腻些.渗透测试人员得到的信息越多,渗透测试成功的概率也就越高. 一.枚举服务 1.1 DNS枚举工具DNSenum DNSenu ...

  4. raid划分及创建

    RAID 的划分 RAID 0 - RAID 0是最早出现的,是数据分条技术.组建磁盘阵列中最简单的一种形式,可以提高整个磁盘的性能和吞吐量,利用率100%,缺点:一但磁盘损坏,raid0将失效,数据 ...

  5. 【python基础】第08回 流程控制 for循环

    本章内容概要 1.循环结构之 for 循环 本章内容详解 1.循环结构之for循环 1.1 语法结构 for 变量名 in 可迭代对象: #字符串 列表 字典 元组 for 循环的循环体代码 针对变量 ...

  6. 一文读懂数仓中的pg_stat

    摘要:GaussDB(DWS)在SQL执行过程中,会记录表增删改查相关的运行时统计信息,并在事务提交或回滚后记录到共享的内存中.这些信息可以通过 "pg_stat_all_tables视图& ...

  7. surging作者出具压测结果

    前言 首先回应下@wen-wen 所贴的压测报告,我也把我和客户压测碰到的问题,和压测结果贴出来,这个结果是由客户提供的.不会有任何的舞弊手脚问题 问题一:Task.Run慎用 首先在最新的社区版本已 ...

  8. Template -「矩阵 - 行列式」

    #include <cstdio> int Abs(int x) { return x < 0 ? -x : x; } int Max(int x, int y) { return ...

  9. Centos7较为彻底的删除mysql

    Centos7下较为彻底的删除mysql(root 身份操作) 删除mysql安装包 1. yum检查 yum list installed | grep mysql 安装则直接删除 示例:yum r ...

  10. 如何使用API接口批量查询图书信息?

    之前小编讲过在Excel表格中根据ISBN查询图书信息可以使用我们的图书查询公式,但偶然间发现少部分书籍由于年份久远导致查不出来,今天小编就教给大家另一种查询图书信息的方式,即通过API接口返回的JS ...