克隆远程 Git 仓库时,HTTPS 和 SSH 是两个常用的传输协议。HTTPS 设置更简单,通常只需用户名和个人访问令牌即可认证。而 SSH 使用非对称加密算法(如 RSA/Ed25519 等),提供端到端加密和主机验证,安全性更强,但设置稍微繁琐。

设置单个 SSH

如果你只需要连接一台 Git 服务器,典型的 SSH 设置流程如下:

# 生成密钥对
ssh-keygen -t ed25519 -C "SSH Key Comments"

# 显示公钥信息
cat ~/.ssh/id_ed25519.pub

# 将公钥信息复制到 Git 仓库的设置页面

# 启动代理
eval "$(ssh-agent -s)"

# 向代理中添加私钥
ssh-add ~/.ssh/id_ed25519

# 测试 SSH 连接是否成功
ssh -T git@example.com

命令 ssh-keygen 用于生成密钥,它的 -t 选项用于指定加密算法类型。目前的默认类型是 ed25519,它的安全性和加解密性能都要高于以前的 rsa 加密算法。

如果想查看已经加载的密钥,可以执行:

ssh-add -l

注意,复制 Fedora Linux 终端文字的快捷键是 Ctrl+Shift+C,而不是 Ctrl+C。因为 Ctrl+C 快捷键的作用是中断命令的执行。

在某些操作系统中,会自动进行添加私钥的动作,此时你不必手动执行 eval "$(ssh-agent -s)"ssh-add xxx 这两条命令。

另外,在 Fedora 等采用 Wayland 显示协议的 GNOME 桌面系统中,可以使用如下命令将文件内容直接拷贝至系统剪贴板:

wl-copy < filename

设置多个 SSH

你可能使用多个 Git 服务器,比如一个是 GitHub,另一个是 Gitee,可以为每个服务器设置独立的 SSH 密钥。

# 生成 GitHub 专用密钥
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_github -C "GitHub SSH Key"

# 生成 Gitee 专用密钥
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_gitee -C "Gitee SSH Key"

上面命令会生成两套密钥,共四个密钥文件。

复制生成的公钥信息至各自设置面板:

# 复制到 GitHub 的 Settings > SSH and GPG Keys 页面
cat ~/.ssh/id_ed25519_github.pub

# 复制到 Gitee 的【设置】>【SSH 公钥】页面
cat ~/.ssh/id_ed25519_gitee.pub

接下来,需要编辑或创建 ~/.ssh/config 配置文件,为不同域名指定密钥:

vim ~/.ssh/config

文件内容如下所示(具体参数需要根据你的实际情况做相应调整):

# GitHub 配置
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github
  IdentitiesOnly yes

# Gitee 配置
Host gitee.com
  HostName gitee.com
  User git
  IdentityFile ~/.ssh/id_ed25519_gitee
  IdentitiesOnly yes

然后,测试每个服务器的 SSH 连接:

ssh -T git@github.com

ssh -T git@gitee.com

当你第一次测试服务端连接时,会出现如下信息:

$ ssh -T git@github.com
The authenticity of host 'github.com (20.205.243.166)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

上面打印的密钥指纹,可以和 GitHub 提供的官方文档作比对,如果数据一致,输入 “yes”,那么 GitHub 的信息就会存储在 ~/.ssh/known_hosts 文件中。

如果认证成功,将出现字样:Hi username! You've successfully authenticated...

修改仓库地址

通过 HTTPS 连接的仓库地址模式是 https://github.com/username/repo.git,而通过 SSH 连接的仓库地址模式为 git@github.com:username/repo.git

如果你原来使用 HTTPS 的方式克隆的 Git 仓库,可以通过以下命令改为 SSH 连接方式:

git remote set-url origin git@github.com:username/repo.git