服务器上的 Git - 生成 SSH 公钥以及多个用户使用同一台电脑生成多个 SSH 密钥

Author Avatar
dev.liang 6月 12, 2017
  • 在其它设备中阅读本文章

SSH Key 是一种方法来确定受信任的计算机,从而实现免密码登录。Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置。

生成 SSH 公钥

大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。系统中的每个用户都必须提供一个公钥用于授权,没有的话就要生成一个。生成公钥的过程在所有操作系统上都差不多。 首先先确认一下是否已经有一个公钥了。SSH 公钥默认储存在账户的主目录下的 ~/.ssh 目录。进去看看:

1
2
3
➜  ~ cd .ssh
➜ .ssh ls
id_rsa id_rsa.pub known_hosts

关键是看有没有用 something 和 something.pub 来命名的一对文件,这个 something 通常就是 id_dsa 或 id_rsa。有 .pub 后缀的文件就是公钥,另一个文件则是密钥。假如没有这些文件,或者干脆连 .ssh 目录都没有,可以用 ssh-keygen 来创建。该程序在 Linux/Mac 系统上由 SSH 包提供,而在 Windows 上则包含在 MSysGit 包里:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
➜  .ssh ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/liangyanqiao/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/liangyanqiao/.ssh/id_rsa.
Your public key has been saved in /Users/liangyanqiao/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Zx+P**************************************mKyhnXOieS4 liangyanqiao@liangyanqiaodeMacBook-Pro.local
The key's randomart image is:
+---[RSA 2048]----+
| . |
| o |
| . . . |
| . o . . |
| ..o= S = . |
| . +o+.=.= o + |
| o +. =+.ooo.+.. |
|E.B .o.o+oo*oo. |
|o=.+ ooo oo*= |
+----[SHA256]-----+

首先确保在终端里面已经进入 .ssh 目录下,然后执行命令 ssh-keygen,它先要求你确认保存公钥的位置(.ssh/id_rsa),然后它会让你重复一个密码两次,如果不想在使用公钥的时候输入密码,可以留空,回车进行下一步,知道最后生成 RSA。

现在,所有做过这一步的用户都得把它们的公钥给你或者 Git 服务器的管理员(假设 SSH 服务被设定为使用公钥机制)。他们只需要复制 .pub 文件的内容然后发邮件给管理员。
公钥的样子大致如下:

1
2
➜  .ssh cat id_rsa.pub
ssh-rsa AAAAB3Nz**************************************zbzFr leaderliang@MacBook-Pro.local

关于在多个操作系统上设立相同 SSH 公钥的教程,大家可以查阅 GitHub 上有关 SSH 公钥的向导:http://github.com/guides/providing-your-ssh-key

2019.3.6 更新

遇到一个问题想在自己另一台电脑上用另一个 git 账号 使用代码仓库对代码进行管理,发现 ssh 权限存在一些问题,然后就各种尝试,查看官方文档尝试配置,但是还是有些问题。最后看了 这位老哥 的配置,才弄明白,在此记录一下。

如果你已经有了一套名为 id_rsa 的公秘钥,将要生成另外一个公钥,比如 aysee ,你也可以使用任何你喜欢的名字。
大致步骤如下:

生成一个新的自定义名称的公钥:

1
2
ssh-keygen -t rsa -C "YOUR_EMAIL@YOUREMAIL.COM" -f ~/.ssh/aysee
ssh-keygen -t rsa -C "YOUR_EMAIL@YOUREMAIL.COM" -f ~/.ssh/aysee

执行命令后,生成命名的公钥和生成默认公钥的步骤一样。

执行完成后,会在 ~/.ssh/目录下生成一个 aysee 和 aysee.pub 文件。

在 SSH 用户配置文件 ~/.ssh/config 中指定对应服务所使用的公秘钥名称,如果没有 config 文件的话就新建一个,并输入以下内容:

1
2
Host github.com www.github.com
IdentityFile ~/.ssh/aysee

添加 aysee.pub 到你的 git/github 服务器网站上

测试配置文件是否正常工作

1
ssh -T git@gitcafe.com

如果,正常的话,会出现如下提示:

1
Hi USERNAME! You've successfully authenticated, but github does not provide shell access.

如果出现如下提示,则说明有权限问题:

1
Permission denied (publickey)

如果有权限问题的情况下,你对项目执行push操作的时候,会得到如下提示:

1
2
3
4
5
Warning: Permanently added the RSA host key for IP address '192.30.252.129' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

多用户时出现权限问题的原因:

github使用SSH与客户端连接。如果是单用户(first),生成密钥对后,将公钥保存至 GitHub ,每次连接时SSH客户端发送本地私钥(默认~/.ssh/id_rsa)到服务端验证。单用户情况下,连接的服务器上保存的公钥和发送的私钥自然是配对的。但是如果是 多用户 (first,second),我们在连接到second的帐号时,second保存的是自己的公钥,但是SSH客户端依然发送默认私钥,即first的私钥,那么这个验证自然无法通过。

解决ssh权限问题():

通常一台电脑生成一个ssh不会有这个问题,当一台电脑生成多个ssh的时候,就可能遇到这个问题,解决步骤如下:

查看系统ssh-key代理,执行如下命令

1
$ ssh-add -l

以上命令如果输出 The agent has no identities. 则表示没有代理。如果系统有代理,可以执行下面的命令清除代理:

1
$ ssh-add -D

然后依次将不同的ssh添加代理,执行命令如下:

1
2
$ ssh-add ~/.ssh/id_rsa
$ ssh-add ~/.ssh/aysee

你会分别得到如下提示:

1
2048 8e:71:ad:88:78:80:b2:d9:e1:2d:1d:e4:be:6b:db:8e /Users/aysee/.ssh/id_rsa (RSA)

1
2
2048 8e:71:ad:88:78:80:b2:d9:e1:2d:1d:e4:be:6b:db:8e /Users/aysee/.ssh/id_rsa (RSA)
2048 a7:f4:0d:f1:b1:76:0b:bf:ed:9f:53:8c:3f:4c:f4:d6 /Users/aysee/.ssh/aysee (RSA)

如果使用 ssh-add ~/.ssh/id_rsa的时候报如下错误,则需要先运行一下 ssh-agent bash 命令后再执行 ssh-add …等命令

1
Could not open a connection to your authentication agent.

配置 /.ssh/config 文件
如果没有就在
/.ssh目录创建config文件,该文件用于配置私钥对应的服务器

1
2
3
4
5
6
7
8
9
10
11
#Default github user(first@mail.com)
Host github.com
HostName github.com
User git
IdentityFile C:/Users/username/.ssh/id_rsa

#aysee (company_email@mail.com)
Host github-aysee
HostName github.com
User git
IdentityFile C:/Users/username/.ssh/aysee

Host随意即可,方便自己记忆,后续在添加remote是还需要用到。 配置完成后,在连接非默认帐号的github仓库时,远程库的地址要对应地做一些修改,比如现在添加second帐号下的一个仓库test,则需要这样添加:

1
2
git remote add test git@github-aysee:ay-seeing/test.git
#并非原来的git@github.com:ay-seeing/test.git

ay-seeing 是github的用户名

测试 ssh

1
ssh -T git@github.com

你会得到如下提示,表示这个ssh公钥已经获得了权限

1
Hi USERNAME! You've successfully authenticated, but github does not provide shell access.

上一张我操作的图

image