乐趣区

关于前端:常用的SSH你了解多少长文警告

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 配置选项就几十个,本文抛砖引玉,大家能够持续往下摸索🎉🎉

参考文档:

  • https://www.digitalocean.com/community/tutorials/how-to-configure-custom-connection-options-for-your-ssh-client
  • http://www.bjpowernode.com/hot/2664.html

🌹 继续更文,关注我,你会发现一个虚浮致力的宝藏程序员😊,让咱们一起学习,独特成长吧。

🎉 喜爱的小伙伴记得点赞关注珍藏哟,回看不迷路 😉

🎁 欢送大家评论交换, 蟹蟹😊

退出移动版