最近在配置 GitLab SSH Key 时,遇到了一个看似简单却让人头大的问题:明明已经把公钥添加到了 GitLab,但是拉取代码时却一直失败,提示权限被拒绝。经过一番排查,终于发现问题的根源——本地 SSH 私钥文件的权限设置不对。


一、问题现象

当我执行 git clone git@gitlab.com:xxx/xxx.git 或者 git pull 时,终端返回了如下错误:

git@gitlab.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

我第一反应是:公钥是不是没加对?于是我又去 GitLab 检查了一遍,确认公钥内容完全一致,标题也没问题。但问题依旧存在。


二、排查过程

1. 验证 SSH 连接

我先执行了 GitLab 官方推荐的验证命令:

ssh -T git@gitlab.com //可修改为公司部署地址

返回的结果依然是 Permission denied,这说明问题确实出在本地 SSH 配置上,而不是 GitLab 端。

2. 检查本地 SSH 目录

Windows右键打开git bash
在这里插入图片描述

我查看了 .ssh 目录下的文件和权限:

ls -al ~/.ssh

输出如下:

drwxr-xr-x 1 1586662930 1049089    0 Feb 12 08:50 ./
drwxr-xr-x 1 1586662930 1049089    0 Feb 12 11:10 ../
-rw-r--r-- 1 1586662930 1049089 2610 Feb  7 2025 id_rsa
-rw-r--r-- 1 1586662930 1049089  575 Feb  7 2025 id_rsa.pub
-rw-r--r-- 1 1586662930 1049089 282 Feb  7 2025 known_hosts
-rw-r--r-- 1 1586662930 1049089 101 Feb  7 2025 known_hosts.old

这里的关键信息是 id_rsa(私钥)的权限是 -rw-r--r--(即 644)。

3. 问题根源:权限过宽

SSH 协议对私钥文件的权限有严格的安全要求。如果私钥文件的权限太开放,允许同组或其他用户读取,SSH 客户端会认为这是一个安全风险,从而拒绝使用这个密钥进行身份验证。

  • 正确的私钥权限600(只有文件所有者才有读写权限,其他用户无任何权限)
  • 正确的目录权限700(只有文件所有者才有读写执行权限)

我之前的私钥权限是 644,这就导致了 SSH 客户端拒绝使用它,从而引发了权限被拒绝的错误。


三、解决方案

1. 修正文件权限

在终端中执行以下两条命令,分别修正 .ssh 目录和私钥文件的权限:

# 修正 .ssh 目录权限
chmod 700 ~/.ssh

# 修正私钥文件权限
chmod 600 ~/.ssh/id_rsa

2. 再次验证连接

权限修正后,再次执行验证命令:

ssh -T git@gitlab.com

如果配置正确,你会看到欢迎信息:

Welcome to GitLab, @你的用户名!

这表明 SSH 连接已经成功建立,现在可以正常拉取和推送代码了。


四、总结与预防

  1. 核心原因:GitLab SSH 拉取失败,提示 Permission denied,很可能是本地私钥文件 id_rsa 的权限设置过宽(如 644),导致 SSH 客户端出于安全考虑拒绝使用该密钥。
  2. 解决步骤
    • 使用 chmod 600 ~/.ssh/id_rsa 修正私钥权限。
    • 使用 chmod 700 ~/.ssh 修正目录权限。
    • ssh -T git@gitlab.com 验证连接。
  3. 预防建议
    • 生成 SSH Key 后,养成检查权限的习惯。
    • 不要随意修改 .ssh 目录及其内部文件的权限。
    • 私钥 id_rsa 是敏感信息,绝对不能泄露给他人。

希望这篇踩坑记录能帮到遇到同样问题的朋友,避免在权限问题上浪费太多时间。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐