使用SSH进行远端仓库身份验证
使用ssh进行GitHub身份验证
生成ssh key
使用ssh key进行连接/身份校验,需要先生成公私密钥,将公钥放到对应代码托管平台上,并在连接时使用相应的私钥。github目前推荐的keygen签名算法,以及密钥对生成方式:
$ ssh-keygen -t ed25519 -C "your_email@example.com"
> ...
生成公私密钥对后,将公钥放到对应代码托管平台上看起来像是下面这样。在进行ssh连接时,默认会使用唯一的私钥进行校验
同时,可以将github的public
key存放到自己设备的~/.ssh/known_hosts
下,就不会在初次使用ssh连接github时需要手动校验
GitHub 的 SSH 密钥指纹 - GitHub Docs
😅 手动校验时会输出下述类似内容,你可能已经见过了…
> The authenticity of host '[ssh.github.com]:443 ([140.82.112.36]:443)' can't be established.> ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU...
ssh config 配置
在一台设备上使用ssh-keygen生成多个公私密钥,将公钥放到对应代码托管平台上,再通过编辑~/.ssh/config
来决定什么情况下使用哪一个私钥进行校验。
在一些情况下,还需要编辑.git目录下的config文件,来指定fetch / push时使用的url。
生成多个公私钥对之后,使用config如此配置
# Default GitHub
Host github.com # 使用`ssh -T username@host`中匹配的`host`会被解析为下面的HostName
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519 # 对应的私钥
# Work GitHub 第二个账号
Host work.github.com # 同理,这里用`work.github.com`匹配此规则,会被解析为github.com
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_work # 指定对应的私钥
测试配置是否成功
$ ssh -T git@github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.
$ ssh -T git@work.github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.
参考:
https://stackoverflow.com/questions/3225862/multiple-github-accounts-ssh-config
问题解决:通过HTTPS的SSH连接
在命令行执行ssh -T
git@github.com
时可能得到下述的输出结果
ssh: connect to host github.com port 22: Connection timed out
这个问题可能是由于所在设备防火墙禁用了ssh连接(我也怀疑可能是因为墙导致github.com解析失败,因为同样使用port22的我自己的gitea是可以使用ssh连接/验证的,而我使用的clash只设置了http / https的代理)。
这个问题可以参考stackoverflow或者官方的解决方案:
ssh: connect to host github.com port 22: Connection timed out
Using SSH over the HTTPS port - GitHub Docs
💡 443是https使用的端口,顺带一提,http使用的端口是80。
核心思路是github也部署了ssh.github.com
这个域名,并借用443端口来建立ssh连接,因为大多数设备环境是不会禁用443端口的。
在命令行执行以下命令来测试是否可以使用此解决方案:
$ ssh -T -p 443 git@ssh.github.com
> Hi USERNAME! You've successfully authenticated, but GitHub does not
> provide shell access.
如果得到了上述输出,现在你可以通过以下命令来clone你的仓库了:
$ git clone ssh://git@ssh.github.com:443/YOUR-USERNAME/YOUR-REPOSITORY.git
> ...
通过ssh config建立基于https的ssh连接
想要更便利地使用443端口来建立与github的ssh连接,可以使用编辑~/.ssh/config
的方式,在配置文件中加入/调整下述内容
Host github.com
Hostname ssh.github.com # 注意这里是另一个github域名
Port 443 # 使用443端口
User git
现在,你可以像之前一样使用ssh连接GitHub.com了
$ ssh -T git@github.com
> Hi USERNAME! You've successfully authenticated, but GitHub does not
> provide shell access.
P.S. gitlab也有类似的解决方案,可以参考:gitlab使用https建立ssh连接