从GitLab仓库部署代码至远程服务器遇权限拒绝错误求助
GitLab CI/CD SSH部署权限拒绝问题排查
可能遗漏的配置及解决方法
1. 私钥格式或解码问题
你使用base64 -d解码私钥,需确认存入CI/CD变量SSH_PRIVATE_KEY的内容确实是base64编码后的私钥。若当初直接复制未编码的私钥到变量,解码后会导致私钥损坏,触发error in libcrypto错误。
- 若私钥未编码,去掉解码步骤,直接写入:
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - 若需编码,本地重新生成base64格式的私钥后替换变量值:
cat ~/.ssh/id_rsa | base64 -w 0
2. .ssh目录及文件权限不全
仅设置id_rsa权限为600不够,.ssh目录本身权限必须为700,否则SSH会拒绝使用该目录下的密钥。
- 在
before_script中添加目录权限配置:- mkdir -p ~/.ssh && chmod 700 ~/.ssh - install -m 600 -D /dev/null ~/.ssh/id_rsa - echo "$SSH_PRIVATE_KEY" | base64 -d > ~/.ssh/id_rsa # 根据实际情况决定是否保留解码 - ssh-keyscan -H $SSH_HOST >> ~/.ssh/known_hosts # 用>>避免覆盖已有主机记录
3. 私钥带有密码短语
若SSH私钥设置了密码,CI环境无法自动解密,会导致加载密钥失败。
- 重新生成无密码的部署密钥(本地执行):
将新私钥存入CI/CD变量,公钥替换远程服务器ssh-keygen -t rsa -b 4096 -C "deployer@gitlab-ci" -N "" -f ~/.ssh/id_rsa_deployauthorized_keys中的旧内容。
4. 远程服务器权限配置错误
远程服务器上deployer用户的.ssh目录权限必须为700,authorized_keys权限必须为600,否则SSH会忽略公钥认证。
- 登录远程服务器执行:
sudo su - deployer chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
5. 使用ssh-agent托管密钥(更稳定)
Alpine环境中直接写入id_rsa可能因环境变量问题无法被SSH识别,用ssh-agent托管密钥更可靠。
- 修改
before_script为:- apk update && apk add openssh-client - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | base64 -d | ssh-add - # 根据实际情况决定是否保留解码 - mkdir -p ~/.ssh && chmod 700 ~/.ssh - ssh-keyscan -H $SSH_HOST >> ~/.ssh/known_hosts
内容的提问来源于stack exchange,提问作者Roberto Jobet
相关产品推荐
相关产品推荐

