为多个平台或平台下多个账号设置SSH协议访问

由于工作和个人原因要经常使用GitHub和GitLab代码托管平台,GitHub下还有多个账号,然后就经常需要在多平台多账号之间来回切换,很麻烦。平常使用SSH协议来访问代码仓库比较多一些,那有没有什么好办法来解决账号来回切换繁琐问题呢?下面来具体分析各种使用场景,找到解决问题的办法

使用SSH协议来访问代码仓库

需要经过两步

  • 信任远程主机(对应于known_hosts文件,类似于Https证书)
  • 在远程主机上配置由客户端生成的公钥(对应于id_rsa.pub文件)

信任远程主机

  • 上图的意思是说,无法确认github.com(13.229.188.59)主机的真实性,它的的公钥指纹是nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8,问问你还要不要继续连接
  • 首先要弄明白公钥指纹是什么鬼,非对称加密会生成一个私钥和一个公钥,然而公钥一般比较长(具体取决于公钥长度位数),不易用来比对,为了方便和简化别人来比对,对公钥进行MD5计算,生成一个相对较短的指纹,再进行比对,就容易很多
  • 那我们怎么来知道远程主机的公钥指纹,然后进行比对呢。拿GitHub来举栗,可以访问github-s-ssh-key-fingerprints这个地址得知,发现公钥指纹一致,证明github.com(13.229.188.59)这个远程主机真实可信,可以继续和它进行连接

经过这一步后可以去查看known_hosts文件(MAC环境在~/.ssh目录下),可以发现github.com(13.229.188.59)的公钥已经写入到文件中,主机的真实性现在已经得到了确认,下次就不会再有警告

  • 如果仔细看了上面的几个步骤,并自己实践了的话,发现我们还是没有权限通过SSH协议去访问相应的仓库。我们已经信任了远程主机,但是远程主机还没有信任我们,换句话说远程主机还没有确认我们的身份,是不是平台的用户呀?(还不赶紧去注册一个!)假如现在注册好了GitHub账号,加入了组织,但是也没提示我们输入用户名和密码,原来像GitHub和GitLab这样的代码托管平台使用SSH时默认采用的是公钥登录方式

SSH协议公钥登录

SSH协议其实是支持用户名和密码登录的,也支持公钥登录,GitHub和GitLab默认采用的是公钥登录这种方式,何为公钥登录?详细的可以看这篇博文

  • 每次输入用户名和密码非常不方便,严重影响我们的工作效率,尤其每天有个100次提交(夸张手法),输一百次用户名和密码要吐
  • 公钥登录安全,不会泄露自己的用户名和密码,只需要把自己本地生成的公钥给到平台,就是哥哥你别把私钥给别人(把你的比特币加密私钥给我还是可以的)
  • 公钥登录方便,一经配置,用到天荒地老
    优点讲了这么多,下面来看看怎么操作吧。大家看这篇文章就可以了(generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent),不多说

多平台和平台多账号配置SSH协议公钥登录

我们现在已经实现了一个平台下单个账号的公钥登录,还剩两个,多平台平台多账号公钥登录配置

多平台公钥登录

其实原理很简单,不同的平台host地址肯定是不同的,比如github.com,13.229.188.59git.coding.net,123.59.82.236,那么我们只要为不同的host地址生成各自的公私钥对,然后在公钥登录的时候使用相应的公私钥对。SSH协议本身也支持这种方式,只需要在~/.ssh目录下创建config文件,然后配置host对应的公私钥对文件

  • 为不同host生成公私钥对

  • 为不同的host配置不同的公私钥对

单平台多账号公钥登录

可以为不同的host配置不同的公私钥对以实现公钥登录,通过上面的配置我们可以发现,SSH协议其实是根据主机地址来路由到不同的公私钥对文件的,那如果是相同主机地址多个账号(单平台多账号)该怎么办?主要思想还是通过配置不同的主机地址来实现,既然SSH协议是在本地通过config文件中配置的信息来读取不同的公私钥对文件,那么我们只要为不同的账号配置不同的主机地址就可以了

访问远程仓库的时候要修改为本地config文件中配置的Host名字