You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI/CD无法使用SSH公钥认证问题求助

GitLab CI SSH认证失败问题解决

问题根源

你的问题主要出在三个核心点:

  • 私钥权限不符合SSH安全要求,被拒绝使用
  • SSH命令未明确指定要加载的私钥文件
  • 私钥在GitLab变量中可能存在格式损坏

分步修复

1. 修正私钥权限与存储路径

SSH强制要求私钥文件权限为600(仅所有者可读可写),644权限会被直接拦截。同时需要把变量中的私钥写入到SSH可识别的路径:

before_script:
  # 创建.ssh目录(容器环境默认不存在)
  - mkdir -p ~/.ssh
  # 将GitLab变量中的私钥写入本地文件
  - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
  # 设置SSH要求的严格权限
  - chmod 600 ~/.ssh/id_rsa
  # 预加载服务器公钥到已知主机,避免交互式确认中断流程
  - ssh-keyscan 你的服务器域名或IP >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts

2. 确保SSH命令使用指定私钥

如果私钥写入到默认路径~/.ssh/id_rsa,SSH会自动读取;如果写入到自定义路径,需要在命令中显式指定:

script:
  # 使用默认路径私钥连接服务器执行操作
  - ssh 服务器用户名@服务器IP "docker login 你的镜像仓库地址 && docker start 目标容器名"
  # 若私钥在自定义路径,添加-i参数指定
  # - ssh -i /custom/path/private_key 服务器用户名@服务器IP "xxx"

3. 检查GitLab变量中的私钥格式

进入仓库Settings > CI/CD > Variables,编辑SSH_PRIVATE_KEY:

  • 确认私钥完整包含开头-----BEGIN OPENSSH PRIVATE KEY-----和结尾-----END OPENSSH PRIVATE KEY-----
  • 中间的每一行换行必须保留,不要把私钥合并成单行
  • 若启用了变量的Masked选项,确保私钥格式未被掩码规则截断

4. 验证私钥有效性(可选)

在CI流程中添加验证步骤,确认私钥未损坏:

before_script:
  # ... 前面的步骤
  # 从私钥导出公钥,和服务器authorized_keys中的内容对比
  - ssh-keygen -y -f ~/.ssh/id_rsa

额外检查项

  • 服务器上~/.ssh/authorized_keys文件必须包含你的公钥,且文件权限为600,.ssh目录权限为700
  • 确认GitLab CI变量的Protected设置未限制当前分支/标签使用该变量

内容的提问来源于stack exchange,提问作者Cyborganizer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:20:48