GitLab SSH Key 添加步骤及注意事项 – wiki基地


GitLab SSH Key 添加步骤及注意事项:一篇详尽的指南

在使用 Git 进行版本控制时,与远程仓库进行交互(如克隆、拉取、推送)是核心操作。 GitLab 提供了多种与仓库通信的方式,其中最推荐且最安全便捷的方式之一是使用 SSH 协议配合 SSH 密钥。本文将深入探讨 SSH 密钥是什么,为什么应该使用它,以及如何在 GitLab 中详细添加和配置 SSH 密钥,同时涵盖各种重要的注意事项和常见问题的解决方法。

第一部分:理解 SSH Key 及其在 Git 中的作用

在详细介绍如何添加 SSH Key 之前,理解其背后的原理和优势至关重要。

1.1 什么是 SSH?

SSH (Secure Shell) 是一种网络协议,用于在不安全的网络上安全地执行命令、传输文件以及访问网络服务。它通过加密技术确保客户端与服务器之间的通信是机密和完整的。

1.2 为什么在 Git/GitLab 中使用 SSH?

在使用 Git 与 GitLab 交互时,你可以选择 HTTPS 或 SSH 协议。

  • HTTPS: 通常需要在使用 git clonegit pullgit push 时输入你的 GitLab 用户名和密码(或个人访问令牌 PAT)。虽然现代 Git 版本和凭据管理器可以缓存这些信息,但初次设置或在不同环境中使用时仍然需要输入,相对繁琐。而且,每次交互都需要验证身份,安全性取决于密码强度和个人访问令牌的保密性。
  • SSH: 使用 SSH 密钥进行身份验证。一旦设置好,你将无需每次输入密码,实现“无密码”访问。安全性基于密钥对的强度,且私钥无需暴露给网络。这大大提高了便捷性和安全性,尤其是在频繁与远程仓库交互的场景下。

1.3 SSH 密钥对是什么?

SSH 密钥对是实现 SSH 无密码、安全认证的核心。它由两个文件组成:

  • 私钥 (Private Key): 这是你的身份证明,必须严格保密,只能存储在你的本地计算机上。它相当于你的数字签名或个人印章。私钥文件的典型名称是 id_rsaid_ed25519 等(取决于加密算法),通常位于 ~/.ssh/ 目录下。
  • 公钥 (Public Key): 这是可以公开分享的部分。你可以将公钥上传到 GitLab、GitHub 或其他任何支持 SSH 认证的服务上。当 GitLab 收到一个 SSH 连接请求时,它会使用存储的公钥来验证请求是否来自于拥有对应私钥的客户端。它相当于一个锁,只有持有正确私钥的钥匙才能打开。公钥文件的典型名称是 id_rsa.pubid_ed25519.pub 等,通常位于私钥同目录下。

工作原理简述:

当你尝试通过 SSH 连接到 GitLab 时,你的本地 SSH 客户端会使用你的私钥对连接请求进行签名。 GitLab 服务器会使用你上传的公钥来验证这个签名。如果签名有效(即你的私钥与 GitLab 存储的公钥匹配),GitLab 就会确认你的身份,并允许你执行操作,而无需输入密码。这个过程是基于非对称加密算法实现的。

1.4 使用 SSH Key 的优势总结

  • 安全性更高: 相较于传输密码或 PAT,SSH 密钥认证更安全。私钥永不通过网络传输,降低了中间人攻击的风险。
  • 便捷性: 实现无密码访问,无需频繁输入认证信息,尤其适合自动化脚本或频繁的命令行操作。
  • 易于管理: 一个密钥对可以用于访问多个仓库(如果你将公钥添加到你的用户账户下),也可以根据需要为特定项目或服务器生成独立的密钥。

第二部分:生成您的 SSH Key Pair

使用 SSH 密钥的第一步是在你的本地计算机上生成一个密钥对。大多数操作系统(Linux、macOS、Windows 10+ 内置或通过 Git for Windows/WSL)都提供了 ssh-keygen 工具来完成此操作。

2.1 打开终端或命令行工具

  • Linux/macOS: 打开终端应用 (Terminal)。
  • Windows:
    • 推荐使用 Git Bash (随 Git for Windows 安装包一同提供)。
    • 可以使用 PowerShell (Windows 10 或更高版本)。
    • 可以使用 Windows Subsystem for Linux (WSL) 中的终端。

2.2 运行 ssh-keygen 命令

在终端中输入以下命令来生成新的 SSH 密钥对:

bash
ssh-keygen -t ed25519 -C "[email protected]"

或者,如果你需要更广泛兼容性(尽管 ed25519 更推荐),可以使用 RSA 算法:

bash
ssh-keygen -t rsa -b 4096 -C "[email protected]"

命令解释:

  • ssh-keygen: 生成 SSH 密钥对的命令。
  • -t ed25519 (或 -t rsa): 指定要生成的密钥类型。 Ed25519 是一个更现代、安全且通常更快的算法。 RSA 也是广泛支持的,-b 4096 指定了密钥长度为 4096 位,这比默认的 2048 位更安全。
  • -C "[email protected]": 为生成的密钥添加一个注释。这通常是你的电子邮件地址,用于标识这个密钥的归属,在你有多个密钥时特别有用。请将 "[email protected]" 替换为你在 GitLab 账户中使用的电子邮件地址。

2.3 按照提示进行操作

运行命令后,ssh-keygen 会提示你:

  1. Enter file in which to save the key (~/.ssh/id_ed25519):
    这是指定密钥文件的保存路径和名称。默认路径是 ~/.ssh/ 目录下,文件名为 id_ed25519 (或 id_rsa)。

    • 如果你是第一次生成密钥,直接按回车键接受默认路径即可。
    • 如果你之前生成过同名密钥,系统会询问是否覆盖 (Overwrite (y/n)?)。注意: 如果覆盖,旧的密钥将失效。如果你想保留旧密钥并生成新的用于不同目的,应该在这里输入一个新的文件名(例如 ~/.ssh/id_gitlab_ed25519)。
    • 在 Windows 上,~/.ssh/ 通常对应 C:\Users\你的用户名\.ssh\ 目录。
  2. Enter passphrase (empty for no passphrase):
    输入一个密码短语 (passphrase)。这是一个可选步骤,但强烈推荐设置一个密码短语。

    • 设置密码短语会为你的私钥加密。即使私钥文件落入坏人手中,没有密码短语也无法使用。
    • 每次使用私钥(如通过 SSH 克隆或推送)时,你需要输入这个密码短语。这虽然增加了一点点操作,但大幅提升了安全性。你可以使用 ssh-agent 工具来管理密码短语,避免每次都输入(详见后续注意事项)。
    • 如果不想设置,直接按回车键。但请记住,没有密码短语的私钥一旦泄露,任何人都可以使用它来冒充你访问 GitLab。
  3. Enter same passphrase again:
    再次输入密码短语以确认。

2.4 生成成功

如果一切顺利,你会看到类似以下输出:

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519.
Your public key has been saved in /home/user/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:........................................... [email protected]
The key's randomart image is:
+--[ED25519 256]--+
| .+E.+= |
| .+o O+ |
| ... B =. |
| . = + * . |
| o S = . |
| . . . |
| . |
| |
| |
+----[SHA256]-----+

这表示你的私钥 (id_ed25519) 和公钥 (id_ed25519.pub) 已经生成并保存在指定的目录 (~/.ssh/) 下。

第三部分:获取您的公共密钥内容

生成密钥对后,你需要将公共密钥的内容复制出来,以便粘贴到 GitLab 中。请记住,你只需要公钥 (.pub 后缀的文件) 的内容,永远不要分享你的私钥!

3.1 定位公钥文件

公钥文件通常位于与私钥相同的目录 (~/.ssh/) 下,文件名为私钥文件名加上 .pub 后缀。例如,如果私钥是 id_ed25519,则公钥是 id_ed25519.pub

3.2 查看并复制公钥内容

使用文本编辑器或命令行工具打开公钥文件并复制其全部内容。

  • Linux/macOS (使用 cat 命令):

    打开终端,运行以下命令:

    bash
    cat ~/.ssh/id_ed25519.pub

    (如果你的公钥文件名不同,请替换 id_ed25519.pub

  • Windows (使用 Git Bash):

    打开 Git Bash,运行以下命令:

    bash
    cat ~/.ssh/id_ed25519.pub

    (如果你的公钥文件名不同,请替换 id_ed25519.pub

  • Windows (使用 PowerShell):

    打开 PowerShell,运行以下命令:

    powershell
    Get-Content $HOME\.ssh\id_ed25519.pub

    (如果你的公钥文件名不同,请替换 id_ed25519.pub

  • 使用文件浏览器和文本编辑器:

    导航到 ~/.ssh/ 目录(在 Windows 上通常是 C:\Users\你的用户名\.ssh\,可能需要显示隐藏文件),找到对应的 .pub 文件,用记事本、VS Code、Sublime Text 等文本编辑器打开。

无论使用哪种方法,公钥的内容通常看起来像这样:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKK2Y...your_long_key_string... [email protected]

或者对于 RSA 密钥:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC...your_very_long_key_string... [email protected]

重要: 复制时请确保从 ssh-ed25519ssh-rsa 开头,到最后的注释(通常是你的邮箱地址)为止,完整复制所有内容,不要遗漏任何字符,也不要包含额外的换行符或空格。

第四部分:将公共密钥添加到 GitLab

现在你已经有了公共密钥的内容,可以将其添加到你的 GitLab 账户中了。

4.1 登录您的 GitLab 账户

打开网页浏览器,访问你的 GitLab 实例地址(例如 gitlab.com 或你公司的 GitLab 地址),然后使用你的用户名和密码登录。

4.2 导航到 SSH Keys 设置页面

  1. 登录后,点击页面右上角的用户头像。
  2. 在弹出的菜单中,选择 “Settings” (设置)。
  3. 在左侧导航菜单中,找到并点击 “SSH Keys” (SSH 密钥)。

4.3 添加您的新 SSH Key

在 SSH Keys 页面,你会看到一个区域用于添加新的密钥:

  1. “Key” 文本框中,粘贴你刚才复制的公共密钥的全部内容。
  2. “Title” (标题) 文本框中,为你的密钥设置一个有意义的名称。这个名称只是一个标识,方便你管理多个密钥。例如,你可以命名为 "My Laptop Key""Work Desktop SSH" 或包含计算机名和日期的名称。
  3. “Expiration date” (到期日期) 是一个可选但推荐的设置。为密钥设置一个到期日期可以增加安全性。一旦密钥到期,它将自动失效,无法再用于认证。你可以根据需要设置一个合适的期限,例如一年。到期前 GitLab 可能会发送提醒邮件。
  4. 确认信息无误后,点击绿色的 “Add key” (添加密钥) 按钮。

4.4 添加成功

如果公钥格式正确,并且成功添加到 GitLab,你会看到你的密钥出现在页面下方的列表中,显示标题、指纹 (Fingerprint)、创建日期和到期日期(如果设置了)。

恭喜!你已经成功将公共密钥添加到了 GitLab 账户。现在,GitLab 已经知道如何识别使用这个密钥对进行认证的连接请求。

第五部分:测试您的 SSH 连接

在开始使用 SSH URL 进行 Git 操作之前,强烈建议测试一下 SSH 连接是否正常工作。

5.1 打开终端或命令行工具

使用与你生成密钥时相同的终端或命令行工具。

5.2 运行 SSH 测试命令

输入以下命令并运行:

bash
ssh -T [email protected]

(如果你的 GitLab 实例地址不是 gitlab.com,请将 gitlab.com 替换为你的实例地址)

命令解释:

  • ssh -T: 通过 SSH 协议连接到指定主机,-T 选项表示不分配伪终端,通常用于测试连接。
  • [email protected]: 指定连接的用户和主机。对于 GitLab(以及大多数 Git 托管服务),SSH 连接通常使用一个特殊的用户名 git,而不是你自己的 GitLab 用户名。主机名是 GitLab 的域名。

5.3 第一次连接时的提示

如果是第一次通过 SSH 连接到 gitlab.com (或你的 GitLab 实例),你的 SSH 客户端会提示你确认主机的指纹 (Host Fingerprint)。这是为了防止中间人攻击,确保你连接的是真正的 GitLab 服务器。

输出会类似于:

The authenticity of host 'gitlab.com (35.231.145.151)' can't be established.
ED25519 key fingerprint is SHA256:...........................................
Are you sure you want to continue connecting (yes/no)?

重要: 你应该验证显示的指纹是否与 GitLab 官方提供的指纹匹配。你可以在 GitLab 的帮助文档或官方网站上找到其 SSH Host Key 指纹。例如,GitLab.com 的指纹可以在 https://docs.gitlab.com/ee/user/gitlab_com/#ssh-host-keys 找到。

  • 如果指纹匹配,输入 yes 并按回车键。
  • 如果指纹不匹配,请不要继续,这可能意味着存在安全风险。

输入 yes 后,该主机的指纹会被添加到你的 ~/.ssh/known_hosts 文件中,下次连接时就不会再询问了。

5.4 输入密码短语(如果设置了)

如果你在生成密钥时设置了密码短语,系统会提示你输入:

Enter passphrase for key '/home/user/.ssh/id_ed25519':

输入你的密码短语并按回车键。输入时密码是不可见的。

5.5 测试成功的输出

如果一切配置正确,并且你输入的密码短语(如果需要)是正确的,你会看到 GitLab 返回一个欢迎信息,通常类似于:

Welcome to GitLab, @your_username!

这条消息表明你的 SSH 连接已经成功通过你的密钥进行了身份验证。

第六部分:在 Git 中使用 SSH URL

SSH 连接测试成功后,你就可以开始在 Git 命令中使用 SSH URL 来与 GitLab 仓库交互了。

6.1 克隆仓库 (Cloning a Repository)

当你从 GitLab 克隆一个仓库时,选择 SSH URL。在 GitLab 仓库页面,点击 “Clone” 按钮,选择 “Clone with SSH”。复制提供的 SSH URL。

SSH URL 的格式通常是:git@your_gitlab_host:user/repository.git

例如:[email protected]:gitlab-org/gitlab-docs.git

然后,在终端中运行 git clone 命令:

bash
git clone [email protected]:your_username/your_project.git

(将 your_username/your_project.git 替换为你的仓库路径)

第一次克隆或推送时,如果设置了密码短语,可能需要输入。之后如果使用 ssh-agent 管理,通常无需再次输入。

6.2 为现有仓库更改远程 URL (Changing Remote URL)

如果你已经通过 HTTPS 克隆了仓库,并且想切换到 SSH 协议,可以更改远程仓库的 URL。

首先,查看当前的远程 URL:

bash
git remote -v

输出可能类似:

origin https://gitlab.com/your_username/your_project.git (fetch)
origin https://gitlab.com/your_username/your_project.git (push)

然后,使用 git remote set-url 命令将 origin 远程指向 SSH URL:

bash
git remote set-url origin [email protected]:your_username/your_project.git

再次查看远程 URL 确认更改:

bash
git remote -v

输出应变为:

origin [email protected]:your_username/your_project.git (fetch)
origin [email protected]:your_username/your_project.git (push)

现在,你就可以使用 git pullgit push 命令,通过 SSH 协议与 GitLab 仓库进行交互了。

第七部分:注意事项、高级配置与故障排除

7.1 密码短语 (Passphrase) 与 ssh-agent

正如前面提到的,为私钥设置密码短语是增强安全性的重要措施。然而,每次使用时都输入密码短语会比较麻烦。ssh-agent 就是用来解决这个问题的。

  • ssh-agent: 这是一个后台运行的程序,可以缓存你的解密后的私钥。将私钥添加到 ssh-agent 后,你只需要在会话开始时(或第一次使用该私钥时)输入一次密码短语,之后在同一个会话中,ssh-agent 会替你处理认证,无需再次输入密码短语。
  • 如何使用 ssh-agent:
    1. 启动 ssh-agent: 通常在登录终端会话时会自动启动。如果没有,可以手动运行 eval "$(ssh-agent -s)" (Linux/macOS/Git Bash) 或 Start-SshAgent (PowerShell)。
    2. 将私钥添加到 ssh-agent: 运行 ssh-add ~/.ssh/id_ed25519 (或你的私钥文件路径)。这时会提示你输入密码短语。
    3. 之后,只要 ssh-agent 正在运行且私钥已添加,SSH 连接就会自动使用缓存的密钥。

7.2 管理多个 SSH 密钥

有时你可能需要为不同的账户(例如,一个用于工作,一个用于个人项目)或不同的服务(GitLab, GitHub, Bitbucket 等)使用不同的 SSH 密钥。

你可以生成多个密钥对,例如:

  • ~/.ssh/id_ed25519_work (私钥) 和 ~/.ssh/id_ed25519_work.pub (公钥)
  • ~/.ssh/id_ed25519_personal (私钥) 和 ~/.ssh/id_ed25519_personal.pub (公钥)

然后,你需要将相应的公钥分别添加到你的工作 GitLab 账户和个人 GitLab 账户(或其他服务)。

为了告诉 SSH 客户端连接到特定主机时使用哪个私钥,你可以编辑 ~/.ssh/config 文件。如果文件不存在,可以手动创建一个。

~/.ssh/config 文件示例:

“`config

Default settings for GitLab.com using personal key

Host gitlab.com
Hostname gitlab.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519_personal # 指定个人密钥文件

Specific configuration for work GitLab instance

Host work.gitlab.com # 这是你在Git命令中使用的别名或实际主机名
Hostname work.gitlab.com # 实际的GitLab主机名或IP
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519_work # 指定工作密钥文件
Port 22 # 如果使用了非标准SSH端口,在此指定
“`

使用 ~/.ssh/config 后:

  • 连接 gitlab.com 时(例如 [email protected]:user/repo.git),SSH 会自动尝试使用 ~/.ssh/id_ed25519_personal 密钥。
  • 连接 work.gitlab.com 时(例如 [email protected]:user/repo.git),SSH 会自动尝试使用 ~/.ssh/id_ed25519_work 密钥。

这样你就可以在同一台计算机上轻松管理和使用不同的 SSH 密钥访问不同的服务或账户。

7.3 文件权限的重要性

SSH 对密钥文件的权限要求非常严格,以确保私钥的安全。如果权限设置不正确,SSH 客户端会拒绝使用这些文件。

  • ~/.ssh/ 目录: 权限应限制为只有所有者有读、写、执行权限。通常是 700 (drwxr-xr-x)。
  • 私钥文件 (e.g., id_ed25519, id_rsa): 权限应限制为只有所有者有读写权限。通常是 600 (-rw-------)。
  • 公钥文件 (e.g., id_ed25519.pub, id_rsa.pub): 权限可以稍微宽松,但最好也限制为只有所有者有读写权限,或者所有者读写,其他人只读。通常是 644 (-rw-r--r--) 或 600

可以使用 chmod 命令修改文件权限:

bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 # 替换为你的私钥文件
chmod 644 ~/.ssh/id_ed25519.pub # 替换为你的公钥文件

在 Windows 上,虽然 NTFS 权限系统与 Linux/macOS 不同,但 Git Bash 或 WSL 会模拟这些权限。如果遇到权限问题,有时需要检查文件属性。

7.4 常见问题与故障排除

  • 问题:Permission denied (publickey).Agent admitted failure to sign using the key.

    • 原因: 这是最常见的 SSH 认证失败错误。
    • 解决方法:
      • 确保你已经将正确的公共密钥添加到了 GitLab 账户。检查复制粘贴的内容是否完整且正确。
      • 确保你的本地计算机上存在与添加到 GitLab 账户的公钥对应的私钥
      • 检查私钥文件的权限是否正确 (600)。
      • 如果你设置了密码短语,确保你在被提示时输入了正确的密码短语。尝试手动使用 ssh-add 将私钥添加到 ssh-agent
      • 如果你有多个密钥,检查 ~/.ssh/config 是否正确配置,或者尝试使用 ssh -i ~/.ssh/your_private_key_file [email protected] 显式指定私钥文件进行测试。
      • 重启 SSH 客户端或你的终端。在 Windows 上,有时需要重启 ssh-agent 服务或重新打开 Git Bash。
  • 问题:Host key verification failed.

    • 原因: 连接的主机指纹与 ~/.ssh/known_hosts 文件中记录的不符。这可能是服务器的 SSH Key 发生了变化(例如,GitLab 升级或迁移),或者更糟,是中间人攻击。
    • 解决方法:
      • 首先,务必验证新的主机指纹是否与 GitLab 官方发布的指纹匹配。
      • 如果确认安全,需要从 ~/.ssh/known_hosts 文件中删除对应主机的旧指纹记录。错误信息通常会告诉你具体在哪一行需要删除。你可以手动编辑文件,或者使用 ssh-keygen -R hostname 命令来删除,例如 ssh-keygen -R gitlab.com
  • 问题:连接超时或连接被拒绝 (Connection timed out or Connection refused)

    • 原因: 可能是网络防火墙阻止了 SSH 连接(默认端口 22)。
    • 解决方法:
      • 检查本地防火墙设置。
      • 检查网络环境是否存在限制(例如,公司或学校网络可能限制出站连接)。
      • 联系网络管理员。
      • 如果 GitLab 配置了通过不同的端口提供 SSH 服务,确保你在连接时指定了正确的端口(例如,在 ~/.ssh/config 中设置 Port 或使用 ssh -p port_number [email protected])。
  • 问题:克隆或拉取/推送时仍然提示输入用户名密码 (即使使用了 SSH URL)

    • 原因: 你可能在 Git 仓库中仍然配置了 HTTPS 的远程 URL。
    • 解决方法: 使用 git remote set-url origin [email protected]:user/repo.git 命令将远程 URL 更改为 SSH URL。
  • 问题:GitLab 页面上看不到添加的 SSH Key

    • 原因: 可能添加失败或页面未刷新。
    • 解决方法: 检查粘贴的公钥内容是否有误,确保没有多余或缺失的字符。尝试重新添加。刷新页面。

7.5 安全最佳实践

  • 为私钥设置强密码短语: 增加一道防线,即使私钥文件泄露也能提供保护。
  • 不要分享你的私钥: 私钥是你的身份,绝不应该分享给任何人或上传到不受信任的服务。
  • 定期审查 GitLab 中的 SSH Key: 检查是否有不再使用的、未知来源的或已过期的密钥,及时删除它们。
  • 设置密钥到期日期: 尤其是在为特定目的临时添加密钥时,设置到期日期可以防止密钥在长期被遗忘后被滥用。
  • 保护好你的 ~/.ssh 目录和文件: 确保它们具有正确的严格权限,防止其他用户读取你的私钥。
  • 及时更新 SSH 客户端和操作系统: 使用最新的软件版本可以获得最新的安全修复和改进。
  • 验证主机指纹: 第一次连接到新主机时,务必验证其指纹,防范中间人攻击。

总结

通过本文,我们详细了解了 SSH 密钥在 GitLab 中的作用、如何生成、获取、添加、测试以及使用。SSH 密钥是安全、高效地与 Git 仓库交互的推荐方式。虽然初次设置可能涉及几个步骤,但一旦配置完成,它将极大地提升你的开发体验和工作效率。

遵循生成密钥、获取公钥、添加到 GitLab、测试连接的流程,并注意密码短语、多密钥管理、文件权限和安全实践,你就能安全顺畅地使用 SSH 与 GitLab 进行交互。如果在过程中遇到任何问题,回顾本文的故障排除章节,通常能找到解决方案。

希望这篇详尽的指南能帮助你顺利在 GitLab 中配置和使用 SSH Key!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部