有序管理SSH Keys,爆击Permission denied

Posted 凌日新

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有序管理SSH Keys,爆击Permission denied相关的知识,希望对你有一定的参考价值。

一、背景
【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过程日志,如果从日志上 分析不出来原因,还删除文件,从第一步再来一遍。

还是不行? 请联系笔者,笔者帮你 撮头发~

以上是关于有序管理SSH Keys,爆击Permission denied的主要内容,如果未能解决你的问题,请参考以下文章

Permission denied (publickey)

使用ssh keys实现免验证登陆远程服务

user permission (hadoop)

GitHub教程 SSH keys配置

permission denied怎么解决

github设置添加SSH Keys