github/gitlab管理多个ssh -key

这几天在同时使用gitlab和github的时候,遇到ssh key的问题,search了一翻,没找到最合适的答案,于是自己结合search内容和github help文档,终于解决问题,记录于此。

##问题现象: 公司项目代码托管于gitlab, 个人项目代码托管于github, 经常需要通过Git Bash切换向gitlab和github提交代码, 由于使用SSH方式, 因此涉及到多个SSH key的问题

  • https连接方式需要经常输入密码, 有点繁琐, 故而才有SSH连接方式(Internet好像有https不需要输入账号密码的方式,此处忽略)
  • SSH连接方式由于安全性需要涉及到连接加密, 大概原理是这样的: 客户端(Git bash)向服务器端(Gitlab/Github)发起连接请求, 服务器首先返回给客户端一个’随机’字符串, 客户端收到并用私钥加密该’随机’字符串并发给服务器, 服务器利用公钥去解密并和原始’随机’字符串比对, 匹配一致, 则连接成功。
  • 客户端的私钥一般存储在 ~/.ssh/id_rsa (或者其他自定义文件), 公钥存储在 ~/.ssh/id_rsa.pub (pub == public, 或则其他自定义文件), 服务器端的公钥则是客户端 id_rsa.pub内容的一份拷贝

1. 为gitlab生成第一个 SSH key

$ ssh-keygen -t rsa -c 'username@mycompany.com

username@mycompany.com 是公司邮箱账号, 当然可以填你自己的邮箱账号

输入上面的命令后, 后续都默认按 回车, 确认并使用默认值

然后 ls ~/.ssh/ 可以查看到 ~/.ssh/ 目录下生成 id_rsa 和 id_rsa.pub 两个文件(就是私钥和公钥文件了)

再然后 cat ~/.ssh/id_rsa.pub 在终端上打印公钥字符串, 拷贝并粘贴到 gitlab - Profile Settings - SSH Keys创建一个SSH Key, 保存完成

2. 为github生成第二个 SSH Key

$ssh-keygen -t rsa -c 'xxxxx@gmail.com

xxxxx@gmail.com 是个人邮箱账号

注意了: 输入上面的命令后,终端会提示类似 ‘Enter file in which to save the key (xxx/.ssh/id_rsa): ‘, 这个时候要手动输入新的文件名, 因为之前已经生成了 id_rsa, 如果直接不输入任何内容直接回车,会导致之前的 id_rsa 被覆盖, 这里输入的是 xxx/.ssh/id_rsa_github 来区分github的 SSH Key, 再之后可以 回车采用默认值。

同样, 将 id_rsa_github.pub 的公钥字符串粘贴到 github 上创建一个SSH Key

3. 此时 ls ~/.ssh/ 可以看到至少有两对公钥私钥文件 id_rsa | id_rsa.pub id_rsa_github | id_rsa_github.pub

4. 将两对私钥添加到 ssh-agent (此处参考github help)

4.1 确保启用 ssh-agent

1
2
$ eval "$(ssh-agent -s)"
Agent pid 59566

search内容有告知使用ssh-agent bash, 在个人的环境会出现这样的错误而失败, 暂时没有去细究

1
2
$ ssh-agent bash
bash: __git_ps1: command not found

再确认启用 ssh-agent之后, 正式添加私钥

1
2
3
4
5
$ ssh-add ~/.ssh/id_rsa
Identity added: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

$ ssh-add ~/.ssh/id_rsa_github
Identity added: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

5. 修改配置文件

在 ~/.ssh目录下修改或新建config文件, 添加如下内容

gitlab

Host gitlab.com
HostName gitlab.com
IdentityFile ~/.ssh/id_rsa

github

Host github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa_github

6. 测试验证

1
2
$ ssh -T git@github.com
Hi user! You've successfully authenticated, but GitHub does not provide shell access.

表示成功连上github

坚持原创技术分享,您的支持将鼓励我继续创作!