【22/03】ssh/SSH/ssh key/github/vscode/error:1058/深入浅出【一遍必懂】

我知道大部分介绍可能看的云里雾里的,我会在下面实际操作中,讲解每一条命令的写法、以及为什么要写,大家应该就可以大致了解SSH秘钥对是什么意思,又怎么使用了。

整合、参考了以下大佬的思想和简介, 这几个资料都非常好, 有时间可以看他们的, 不用看我的了, 珠玉在前:

  1. SSH key的介绍与在Git中的使用
  2. but GitHub does not provide shell access 求问解决方法
  3. vscode源代码管理器(git可视化操作)
  4. VSCode中使用 GitHub
  5. SSH、SSL与HTTPS

因为我的了解目的是:

  1. 知道什么是SSH协议
  2. 知道什么是SSH秘钥对
  3. 知道SSH秘钥对怎么与github联动
  4. 知道VScode和github怎么关联

前提废话: 珠玉在前, 但我还要写这一篇的原因在于,对于一个新手,官方的表述,详细的解释,只会让人迷失在一堆一堆的资料里。

我这篇的特点在于:加入个人理解大白话,以目的为导向的介绍过程。所以很多地方没有展开,因为对于新手,我首先想知道的是:这个东西是什么、有什么用、我需不需要用,要的话到底怎么用?如果看完这篇能解决上面的问题,那就请给我点赞~

一、什么是SSH

1.官话

Secure Shell (SSH) 是目前较为可靠的,专为远程登录会话和其他网络服务提供安全的协议,通过 安全的连接 进行数据交换, 为应用层的网络传输协议。通过加密保证了数据的保密性和完整性。

SSH 其实是专门为shell设计的 一种通信协议, 横跨了传输层和应用层. 即只有 SSH客户端 和 SSH服务器端之间的通信才可以使用这个协议, 其他软件服务无法使用.

SSH采用 公钥 public key 认证技术: 验证远程主机,以及(必要时)允许远程主机验证用户。(对于我们使用ssh只想和github联动, 这个功能是最直观能感觉的, 其它好处我们察觉不到)

通过SSH可以对传输数据进行加密, 防止DNS欺骗和IP欺骗, 中间人(man-in-the-middle)攻击。

题外话: 但我们非常需要一个通用的, 建立在应用层之下的一个传输层 安全协议, 这个东西就是大名鼎鼎的HTTPS里面的S -> SSL/TLS

2.大白话

因为传统的网络服务程序POP、FTP、Telnet协议,采用 明文 的方式传送数据、用户账号、用户口令到远程服务器,容易导致信息泄露。

举个例子: 抗日时期, 卧底A要将获取到的有用情报传递给中央B,不可能白字黑字的把 卧底身份和情报,也就是账号、密码、用户数据,写在纸上进行传递吧。万一被截获了,这个情报就失效了。那好办,可以制定一套加密规则,只有自己人才知道这套规则进行破译,就算敌人截获了情报也傻眼了。

他就无法完成这3件事:

  1. 知道情报具体内容(就是窃取你的数据)
  2. 假冒你骗你队友。(就是骗远程服务器)
  3. 假冒你队友骗你。(就是骗客户端,就是个人电脑)

但是网络传输里的客户端A 和 服务器端B 互相不认识啊, 如果 A 要加密传输数据的话, 怎么告诉B 这套加密的规则呢? 总不能传输数据的时候,顺便把加密规则放里面吧? 这怕是个傻子吧???

所以最终问题变成了: 客户端A 如何安全的把 加密规则 告诉服务器端B

二、什么是SSH key秘钥对

根据1976年两位数学家提出的崭新的非对称加密的概念:

  1. A生成一对两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
  2. B获取A生成的公钥,然后用它对信息加密。
  3. A得到加密后的信息,用私钥解密。

受这个思路的启发,三位数学家Rivest、Shamir 和 Adleman 设计了一种具体实现上面描述的非对称加密的算法,以他们三个人的名字命名,就是目前在计算机领域应用非常广泛的 非对称加密算法RSA。这样网络上传输的数据都经过公钥加密,然后用私钥解密,就算被第三方截获也无法解密出原始数据。

SSH key就是一对秘钥, 分为私钥 和 公钥:

  • id_rsa 私钥(钥匙)
  • id_rsa.pub 公钥(锁)

可以用于客户端认证:即方便地登录到 SSH 服务器, 而无需输入密码。
因为SSH网络传输协议利用SSH Key来进行前面提到的基于密钥的安全验证。

生成和使用SSH key步骤:

  1. 在客户端生成SSH key(密钥对:公钥和私钥)
  2. 在服务端的配置文件中加入你的公钥。(比如需要在GitHub中粘贴生成的公钥)
    在这里插入图片描述

三、具体操作

1. 生成秘钥对 SSH key

命令关键词:ssh-keygen
命令一般写法:ssh-keygen -t rsa -C "你的邮箱"
解释:

  • -C 添加注释,一般是邮箱
  • -f 指定保存秘钥的文件名,不指定就默认~.ssh/id_rsa,默认就会覆盖上一次默认生成的秘钥对
  • -t 创建的秘钥类型,支持rsa和dsa
  • 其它:问搜索引擎去

运行效果:
在这里插入图片描述
注意:命令执行过程中,有一个passphrase要设置。passphrase 设置密码,保护私钥的密码,一般不设置,记不住;这个就相当于给你的钥匙再配个钥匙,我想除非你保管着金库,否则听起来就不是很有必要对吧。
在这里插入图片描述

在默认生成秘钥对的地址下会出现上面这些东西(如果找不到该文件夹请查看-打开隐藏项目):

  • id_rsa 私钥(钥匙)
  • id_rsa.pub 公钥(锁)

2. 与github联动

  1. 打开github,点击头像,进入setting,看到SSH and GPG keys
  2. new一个SSH key
  3. title随便起啦,key的话就是记事本打开-粘贴-上面id_rsa.pub文件的所有内容
  4. 之后会要求你验证一次用户密码
  5. 解释:公钥就是锁,要交给github服务器,4 验证一次密码是为了证明这把锁确实是本用户给的~, 防止中间人欺骗服务器端.

3. ssh-agent命令

①官话

一种控制用来保存公钥身份验证所使用的私钥的程序。简单来说,就是一个秘钥管理器。运行ssh-agent,使用ssh-add将私钥交给ssh-agent保管,其他程序进行身份验证时可以交给ssh-agent完成。

②大白话

就相当于本来这把钥匙自己一个人用,但是有的时候别的人来访问家里,没钥匙进不去。那我们可以把钥匙拿给物管或者门口的鞋子里,想进屋可以找他们要,就是委托、托管~如果你有托管的需求,执行以下命令:

  1. ssh -v git@github.com //-v意思是终端详尽输出log,后面是github域名,也可以跟ip地址
  2. ssh-agent -s //但是window自带ssh-agent报错: unable to start ssh-agent service, error :1058
  3. ssh-add ~/.ssh/id_rsa //托管秘钥,window不认识~,请自行写上绝对地址(成功会提示 Identity added)
  4. ssh -T git@github.com //设置完成后的连接测试

1058报错解决方案 (这个报错肯定出现, 通过下面设置解决):

  • 管理员权限打开 windows power shell
  • 执行:Set-Service -Name ssh-agent -SttartupType automatic

补充:命令1输出:but GitHub does not provide shell access
对应解释: but GitHub does not provide shell access 求问解决方法
原话粘贴:
在使用ssh加公钥认证时会输入 ssh -T Github.com,认证成功后会输出如下Log。
“but GitHub does not provide shell access ”这句话的意思是,GitHub不提供shell(ssh)访问/接入权限。
ssh -T选项的意思为,不分配伪终端。
当你在使用ssh协议连接到自己或者其他服务器时,本地终端会显示命令提示符,你可以在上面操作输入命令ls等。
结合上面几点,这句话的意思即为你无法使用ssh协议直接登录github,在github服务器上建立一个伪终端,并进行操作。
所以,这句提示并不是一个错误,而是github输出的一句提示语。
同样你可以在本地使用ssh协议进行git相关操作,并提交到github,没有任何影响。

4、为什么我们需要ssh

一个是为了加密我们的数据;第二个是为了只用登陆一次后即可访问远程服务器;
对我们来说,加密数据的需求应该是不存在的吧, 毕竟编程菜鸡的代码毫无价值???我们的诉求肯定是访问远程服务器时,不要每次都管我要密码,我懒得。因为vscode连接github,两者融合现在也做的比较好了,我不可能每次vscode打开项目,编辑一下, 同步到github,每次都要输密码,很烦的哇。那么在这个时候,我们就需要按照上面的步骤ssh连接,一次就好,省密码到天荒地老~

原理就是:

  1. 本地生成的秘钥对, 手动将公钥添加到github远程服务器的配置里, 添加的时候输一次密码. 验证你真的是用户A, 防止中间人欺骗远程服务器
  2. 本地用ssh连接github远程服务器, 远程服务器会把公钥发过来, 让你手动确认这个公钥是不是你给的, 防止中间人欺骗用户, 也就是客户端.
  3. 一般没人会真的打开.ssh文件去匹配公钥是否一致, 直接输入yes, 验证通过. 这时候.ssh/know_hosts文件将公钥放进去.
  4. 下次打开vscode, 连接github远程服务器时, 会检查know_hosts文件是否存在相同的公钥, 就不会提示你确认了.
  5. 这样, 我们只用在最初的开始验证一次, 后面giithub远程服务器就不需要再验证客户端了, 省去频繁输密码的步骤

四、与vscode联动(完整过程)

  1. VSCode 默认已安装Git。输入git --version如果显示版本号,则安装成功。

  2. 在GitHub上新建一个仓库。例如:myrepo

  3. 在本地新建一个文件夹,作为VSCode代码的工作文件夹。例如:mycode

  4. mycode既是VSCode的代码工作文件夹又应该是Git的本地仓库。在命令行方式下进入mycode,输入git init

  5. 生成秘钥。继续在该目录下输入:ssh-keygen -t rsa -C "myname@mymail.com",命令执行完毕会生成一个名为id_rsa.pub的文件。利用文本编辑器打开该文件,全文复制。

  6. 打开GitHub上,进入setting,新建SSH keys,将id_rsa.pub中的内容粘贴进去即可。

  7. 绑定本地文件夹和GitHub仓库:git remote add . git@github.com:myname/myrepo.git(对了,记住是ssh连接)

  8. 设置完成后可以做一下连接测试:ssh -T git@github.com

  9. 先进行一次拉取,再进行一次推送:(关于本地仓库和远程仓库的联动,不太清楚流程可以看我另一个回答

    • git pull --rebase mycode master
- git pull mycode master
- git push --force mycode master.
  1. 上述配置都进行完成后,就可以利用VSCode打开mycode文件夹进行相关操作。此时任何在该文件夹下出现的改变,VSCode的“源代码管理”图标上都会出现相应发生改变的文件的数字。点击“源代码管理”图片后,会列出来所有发生改变的文件名称,点击右上角的…,进行“提交”操作。
  2. 提交完毕后检查GitHub的myrepo会发生相应的变化。如果没有变化,在VSCode中打开控制台(ctrl+`)选择“输出”,看是否有相关的错误提示,根据错误提示信息进行调整。

题外话: 话说, HTTPS用到的SSL/TLS协议, 针对如何将客户端/服务器端 的加密规则F安全的告诉服务器端/客户端 的解决方案就是给加密规则F(这个加密规则是对称加密)进行非对称加密. 这个非对称加密的秘钥对放在网站(服务器) 通过CA认证的数字证书(这个要花钱买)里面.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值