Git 远程仓库的安全验证——HTTPSSH

Posted 卡列尼娜翠花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git 远程仓库的安全验证——HTTPSSH相关的知识,希望对你有一定的参考价值。

验证方式

对于私有的仓库我们想要进行操作,远程仓库会对我们的身份进行验证:如果没有验证,任何人都可以随意操作仓库是一件非常危险的事情。

目前Git服务器验证手段主要有两种:

  • 方式一:基于HTTP的凭证存储(Credential Storage);
  • 方式二:基于SSH的密钥;

http 凭证

http 无状态连接

为什么http的验证方式叫凭证存储(Credential Storage),而不叫 http 用户名密码验证?

  • 因为本身HTTP协议是无状态的连接。无状态连接的意思就是下一个请求不会记录上一个请求的任何状态。相互完全独立。
  • 比如你去买奶茶,每天一杯,然后奶茶妹妹就对你影响特别深,并在某一天请你喝了一杯奶茶。这个买奶茶就是有状态的,奶茶妹妹对你的印象逐步加深,是因为记住了你之前来过。如果是无状态,那就是奶茶妹妹的记忆力只有七秒,买完就不记得你了。
  • 正因为 http 是无状态的连接,所以为了让服务器认出你,我们需要的是凭证,而用户名密码只是凭证中的一种实现。

并且因为 http 无状态连接的特点,所以每次的请求,我们都需要带上凭证,这很麻烦。
所以为了不让用户点个按钮输入账号密码,再点一次又输入一次账号密码。大家就想方设法在请求中自动携带上凭证或者手动携带上凭证。
自动携带凭证利用的就是 cookie;手动携带凭证的实现就是 token,保存 token,并且在每次的请求头中设置 authorization。

Git 凭证系统

Git 拥有一个凭证系统来处理这个事情,在安装 git 时就会询问你怎么配置凭证系统。

Git Crediential 的选项:

  • 选项一:默认所有都不缓存。 每一次连接都会询问你的用户名和密码;
  • 选项二:“cache” 模式会将凭证存放在内存中一段时间。 密码永远不会被存储在磁盘中,并且在15分钟后从内存中清除;
  • 选项三:“store” 模式会将凭证用明文的形式存放在磁盘中,并且永不过期;
  • 选项四:如果你使用的是 Mac,Git 还有一种 “osxkeychain” 模式,它会将凭证缓存到你系统用户的钥匙串中(加密的);
  • 选项五:如果你使用的是 Windows,需要安装一个叫做 “Git Credential Manager for Windows” 的辅助工具;windows 中默认的凭证配置就是自动安装这个工具。

git config credential.helper可查看凭证配置。Windows 中打印为 manager。

SSH 密钥

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。

SSH以非对称加密实现身份验证。

  • 其中一种方法是使用自动生成的公钥-私钥对来简单地加密网络连接,随后使用密码认证进行登录;
  • 另一种方法是人工手动生成一对公钥和私钥,通过生成的密钥进行认证,这样就可以在不输入密码的情况下登录;
    • 公钥需要放在待访问的电脑之中,而对应的私钥需要由用户自行保管;

Git 就是第二种方式手动生成密钥。

  1. 手动生成密钥: ssh-key generate --> ssh-keygen 命令
    1. ed25519 加密算法:ssh-keygen -t ed25519 -C “your email"
    2. RSA 加密算法:ssh-keygen -t rsa -C “your email"
  2. 生成的密钥对
  3. 将公钥(后缀为 public)放入 git 服务器中

Git - 5.远程仓库

参考技术A 已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步

登陆 GitHub

名字填写为gittest,点击 Create repository

英语好的同学自行翻译一下,我就不多做叙述了

这里我们用下面箭头标示的方法,用终端推送一个存在的仓库
首先选择 SSH ,然后进入我们的 gittest 本地仓库

执行以下命令,直接从上面图里的位置复制过来

注意,如果本地git仓库里什么文件都没有,需要先创建一些文件并且提交

当你第一次使用Git的 git clone 或者 git push 命令连接GitHub时,会得到一个警告

输入 yes 即可

看到这样的界面代表推送已经成功了(如果卡住关掉再来一次即可)

刷新一下我们GitHub,可以看到远程仓库的目录已经和本地一样了

远程库的名字就是 origin ,这是Git默认的叫法,也可以改成别的,但是 origin 这个名字一看就知道是远程库,最好也不要去修改

git push 命令,实际上是把当前分支master推送到远程

第一次推送 master 分支时,加上了 -u 参数,Git不但会把本地的 master 分支内容推送到远程库 origin 的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送时就可以不加了,直接使用

从远程仓库获取最新的更新用

如果你收到以下提示,代表远程仓库的版本要先于本地版本,必须先用 git pull 获取更新

每一次使用 git push 或者 git pull 后面都要跟上 origin master 显然是比较麻烦的,可以使用以下命令建立自动追踪

显示如下

以后就可以直接使用,会自动去找到建立了追踪信息的分支(例子里是 master )

如果你收到的提示是这样的

说明本地有这个分支了,但是远程库根本不存在,那当然无法建立连接了
再次使用 git push -u

创建远程分支new_test,并且把本地内容上传,并且把两者信息关联起来

注意,每一个分支都可以去分别追踪远程库不同的分支,这就意味着你可以让本地库和远程库的每一个分支一一对应起来。也意味着每一次你创建一个新的分支,可能都要去设置一下追踪信息。

该命令可查看已经与远程库建立好信息追踪的所有分支信息

从远程仓库克隆到本地
找一个合适的目录

以上是关于Git 远程仓库的安全验证——HTTPSSH的主要内容,如果未能解决你的问题,请参考以下文章

git创建远程仓库地址---上传代码

git怎么从远程仓库拉取到本地

git上传代码到github远程仓库

JGit与远程仓库链接使用的两种验证方式(ssh和https)

使用GIT 怎么知道远程仓库当前的递交历史!

Git使用手册/Git教程:git fetch 将远程仓库的分支及分支最新版本代码拉取到本地