GitHub系列之 SSH 生成和 配置

487 阅读5分钟

现在大家都知道,如果要使用SSH连接GitHub管理代码就少不了配置SSH keys,才能在你的电脑中操作GitHub中的代码,比如提交、克隆等。

概要

首先 ssh 是一种安全协议,这大家都知道,在git中其实是支持4种安全协议httpshttpgitsshssh的作用是能帮助我们从客户端(电脑)中去连接服务器,比如GitHub、阿里云服务器等。。。

当我们要连接GitHub的服务器时,在终端输入以下命令:

ssh -T git@github.com

如果链接成功了你会看到,此时说明你电脑和GitHub以及匹配成功了。

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

那如果你看到的是以下内容呢?

git@github.com: Permission denied (publickey).

说明你没有使用ssh协议链接GitHub的权限,那么这篇文章大概就能帮到你。

下面先介绍一下我们说的ssh

生成SHH

在Unix和Linux系统中,可以使用ssh-keygen命令来生成SSH密钥对(在windows中使用Git Bash终端窗口来创建)该命令默认会在当前用户的.ssh目录下生成一个私钥文件(默认为id_rsa)和一个公钥文件(默认为id_rsa.pub),如果.ssh目录不存在,则会自动创建该目录。生成RSA密钥对的命令:

ssh-keygen -t rsa -b 4096

该命令会生成一个4096位的RSA密钥对,并将私钥保存到~/.ssh/id_rsa文件中,将公钥保存到~/.ssh/id_rsa.pub文件中。

-t-b是两个可选参数一般情况不用设置,具体含义如下:

  • -t rsa:指定要生成的密钥类型为RSA。
  • -b 4096:指定要生成的密钥长度为4096位。

RSA呢是一种常用的公钥加密算法,4096位是RSA密钥对中的典型密钥长度,越长的密钥越难破解,但也会占用更多的存储空间和计算资源。

在执行该命令时,ssh-keygen会提示我们输入密钥文件的保存路径、密码等信息(一般我们可以不设置密码)。如果用户不输入任何信息,ssh-keygen将使用默认值生成密钥对,并将私钥保存到当前用户的.ssh目录下。

除了RSA密钥对,ssh-keygen命令还支持生成其他类型的密钥对,如DSA、ECDSA和Ed25519。例如,以下命令可以生成一个ECDSA密钥对:

ssh-keygen -t ecdsa -b 521

该命令会生成一个521位的ECDSA密钥对,并将私钥保存到~/.ssh/id_ecdsa文件中,将公钥保存到~/.ssh/id_ecdsa.pub文件中。

对了 如果你已经生成了同样算法的密钥,再次生成会被覆盖哦,除非你指定了不通的文件夹存放路径

.ssh目录文件内容介绍

Mac~/.ssh/

windowsC:/Users/userName/.ssh/

该文件夹下通常包括如下文件

配置文件

  1. config 这个文件包含了SSH客户端的配置信息。通过编辑config文件,我们可以指定默认的连接选项、主机别名等等。这些配置信息可以简化SSH连接的操作,例如:
  HostName example.com
  User myuser
  IdentityFile ~/.ssh/id_rsa

这里指定了一个名为myserver的主机别名,每次连接该主机时,SSH客户端会自动使用~/.ssh/id_rsa文件进行验证,并且默认使用myuser作为登录用户名。这样我们只需要键入ssh myserver即可连接到远程服务器,而不需要每次都输入完整的连接参数。

  1. 私钥

id_rsa(Private Key 私钥)当用户连接远程服务器时,SSH客户端会使用私钥进行身份验证,私钥私钥就是私人的东西 只有自己知道,所以有保密性

  1. 公钥

id_rsa.pub(Public Key 公钥)公钥可以在远程服务器上保存,并用于验证客户端的身份,比如我们在使用ssh连接GitHub时,如果你未生成和配置密钥时无法连接的,需要我们将电脑上的公钥复制到GitHub中保存。

其他服务器也是一样可以使用例如,如果用户希望让服务器myserver允许其连接,那么可以将其公钥添加到myserverauthorized_keys文件中:

ncat ~/.ssh/id_rsa.pub | ssh myserver 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'

这个命令就是将我们的公钥添加到myserverauthorized_keys文件中,从而允许该我们连接myserver

  1. known_hosts文件

    这个文件包含了已知的远程服务器主机公钥列表。当SSH客户端第一次连接一个新的服务器时,客户端会将服务器的公钥保存到known_hosts文件中,以便将来连接时验证服务器的身份。例如,当用户第一次连接myserver时,客户端会提示用户是否要将服务器的公钥添加到known_hosts文件中,如下所示:

   The authenticity of host 'example.com (192.168.0.1)' can't be established.ECDSA key fingerprint is 32:22:33:44:55:66:77:88:99:AA:BB:CC:

配置GitHub

当我们一切都准备就绪后就可以配置我们的GitHub了,首先用编辑器打开我们刚生成的公钥文件,将来的内容复制到GitHub中如下图 点击New SSH Key就可以添加了,你如果想要替换原来的删除重新添加就行,或者添加多个 newsshkey.jpg 添加设置后我们就可以测试一下是否可以通过ssh来连接GitHub了,输入一下命令 ssh -T git@github.com -T 是可选参数 如果你收到如下 就说明成功咯。

32-47.jpg

另外,如果你另外在一台(以Windows为例)没有私钥的电脑上再次克隆你的代码呢?会出现如下提示

Snipaste_2023-05-14_11-40-05.png

当你输入yes 后依然是不行

-45.png

此时你输入 ssh -T git@github.com 看到如下内容,说明你电脑私钥和GitHub上配置的公钥无法匹配所以是不行的。。。

7.png

此时需要将原有电脑中的私钥复制到该电脑中 C:\Users\UserName\.ssh中,并且创建 config文件 添加如下内容

Host github.com
  HostName github.com
  User git

此时再次输入 ssh -T git@github.com 看到

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

然后就可以愉快的coding了

Mac中操作类似

---- The end