众所周知当我们从 GitHub git clone 上下载代码时速度非常慢,有时候甚至下载到一半失败,十分影响使用。使用一段时间后,发现 SSH 方式并不能提升速度。。。。😂 望周知

好在 GitHub 提供了另外一种方式下载项目(当然不是 zip 包 😄 )。

image.pngimage.png

同时一些编译软件的 Git 插件也提供了对应的功能。

image.png

下面介绍一下 GitHub SSH 的使用。

1. SSH 基本概念

Secure Shell 是一种“用来在不安全的网络上安全运行网络服务的一种加密网络协议”(这也是可以提升 Git 下载速度的部分原因)。

SSH 是用 RSA 算法来实现加密。

1.1 RSA 加密算法

RSA 算法中拥有公钥和私钥,它有几个重要的概念:

  1. 公钥和私钥都是密码,区别是公钥向所有人公开,私钥只有自己拥有。
  2. RSA 是非对称的加密算法,这就意味着如果用公钥加密,则只有私钥才能解密,反之亦然。
  3. RSA 加密的过程是不可逆的,这就意味不可能通过使用密文、RSA 算法、加密密钥来获取密码原文。
  4. RSA 算法的两个用途:加密和签名。

举个例子了解一下密钥加密过程:

比如有两个用户,用户 A 和用户 B,A 想把一段明文通过 RSA 加密的技术发送给 B

基于公钥的加密过程:

B 拥有一对公钥和私钥

  1. B 将他的公钥给 A;
  2. A 使用 B 给的公钥来加密他的明文,并将加密后的密文发给 B;
  3. B 收到 A 的密文后,使用他的私钥解密密文。

基于私钥的加密过程:

A 拥有一对公钥和私钥

  1. A 使用私钥加密他的明文,从而对文件签名;
  2. A 将签名文件发给 B;
  3. B 首先要去获取 A 的公钥,然后使用公钥解密文件,从而来验证签名。

1.2 SSH 的安全保障

SSH 用于登录验证授权使用的是 RSA 的公钥加密方式。

加密和解密过程如下:

  1. 远程服务器收到用户的登录请求,并把自己的公钥发给用户。
  2. 用户使用这个公钥,将密码加密后发送给服务器。
  3. 远程服务器收到这个加密后的密码后,使用私钥将密码密文解密,如果密码正确,则同意用户登录。

这个过程看似安全,但是如果有人截取了用户的登录请求,然后冒充远程服务器伪造公钥发给用户,用户就会将自己的密码告诉了别人,这样用户的安全就无法得到保障了。

为了解决上述的“中间人攻击”问题,服务器端通过加密算法生成一个叫做“指纹”的东西,让用户认清正确的服务器,从而避免了将密码发送给他人。这里就不深度剖析了。

2. Git 配置 SSH(windows 客户端)

Git 中的 SSH 使用的是私钥加密的方式来验证用户信息的,所以我们需要在本地生成一对公钥和私钥。

2.1 生成 SSH 密钥

Step 1: 使用 Git Bash 生成本地的 SSH 密钥。

## ssh-keygen 	生成密钥
## -t 		type: 加密方式,可以为rsa或者dsa
## -b 4096		bits: 指定密钥长度,默认2048
## -f		file: 指定生成的文件地址以及文件名,默认为 ~/.ssh/id_rsa
## -C		comment: 注释,用于识别密钥,不一定非要是“邮箱”,也可以是其他内容

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -C "your_email@example.com"

> Generating public/private rsa key pair.
> Enter a file in which to save the key (/c/Users/you/.ssh/id_rsa):[Press enter]
> Enter passphrase (empty for no passphrase): [Type a passphrase]	## 输入密码
> Enter same passphrase again: [Type passphrase again]		## 确认密码

Step 2: 操作完成后指定目录会生成密钥文件

## 查看密钥文件
$ ls -al ~/.ssh 

> drwxr-xr-x 1 shupi 197609    0  2月 29 09:50 ./
> drwxr-xr-x 1 shupi 197609    0  2月 29 10:07 ../
> -rw-r--r-- 1 shupi 197609 3434  2月 29 08:51 id_rsa
> -rw-r--r-- 1 shupi 197609  751  2月 29 08:51 id_rsa.pub

id_rsa : 私钥; id_rsa.pub : 公钥

2.2 添加密钥至 ssh-agent

Step 1: 启动 ssh-agent

$ ssh-agent

> SSH_AUTH_SOCK=/tmp/ssh-tWZ7AoiO48G2/agent.1813; export SSH_AUTH_SOCK;
> SSH_AGENT_PID=1814; export SSH_AGENT_PID;
> echo Agent pid 1814;

Step 2: 配置 ssh-agent 自启动

~/.ssh 同级目录下创建 .profile 或者 .bashrc 文件,并写入以下内容

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

Step 3: 重新打开 Git Bash ,检查 ssh-agent 状态

$ eval $(ssh-agent -s)

> Agent pid 1688

2.3 向 GitHub 提供公钥

Step 1: 配置 GitHub 中的 SSH key

## 复制公钥内容到剪切板
$ clip < ~/.ssh/id_rsa.pub

GitHub:Setting --> SSH and GPG keys --> New SSH key

image.png

image.png

Step 2: 配置成功后,使用 Git Bash 检查 SSH 授权是否正确

## 初次打开Git Bash 时提醒输入密码
> Initializing new SSH agent...
> succeeded
> Enter passphrase for /c/Users/you/.ssh/id_rsa:
> Identity added: /c/Users/you/.ssh/id_rsa (/c/Users/you/.ssh/id_rsa)
> Welcome to Git (version 1.6.0.2-preview20080923)

$ ssh -vT git@github.com

> .....
> Hi NekoChips! You've successfully authenticated, but GitHub does not provide shell access.

3. 后记

后续会陆续添加 Mac 的配置方式,以及如何提升 git clone 的下载速度(目前知道的就只有挂代理的方式)。

文档参考:GitHub 帮助文档


关于作者:NekoChips
本文地址:https://chenyangjie.com.cn/articles/2020/02/29/1582953333150.html
版权声明:本篇所有文章仅用于学习和技术交流,本作品采用 BY-NC-SA 4.0 许可协议,如需转载请注明出处!
许可协议:知识共享许可协议