GitLab SSH Key 设置教程 – wiki基地


GitLab SSH Key 设置教程:安全、便捷地连接你的代码仓库

在现代软件开发中,版本控制系统如 Git 已经成为不可或缺的工具。而像 GitLab 这样的平台则为代码托管、协作开发和 CI/CD 提供了强大的支持。在使用 Git 与 GitLab 交互时,我们需要一种安全且便捷的方式来验证身份。传统的 HTTPS 方式需要每次操作(如 git pushgit pull)都输入用户名和密码(或个人访问令牌),这既繁琐又存在安全风险。相比之下,使用 SSH Key 进行身份验证是一种更安全、更高效的方案。

本文将详细介绍如何在不同的操作系统环境下生成 SSH Key,将其添加到你的 GitLab 账户,并通过 SSH 安全地连接到 GitLab 仓库。无论你是初学者还是有一定经验的开发者,本教程都将为你提供清晰、全面的指导。

为什么选择 SSH Key 连接 GitLab?

在深入设置步骤之前,让我们先了解一下使用 SSH Key 的主要优势:

  1. 增强的安全性: SSH Key 基于非对称加密算法,使用一对密钥(公钥和私钥)进行认证。你的私钥始终保留在本地机器上,绝不通过网络传输。而公钥则放置在 GitLab 服务器上。认证过程依赖于加密挑战-响应,比简单传输密码更难被截获和破解。
  2. 极大的便捷性: 一旦设置完成并将私钥添加到 SSH 代理,你进行 Git 操作时将无需重复输入密码或令牌。只需要一次性的密钥添加或输入一次密钥的密码(Passphrase),后续操作都会自动认证,大大提高了工作效率。
  3. 自动化友好: SSH Key 特别适合用于自动化脚本和持续集成/持续部署(CI/CD)流程,无需在自动化环境中硬编码或频繁处理密码。
  4. 更少的错误: 避免了因手动输入密码错误导致的操作失败。

虽然 HTTPS 方式在某些场景下(例如通过公司代理)可能更易于配置,但对于日常开发工作来说,SSH Key 是更推荐的选择。

SSH Key 的基本概念

SSH Key 认证的核心是非对称加密。它涉及到两个密钥:

  • 私钥 (Private Key): 这是你本机上的秘密文件。它的安全性至关重要,绝不能与他人分享或上传到不安全的地方。想象它就像你家的钥匙。为了进一步保护私钥,你可以选择为其设置一个密码 (Passphrase),这样即使私钥文件本身被泄露,没有密码也无法使用。
  • 公钥 (Public Key): 这是可以公开分享的文件。它与你的私钥配对,可以用来验证持有对应私钥的人的身份。想象它就像你家的锁。你可以把这把锁安装在你想要访问的资源上(比如 GitLab 账户)。

当你想通过 SSH 连接到 GitLab 时,GitLab 会向你的客户端发起一个挑战,你的客户端使用本地的私钥对这个挑战进行加密签名,并将签名发送回 GitLab。GitLab 使用你之前上传的公钥来验证这个签名。如果签名有效,就证明你确实拥有与该公钥配对的私钥,从而允许连接和操作。

准备工作

在开始设置之前,请确保你已经具备以下条件:

  1. 安装 Git: 大多数操作系统都预装了 Git,或者可以轻松安装。你可以通过在终端或命令行输入 git --version 来检查。
  2. 拥有 GitLab 账户: 你需要在 GitLab.com 或你公司/组织的私有 GitLab 实例上拥有一个账户。
  3. 访问终端或命令行: 你需要在你的操作系统中打开一个终端(Linux/macOS)或命令提示符/PowerShell/Git Bash(Windows)。

设置步骤详解

SSH Key 的设置主要包括以下几个步骤:

  1. 检查本地是否已存在 SSH Key
  2. 生成新的 SSH Key Pair
  3. 将公钥添加到 GitLab 账户
  4. 将私钥添加到 SSH 代理 (SSH Agent)
  5. 测试 SSH 连接
  6. 配置 Git 仓库使用 SSH

我们将详细讲解每一步。

步骤 1: 检查本地是否已存在 SSH Key

在生成新的密钥之前,最好检查一下你的机器上是否已经有现有的 SSH Key。有时候你可能之前为其他服务(如 GitHub、Bitbucket)生成过密钥。

大多数操作系统将 SSH 密钥存储在用户主目录下的 .ssh 隐藏文件夹中。

在 Linux 和 macOS 上:

打开终端,输入以下命令:

bash
ls -al ~/.ssh

这个命令会列出 ~/.ssh 目录下的所有文件,包括隐藏文件(-al 选项)。

在 Windows 上 (使用 Git Bash 或 PowerShell):

如果你使用 Git Bash,命令与 Linux/macOS 相同:

bash
ls -al ~/.ssh

如果你使用 PowerShell 或命令提示符:

“`powershell
Get-ChildItem ~/.ssh -Force # PowerShell

dir %USERPROFILE%.ssh # Command Prompt
``
(注意:在命令提示符中,
.ssh是隐藏目录,dir可能需要/a` 选项才能显示)

检查输出:

查看输出列表中是否有类似以下名称的文件:

  • id_rsa (私钥) 和 id_rsa.pub (公钥) – 常见的 RSA 密钥
  • id_dsa (私钥) 和 id_dsa.pub (公钥) – 已不推荐使用
  • id_ecdsa (私钥) 和 id_ecdsa.pub (公钥) – ECDSA 密钥
  • id_ed25519 (私钥) 和 id_ed25519.pub (公钥) – 推荐的现代密钥类型

如果看到了 id_*.pub 这样的文件,说明你已经拥有一个或多个公钥。

你的选择:

  • 如果已经存在密钥并想继续使用它: 你可以跳过生成新密钥的步骤,直接进入步骤 3,将现有的 .pub 文件内容添加到 GitLab。
  • 如果已经存在密钥但想为 GitLab 生成一个专门的新密钥: 这是完全可以的,特别是当你希望为不同的服务使用不同的密钥,或者想使用更现代的密钥类型(如 ED25519)。继续进行步骤 2。
  • 如果 .ssh 目录不存在或为空白: 你必须生成新的密钥。继续进行步骤 2。

步骤 2: 生成新的 SSH Key Pair

现在,我们将使用 ssh-keygen 命令来生成一对新的公钥和私钥。推荐使用 ED25519 算法,因为它更安全、更快,并且生成的密钥文件更小。

打开终端或命令行,输入以下命令:

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

命令解释:

  • ssh-keygen: 用于生成、管理和转换认证密钥。
  • -t ed25519: 指定要生成的密钥类型为 ED25519。你也可以使用 -t rsa -b 4096 来生成 4096 位的 RSA 密钥,这也是一种常见的选择,但 ED25519 通常是首选。
  • -C "[email protected]": 添加一个注释到公钥文件中。这个注释并不会影响密钥的使用,但它非常有用,可以帮助你快速识别密钥的用途或所有者,特别是在 GitLab 界面中查看已添加的密钥列表时。务必将 "[email protected]" 替换为你注册 GitLab 账户时使用的邮箱地址或任何有意义的标识符(例如 "yourname@yourcompany for GitLab")。

执行命令后,ssh-keygen 会有一些交互式提示:

提示 1: Enter file in which to save the key (…)

Enter file in which to save the key (/Users/yourusername/.ssh/id_ed25519):

  • 解释: 这是询问你想将生成的密钥对保存在哪个文件中。默认路径是 ~/.ssh/id_ed25519 (私钥) 和 ~/.ssh/id_ed25519.pub (公钥),其中 id_ed25519 是基于你选择的算法类型和默认名称。
  • 你的操作:
    • 推荐(大多数情况): 直接按回车键接受默认路径和文件名。这是最简单的方式,特别是如果你只为所有服务使用一个 SSH Key。
    • 如果想生成一个专用于 GitLab 的新密钥 (当你已经有其他密钥时): 输入一个新的文件名,例如 ~/.ssh/id_gitlab_ed25519。这样会生成 ~/.ssh/id_gitlab_ed25519 (私钥) 和 ~/.ssh/id_gitlab_ed25519.pub (公钥)。这样做的好处是隔离了不同服务的密钥,但之后可能需要在 ~/.ssh/config 文件中进行额外配置(我们稍后会提到)。
  • 重要: 如果你指定的文件名已经存在,ssh-keygen 会询问是否覆盖。请谨慎操作! 如果你覆盖了现有的密钥,与该密钥关联的服务将无法再通过 SSH 方式连接,直到你更新这些服务的公钥。

提示 2: Enter passphrase (empty for no passphrase):

Enter passphrase (empty for no passphrase):

  • 解释: 这是让你为私钥设置一个密码 (Passphrase)。这是一个额外的安全层。
  • 你的操作:
    • 推荐: 输入一个强密码并按回车。使用密码可以保护你的私钥文件。即使有人获取了你的私钥文件,没有密码也无法使用它。在第一次使用需要该密钥的 SSH 连接时,你需要输入这个密码。之后如果使用 SSH Agent,可以将解密后的密钥保存在内存中,避免重复输入。
    • 如果追求极致便利(不推荐): 直接按回车键,不设置密码。这意味着任何人一旦获取你的私钥文件,就可以直接使用它进行身份认证。仅在你知道自己在做什么且私钥文件安全性极高的情况下考虑。
  • 选择密码后,请务必记住它! 如果你忘记了密码,将无法使用该私钥,不得不重新生成密钥。

提示 3: Enter same passphrase again:

Enter same passphrase again:

  • 解释: 再次输入你刚才设置的密码进行确认。
  • 你的操作: 再次准确输入相同的密码并按回车。

密钥生成成功后,你会看到类似以下的输出:

Your identification has been saved in /Users/yourusername/.ssh/id_ed25519.
Your public key has been saved in /Users/yourusername/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:............................................. [email protected]
The key's randomart image is:
+--[ED25519 256]--+
| |
| E . |
| o * + |
| . = B O |
| o * S = = |
| . o + + + . |
| . . . = + |
| . o . |
| .. |
+-----------------+

这表示你的私钥 (id_ed25519) 和公钥 (id_ed25519.pub) 已经成功生成并保存在指定的 .ssh 目录下。Fingerprint 是密钥的唯一标识符,可以用来验证密钥的真实性。Randomart image 是一种可视化表示,可以帮助人眼区分不同的密钥(虽然不太常用)。

步骤 3: 将公钥添加到 GitLab 账户

现在我们已经生成了公钥文件(.pub 文件),需要将它的内容复制并添加到你的 GitLab 账户设置中。

首先,获取公钥文件的内容:

公钥文件是以 .pub 结尾的那个文件(例如 id_ed25519.pubid_gitlab_ed25519.pub)。你需要将其中的文本内容完整复制下来。

在 Linux 和 macOS 上:

使用 cat 命令显示文件内容,然后复制输出:

“`bash
cat ~/.ssh/id_ed25519.pub

如果你生成了不同的文件名,请替换上面的文件名

例如:cat ~/.ssh/id_gitlab_ed25519.pub

“`

或者,使用系统命令直接将内容复制到剪贴板(更方便):

bash
pbcopy < ~/.ssh/id_ed25519.pub # macOS
xclip -selection clipboard < ~/.ssh/id_ed25519.pub # Linux (可能需要安装 xclip)
xsel --clipboard < ~/.ssh/id_ed25519.pub # Linux (可能需要安装 xsel)

在 Windows 上 (使用 Git Bash):

使用 cat 命令显示内容,然后复制:

“`bash
cat ~/.ssh/id_ed25519.pub

如果你生成了不同的文件名,请替换上面的文件名

“`

或者,使用 Windows 的 clip 命令结合 cat

bash
cat ~/.ssh/id_ed25519.pub | clip

在 Windows 上 (使用 PowerShell):

“`powershell
Get-Content ~/.ssh/id_ed25519.pub | Set-Clipboard

如果你生成了不同的文件名,请替换上面的文件名

“`

在 Windows 上 (使用 命令提示符):

“`cmd
type %USERPROFILE%.ssh\id_ed25519.pub | clip

如果你生成了不同的文件名,请替换上面的文件名

“`

无论使用哪种方式,最终目标是将公钥文件的全部内容复制到系统的剪贴板中。公钥内容通常是一长串以 ssh- 开头,中间是密钥本体,最后是你生成时指定的注释(如你的邮箱)。例如:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJl2P6x.../[email protected]

接下来,登录到你的 GitLab 账户:

  1. 打开你的浏览器,访问 GitLab.com 或你的私有 GitLab 实例地址。
  2. 使用你的用户名和密码登录。
  3. 点击右上角你的用户头像。
  4. 在下拉菜单中选择 “Settings” (设置)。
  5. 在左侧导航栏中,选择 “SSH Keys”
  6. “Add an SSH key” 区域:
    • Key 字段: 将你刚才复制的公钥内容完整粘贴到这个文本框中。确保没有多余的空格或换行符。
    • Title 字段: GitLab 会自动从公钥的注释部分(你使用 -C 参数指定的内容)填充一个标题。你可以保留这个标题,或者修改一个更容易识别的名称,例如 “My Laptop ED25519 Key” 或 “Work Desktop SSH Key”。这个标题仅仅是帮助你在 GitLab 界面中区分不同的密钥。
    • Expires at (可选): 你可以设置一个密钥的过期日期。这在某些安全策略下非常有用,例如为临时访问设置密钥时。对于你自己的常用开发机器,通常无需设置过期日期。
  7. 点击 “Add key” 按钮。

如果公钥格式正确,它将成功添加到你的 GitLab 账户,并显示在下面的列表中,包括它的标题、指纹 (Fingerprint) 和添加日期。如果出现错误,请仔细检查你复制的公钥内容是否完整且正确,以及是否粘贴到了正确的字段。

4. 将私钥添加到 SSH Agent

SSH Agent 是一个后台程序,它将你的私钥(可能需要密码解密)加载到内存中,并为你管理 SSH 认证过程。这样做的好处是,你只需要在第一次将密钥添加到 Agent 时输入密码(如果设置了的话),之后进行的所有 SSH 连接请求都可以由 Agent 自动处理,无需重复输入密码。

检查 SSH Agent 是否运行并添加密钥:

在 Linux 和 macOS 上:

SSH Agent 通常在你登录时自动启动。你可以使用 ssh-add 命令来检查 Agent 是否正在运行以及是否已加载密钥。

  1. 检查 Agent 状态并加载密钥:
    bash
    eval "$(ssh-agent -s)" # 如果Agent未运行,启动它
    ssh-add ~/.ssh/id_ed25519 # 添加你的私钥(替换文件名)
    # 如果你为私钥设置了密码,这里会提示你输入密码

    • eval "$(ssh-agent -s)": 这个命令会启动 SSH Agent(如果尚未运行)并设置必要的环境变量。
    • ssh-add <path_to_your_private_key>: 这个命令将指定的私钥文件加载到 Agent 的内存中。
  2. 检查已加载的密钥:
    bash
    ssh-add -l

    这个命令会列出 SSH Agent 中当前加载的所有密钥的指纹。如果你的密钥指纹出现在列表中,说明它已经成功添加到 Agent。

在 Windows 上 (使用 Git Bash):

Git Bash 提供了一个方便的脚本来处理 SSH Agent:

“`bash
start-ssh-agent # 启动或检查并启动 Agent
ssh-add ~/.ssh/id_ed25519 # 添加你的私钥(替换文件名)

如果有密码,会提示输入

“`

然后使用 ssh-add -l 检查。

在 Windows 上 (使用 PowerShell / 命令提示符):

Windows 10 及更高版本内置了 OpenSSH 客户端和 Agent 服务。通常 SSH Agent 服务 (ssh-agent) 默认是禁用的,你需要手动启动并设置为自动启动。

  1. 启动 SSH Agent 服务 (如果尚未运行):
    打开 PowerShell (以管理员身份运行):
    powershell
    Set-Service ssh-agent -StartupType Automatic # 设置为自动启动
    Start-Service ssh-agent # 立即启动服务

    然后,你可以使用 ssh-add 命令将密钥添加到 Agent。
    powershell
    ssh-add $env:USERPROFILE\.ssh\id_ed25519 # 添加你的私钥(替换文件名)
    # 如果有密码,会提示输入

  2. 检查已加载的密钥:
    powershell
    ssh-add -l

注意关于 SSH Agent 的持久性:

  • 在 Linux/macOS 上,使用 eval "$(ssh-agent -s)" 启动的 Agent 通常只在当前的终端会话中有效。为了让 Agent 在每次打开新终端时自动启动并加载密钥,你可能需要将其添加到你的 shell 配置文件中(如 ~/.bashrc, ~/.zshrc, ~/.profile)。或者,更推荐的方式是利用系统自带的密钥管理功能(如 macOS 的 Keychain),它可以在系统重启后仍然记住你的密码并将密钥加载到 Agent。配置方式通常是在 ~/.ssh/config 文件中添加 AddKeysToAgent yes 指令,并确保你的私钥路径正确。
  • 在 Windows 上,通过设置 ssh-agent 服务为自动启动,可以实现 Agent 的持久性。一旦服务启动并运行,你可以在任何终端窗口中使用 ssh-add 来管理密钥。

5. 测试 SSH 连接

在将公钥添加到 GitLab 并将私钥添加到 Agent 后,是时候测试一下 SSH 连接是否成功了。

打开终端或命令行,输入以下命令:

bash
ssh -T [email protected]

命令解释:

  • ssh: SSH 客户端程序。
  • -T: 禁用伪终端分配。这个选项在测试连接时很有用,它不会尝试登录到一个交互式 shell,而是直接执行一个空命令并退出。
  • [email protected]: 这是连接 GitLab 的标准 SSH 用户名和主机名。GitLab 使用 git 作为所有 SSH 连接的用户名,无论你的实际 GitLab 用户名是什么。gitlab.com 是 GitLab.com 的主机名。如果你使用的是私有 GitLab 实例,请将其替换为你实例的主机名(例如 [email protected])。

第一次连接时,你可能会看到一个警告:

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

  • 解释: 这是 SSH 客户端在验证 GitLab 服务器的身份。它告诉你 GitLab 服务器的公钥指纹,并询问你是否信任这个服务器。
  • 你的操作: 输入 yes 并按回车。
  • 重要: 在输入 yes 之前,你可以选择验证显示的指纹是否与 GitLab 官方提供的指纹一致,以防止中间人攻击。GitLab 的官方 SSH 主机密钥指纹可以在其帮助文档中找到。输入 yes 后,GitLab 的主机密钥将被添加到你的 ~/.ssh/known_hosts 文件中,以后再次连接时就不会再出现这个警告。

如果你的 SSH Key 设置正确,并且你已经将私钥添加到了 Agent (如果需要密码的话),你将看到类似以下成功信息:

Welcome to GitLab, @yourusername!
@yourusername 会替换为你实际的 GitLab 用户名)

这个消息表明你已通过 SSH 成功连接并认证到 GitLab!

如果出现错误信息,例如 “Permission denied (publickey).”, “Host key verification failed.”, 或 “Connection refused.”:

这意味着连接或认证失败。请参考本文后面的 “常见问题及故障排除” 部分进行排查。

6. 配置 Git 仓库使用 SSH

现在你的 SSH 连接已经测试成功,你需要确保你的本地 Git 仓库配置为使用 SSH 协议与 GitLab 交互。

对于新克隆的仓库:

在你从 GitLab 克隆一个新的仓库时,直接使用 SSH URL 进行克隆。在 GitLab 仓库页面,找到克隆按钮,切换到 SSH 选项,复制提供的 URL。它通常看起来像这样:

[email protected]:yourgroup/yourrepo.git

然后使用这个 URL 克隆:

bash
git clone [email protected]:yourgroup/yourrepo.git

对于已经存在的、通过 HTTPS 克隆的仓库:

如果你已经通过 HTTPS 克隆了一个仓库,并且现在想切换到 SSH 方式,你需要修改仓库的远程 (remote) URL。

  1. 进入你的本地仓库目录:
    bash
    cd /path/to/your/local/repo

  2. 查看当前的远程 URL:
    bash
    git remote -v

    你会看到类似这样的输出(HTTPS URL):
    origin https://gitlab.com/yourgroup/yourrepo.git (fetch)
    origin https://gitlab.com/yourgroup/yourrepo.git (push)

  3. 修改远程 URL 为 SSH URL:
    你需要获取你的仓库的 SSH URL。可以在 GitLab 网站上找到(仓库页面 -> Clone -> SSH)。URL 格式通常是 [email protected]:yourgroup/yourrepo.git
    使用以下命令修改远程 URL:
    bash
    git remote set-url origin [email protected]:yourgroup/yourrepo.git

    yourgroup/yourrepo.git 替换为你仓库实际的路径。

  4. 再次查看远程 URL 确认修改:
    bash
    git remote -v

    现在你应该看到 SSH URL 了:
    origin [email protected]:yourgroup/yourrepo.git (fetch)
    origin [email protected]:yourgroup/yourrepo.git (push)

现在,你在这个仓库中执行的 git pull, git push, git fetch 等操作都将使用 SSH 协议进行身份认证,享受无密码的便捷体验了。

高级配置: ~/.ssh/config 文件

对于更复杂的场景,例如为不同的 GitLab 实例(GitLab.com 和私有实例)使用不同的 SSH Key,或者需要指定非标准端口,你可以通过配置 ~/.ssh/config 文件来实现。

如果 ~/.ssh 目录下没有 config 文件,可以手动创建一个。

以下是一个 ~/.ssh/config 文件示例:

“`

Default settings for most connections

Host *
AddKeysToAgent yes
UseKeychain yes # macOS specific, stores passphrase in keychain
IdentityFile ~/.ssh/id_ed25519 # Default private key

Configuration for GitLab.com

Host gitlab.com
Hostname gitlab.com
User git
IdentityFile ~/.ssh/id_ed25519 # Use this specific key for gitlab.com
# If you generated a dedicated key for GitLab, use its path:
# IdentityFile ~/.ssh/id_gitlab_ed25519

Configuration for a private GitLab instance

Host mygitlab.company.com # You can give it a nickname
Hostname gitlab.mycompany.com # The actual host address
User git
Port 22 # Standard SSH port, omit if default
IdentityFile ~/.ssh/id_mycompany_gitlab_rsa # Use a different key for this host
“`

配置解释:

  • Host: 定义一个别名或实际主机名。当你使用 ssh mygitlab.company.com 或在 Git 仓库 URL 中使用 mygitlab.company.com 时,SSH 客户端会查找匹配的 Host 条目并应用其下的配置。
  • Hostname: 实际连接的主机名或 IP 地址。
  • User: 连接时使用的用户名(对于 GitLab 总是 git)。
  • Port: 连接时使用的端口(默认是 22)。如果 GitLab 使用了不同的 SSH 端口(例如 443),可以在这里指定。
  • IdentityFile: 指定用于此连接的私钥文件路径。
  • AddKeysToAgent yes: 如果你的 SSH Agent 正在运行,且这个密钥尚未加载,SSH 会尝试将它自动添加到 Agent 中。这对于设置了密码的密钥非常有用。
  • UseKeychain yes: (macOS 特有) 允许 SSH 将密钥的密码存储在 macOS 的钥匙串中,这样系统重启后也不需要重新输入密码。

通过配置 ~/.ssh/config,你可以灵活地管理多个密钥和连接设置。

常见问题及故障排除

设置 SSH Key 过程中可能会遇到一些问题。以下是一些常见的问题及其解决方案:

  1. 错误: Permission denied (publickey).

    • 原因: SSH 认证失败。这通常是因为 GitLab 没有接受你提供的公钥进行认证。
    • 排查:
      • 公钥是否正确添加到 GitLab? 登录 GitLab,检查你的 SSH Keys 设置页面,确认你的公钥已添加并显示在那里。复制公钥内容时是否完整?是否有额外的空格或换行?尝试删除并重新添加。
      • 本地使用的是正确的私钥吗? 确保你尝试连接时,SSH 客户端正在使用与添加到 GitLab 的公钥相匹配的私钥。
      • 私钥是否已添加到 SSH Agent? 如果你的私钥设置了密码,并且你没有在每次连接时手动输入密码,那么密钥必须加载到正在运行的 SSH Agent 中。使用 ssh-add -l 检查 Agent 中是否包含你的密钥指纹。如果不在,使用 ssh-add <path_to_private_key> 添加。
      • 私钥文件的权限是否正确? 在 Linux/macOS 上,私钥文件(如 id_ed25519)的权限应该是 600 (只有所有者可读写),.ssh 目录的权限应该是 700 (只有所有者有完全权限)。公钥文件 (.pub) 权限可以是 644。使用 chmod 600 ~/.ssh/id_ed25519chmod 700 ~/.ssh 来修正。
      • 是否为私钥设置了密码但忘记了? 如果你忘记了密码,你将无法使用该私钥。唯一的办法是重新生成密钥对并将其公钥添加到 GitLab。
  2. 错误: Host key verification failed.

    • 原因: SSH 客户端在 ~/.ssh/known_hosts 文件中记录了 GitLab 服务器的公钥。如果服务器的公钥发生变化(例如 GitLab 升级、服务器重建或存在中间人攻击),与本地记录不符,就会出现此错误。
    • 排查:
      • GitLab 服务器的公钥是否真的改变了? 这种情况不常见,但可能发生。如果你确定连接的主机是正确的 GitLab 服务器,并且你信任它,可以从 ~/.ssh/known_hosts 文件中删除旧的条目。SSH 会告诉你具体在哪一行:Offending key in /Users/yourusername/.ssh/known_hosts:N。你可以手动编辑文件删除该行,或者使用命令:
        bash
        ssh-keygen -R gitlab.com
        # 如果是私有实例,替换为主机名:
        # ssh-keygen -R your-company-gitlab.com
      • 再次尝试连接 (ssh -T [email protected])。第一次连接时会再次询问你是否信任主机,输入 yes 将新的主机密钥添加到 known_hosts
  3. 错误: Connection refusedConnection timed out

    • 原因: 无法建立到 GitLab 服务器的 SSH 连接。
    • 排查:
      • 防火墙问题? 你的本地防火墙、路由器防火墙或公司网络防火墙可能阻止了对 GitLab 服务器 SSH 端口(默认 22)的访问。请联系网络管理员检查。
      • GitLab 是否使用非标准 SSH 端口? 有些 GitLab 实例可能配置为在其他端口(如 443)上运行 SSH,以便绕过某些防火墙限制。查看你的 GitLab 实例文档或联系管理员确认。如果使用非标准端口,你需要在连接命令或 ~/.ssh/config 中指定端口,例如:
        bash
        ssh -T -p 443 [email protected]
      • GitLab 服务器是否正在运行? SSH 服务可能暂时中断。稍后再试或检查 GitLab 的状态页面。
      • 主机名或 IP 地址是否正确? 确保你连接的是正确的 GitLab 主机名或 IP 地址。
  4. 错误: ssh-keygenssh-add 命令找不到

    • 原因: Git 或 OpenSSH 客户端没有正确安装或不在系统的 PATH 环境变量中。
    • 排查: 确保你已经正确安装了 Git (它通常包含 OpenSSH 客户端工具) 并且 Git 的 bin 目录已添加到系统的 PATH 中。在 Windows 上,Git Bash 环境通常已经配置好了。
  5. Git 推送/拉取仍然提示输入密码

    • 原因: 你的本地 Git 仓库仍然配置为使用 HTTPS URL。
    • 排查: 按照本文步骤 6,检查并修改 Git 仓库的远程 URL 为 SSH URL (git remote -vgit remote set-url)。

总结

通过本文的详细教程,你应该已经掌握了为 GitLab 设置 SSH Key 的全部流程。从理解 SSH Key 的工作原理和优势,到生成密钥、添加到 GitLab、配置 SSH Agent,再到测试连接和故障排除,我们涵盖了大部分必要的信息。

使用 SSH Key 是连接 GitLab 最安全、最便捷的方式之一。它不仅提高了你的开发效率,减少了重复输入密码的烦恼,更重要的是,它通过非对称加密提供了强大的安全保障。

记住要妥善保管你的私钥,不要轻易分享。如果为私钥设置了密码,并利用 SSH Agent 或系统密钥管理功能,可以进一步提升安全性和便利性。

祝你在使用 Git 和 GitLab 的过程中一切顺利!

发表评论

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

滚动至顶部