克隆远程 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