SSH Key for Github

一、查看本机密钥

在iTerm:

1
2
cd ~/.ssh
ls

如果看到有id_rsa和id_rsa.pub,则说明该机器已经生成了SSH密钥,只要复制id_rsa.pub里的密钥即可。

1
cat id_rsa.pub

将会显示一个长字符串:

ssh-rsa *****….

否则,next

二、生成SSH密钥

1
2
3
4
//-t 密钥的类型,rsa类型,其实SSH2默认就是该类型,也可以无须指定
//-f 选项指定生成文件的文件名,否则默认就是id_rsa及id_rsa.pub
//-C "someone@email.com"用于识别这个密钥的注释
$ssh-keygen -t rsa -C "someone@email.com"

一路回车,在下面处输入密码,任意即可,后面需要建立SSH连接需要使用:

Enter passphrase (empty for no passphrase): # 输入密钥文件授权密码

Enter same passphrase again: # 确认密钥文件授权密码

经过上面之后,得到:id_rsa和id_rsa.pub两个文件。

三、重命名文件

我们将id_rsa 和id_rsa.pub重命名为id_rsa_github、 id_rsa_github.pub。

1
2
mv id_rsa id_rsa_github
mv id_rsa.pub id_rsa_github.pub

OK,生成之后:执行下面的命令,将生成的key添加

1
ssh-add id_rsa_github

添加成功后,显示:Identity added: id_rsa_github (id_rsa_github)

将id_rsa.pub中生成好的ssh key复制出来,在github profile设置中的ssh key中添加即可。

四、测试SSH连接

1
$ssh -T git@github.com

第一次连接,需要输入在第二步生成的密码;
此后,会提示你:

Hi wenghengcong! You’ve successfully authenticated, but GitHub does not provide shell access.

其中:

  • “You’ve successfully authenticated”:表明你已经成功为本机设置SSH密钥对,且与github服务器身份校验通过。

  • “but GitHub does not provide shell access”:是因为github提供的HTTPS方式,而不是SSH方式,查一下你设置的git库的remote url,看看使用的是哪种连接方式。

  • 可以添加-v开关(ssh -vT git@github.com),打开Verbose模式,SSH在连接过程中将打印debug1级别的调试跟踪信息。

五、添加多个公钥

按照上面步骤二、三生成另外一对密钥。例如:id_rsa_gitlab、 id_rsa_gitlab.pub

然后在config文件中配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
#github
Host github //别名
HostName github.com //域名
User git //用户
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github //私钥文件

#gitlab
Host gitlab
HostName gitlab.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_gitlab

此时,再次测试就可以用别名:

1
$ssh -T github.com

同样会提示你:

Hi wenghengcong! You’ve successfully authenticated, but GitHub does not provide shell access.

六、其他命令

1
2
//移除对应103.***ip地址的相关秘钥信息
$ ssh-keygen -R 103.*.*.*

错误

假如ssh连接遇到错误:packet_write_wait: Connection to xxx Broken pipe

可能是因为服务器空闲时间太长而关闭ssh连接(登录到服务器长时间不操作)。可以通过配置ssh客户端的ServerAliveInterval,或通过配置ssh服务端的ClientAliveInterval。

ssh服务端配置:

1
echo "ClientAliveInterval 600" | sudo tee -a /etc/ssh/sshd_config

ssh客户端配置:

1
echo "ServerAliveInterval 600" >> ~/.ssh/config

根据需要设置超时时间。

参考

多SSH密钥

Github Help

[How to tell git which private key to use?