一开始在中文语境下就这个问题搜索相关文章,找到的都是在介绍用git bash生成密钥对用于ssh连接,例如下面的命令可以生成一组rsa密钥对:

1
$ ssh-keygen -t rsa

我个人在配置git环境时希望实现可以自由地选择将某个私钥导入git环境,用于ssh连接,这样配置公私钥时也更有灵活性,比如我在一台主机上使用git bash生成了一对密钥,在这台主机上自动导入了私钥用于连接,但如果我想在另一台主机上使用同一个私钥进行连接,而不是再生成并配置一对密钥对,就需要换一种方法。

图为由于我的git服务器设置了仅允许密钥登录,未配置私钥时,尝试git clone克隆仓库到本地,拒绝连接。

image-20210503163526730

这里先提供我自己的方法,我们在windows环境下安装git bash后,安装目录下会有一个ssh配置文件../etc/ssh/ssh_config,向文件中添加一行,指明我们要导入的私钥即可。

其中..指的是git bash安装的根目录,这个目录位置看起来应该很熟悉,linux环境下也是以/etc/ssh/ssh_config文件作为ssh客户端的配置文件。

这里提供一个示例具体说明一下:

假设我的私钥文件是D:/keys/private_key,git bash安装在D:/git

打开配置文件D:/git/etc/ssh/ssh_config,下面节选一段

1
2
3
4
5
6
7
8
9
10
#   AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
# Port 22
# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
# MACs hmac-md5,hmac-sha1,[email protected]

IdentityFile private_key_file_path也就是我们指定导入的私钥,我们在ssh_config中配置了一个私钥后,作为客户端进行ssh连接时就会自动尝试使用这里指定的私钥进行认证。

所以我们在文件中加一行:

1
2
3
4
5
6
7
8
9
10
11
#   AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask
IdentityFile "D:/T/keys/privatekey"
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
# Port 22
# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
# MACs hmac-md5,hmac-sha1,[email protected]

这样就成功导入了私钥,再次尝试git clone,连接成功。

image-20210503163650311

补充资料

在StackOverflow上找到一则提问,指出在github docs中提供了一种使用ssh-agent的解决方案,缺点是每次开启git bash都需要重新启动ssh-agent并使用ssh-add命令导入私钥,比较繁琐。

实现方法如下:

1
2
3
$ eval $(ssh-agent -s)
> Agent pid pid_number
$ ssh-add D:/keys/private_key

参考资料

How can I add an already generated SSH key to git bash? - StackOverflow

Adding your SSH key to the ssh-agent - github Docs