一、背景
【Github】、【58 iGit】、【gitlab.renrenche】同时都要操作,而~/.ssh 中一份 id_rsa & id_rsa.pub怎么够?如果搞了多份,怎么配置和管理比较合理?
对于Git仓库来说,不管你有几台电脑,几个人用,它只关注仓库接口层。
它对外暴露两套交互方式Http 与 SSH,如果使用Http,就每次带user@pwd过来。如果使用SSH,则把SSH keys的公钥 配置到后台(可以有多对密钥),仓库每次校验SSH密钥对。
咱们只聊天SSH的方式,对于Git仓库来说,它可以支持多对密钥,这里咱们就可以使用不同的密钥来区分 不同的电脑 或 工作环境,如果有临时的环境,完事可以在后台直接删除临时Key。
对于个人电脑来说,也可以不管有多少个目标ssh仓库,它只需要管理生成几套密钥对,把密钥与环境的对应关系搞清楚就可以。
接下来,我们看怎么生成密钥对…
二、生成密钥对
生成密钥对,可以在github or gitlab 网站上直接生成,
也可以在电脑上使用ssh命令生成,原理就是一样的,通过计算得出一对非对称密钥对,就是公钥和私钥。(如果非对称密钥对,这方面你不太了解请自行百度一下)
mac电脑操作:
1、先切到/.ssh/目录下。( = 用户目录)
2、执行命令 github:ssh-keygen -t rsa -C “你的邮箱”
这里解释一下,这个邮箱 是对应你的目标仓库的,比如我的三个仓库,对应要执行三次命令,生成三个密钥对。
[github]ssh-keygen -t rsa -C “lingrixin@live.cn”
[rrc_gitlab]ssh-keygen -t rsa -C “lingrixin@renrenche.com”
[58_gitlab]ssh-keygen -t rsa -C “lingrixin@58.com”
执行完命令,你会看到这个提示:
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/phantom/.ssh/id_rsa):
这是让你输入密钥对的文件名,你需要给它命个名,比较我和github就命名为github…
然后,你会看到输入密钥对的密码(直接按回车,就是空密码),我这边使用的是空密码。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
然后密钥对就生成成功了。
Your identification has been saved in github.
Your public key has been saved in github.pub.
The key fingerprint is:
SHA256:RsUbVssZhFPCPDJ/po1QZiHNjJ2xUpUjNP1EG7mSjQ0 lingrixin@live.cn
The key’s randomart image is:
±–[RSA 3072]----+
| .@O@oo. |
| ++^=E+oo |
| oO.+X… |
| …o * = |
| S. * . |
| . o . |
| |
| |
| |
±—[SHA256]-----+
提示里告诉你,保存了两个文件,一个是github,一个是github.pub,是的 公钥 和 私钥,文件都在~/.ssh/ 目录下;
这里,你可以操作多次,给你的目标仓库都生成完。
然后下一步:
三、公钥分发
将生成的公钥,配置到不同的平台上。
比如分发github公钥
先cat一下github.pub文件内容:
把这串玩意,copy一下。(注意空格啥的)
到github上,找到ssh key的配置,
其它平台,同理不一一演示了。
下面关键来了!!!
四、Config文件
看一下,你的~/.ssh/目录下,有没有config文件?没有的话创建(touch)一个空文件。
在"config"文件中,配置哪个key对应,哪个git仓库,例子如下:
Host GitHub.com # 别名
HostName github.com # 主机地址
IdentityFile ~/.ssh/github # 指定认证文件
User lingrixin@live.cn # 用户名
Host 58
HostName igit.58corp.com
IdentityFile ~/.ssh/58_gitlab
User lingrixin@58.com
Host RenRenChe
HostName gitlab.renrenche.com
IdentityFile ~/.ssh/rrc_gitlab
User lingrixin@renrenche.com
配置完,可以使用source config 让 config 文件立即生效,而不必注销并重新登录。
五、ssh-agent高速缓存
私钥管理者ssh-agent,ssh认证的过程其实是客户端(ssh命令端)读取自己的私钥并推导出指纹发送给服务端(sshd端),服务端也使用自己保存的公钥推导出指纹进行对比,如果指纹相同说明服务端的公钥和客户端的私钥是配对的。
那么首先,看一下,你的~/.ssh/目录下,有没有known_hosts文件?没有的话创建(touch)一个空文件。
输入: sudo ssh-add github 让新创建的秘钥加入到 ssh-agent高速缓存中。比如我的分别输了三条:
sudo ssh-add github
sudo ssh-add 58_gitlab
sudo ssh-add rrc_gitlab
注:这里可能会提示你输入 “电脑密码” 主要验证这个sudo,意思找系统要一个临时的 牛掰的 操作权限。
追加:这里遇到一个问题,我发现mac os 一重启,这ssh-add进去的密码就都没了。你可以重启后使用ssh-add -l查看,已加入的密钥。
这里的解决方案是,在mac os上,可以使用
ssh-add -K [path/to/private SSH key]
加入你的密钥,这样重启后就不会消失了。
解决方案链接:https://superuser.com/questions/88470/how-to-use-mac-os-x-keychain-with-ssh-keys
然后,你的配置就完全了,当然如果你想删除known_hosts文件中的配置,可以使用命令。
ssh-keygen -R
六、测试目标ssh连接
通过ssh命令,直接测试目标ssh的连接状态
ssh -T git@github.com
ssh -T git@igit.58corp.com
ssh -T gitlab.renrenche.com
恭喜你,完事了。
(啥?还是不通?莫慌!)
可以直接尝试【git pull】or【git clone】,我命令行测了下58的仓库,发现卡着不动,不知道为啥… 但直接用命令是可以拉下代码的~
(啥?还是不行?)
通过ssh -Tv git@github.com
查看一下ssh过程日志,如果从日志上 分析不出来原因,还删除文件,从第一步再来一遍。
还是不行? 请联系笔者,笔者帮你 撮头发~