gitlab-ci SSH密钥无效格式

时间:2018-08-31 06:36:38

标签: gitlab gitlab-ci

我想使用gitlab-ci运行部署脚本,但是步骤ssh-add $SSH_PRIVATE_KEY返回错误:

echo "$SSH_PRIVATE_KEY" | ssh-add -
Error loading key "(stdin)": invalid format

您可以看到我的.gitlab-ci.yml

deploy:
  image: node:9.11.1-alpine
  stage: deploy
  before_script:
    # Install ssh-agent if not already installed, it is required by Docker.
    # (change apt-get to yum if you use a CentOS-based image)
    - 'which ssh-agent || ( apk add --update openssh )'

    # Add bash
    - apk add --update bash

    # Add git
    - apk add --update git

    # Run ssh-agent (inside the build environment)
    - eval $(ssh-agent -s)

    # Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
    - echo "$SSH_PRIVATE_KEY"
    - echo "$SSH_PRIVATE_KEY" | ssh-add -

    # For Docker builds disable host key checking. Be aware that by adding that
    # you are suspectible to man-in-the-middle attacks.
    # WARNING: Use this only with the Docker executor, if you use it with shell
    # you will overwrite your user's SSH config.
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    # In order to properly check the server's host key, assuming you created the
    # SSH_SERVER_HOSTKEYS variable previously, uncomment the following two lines
    # instead.
    # - mkdir -p ~/.ssh
    # - '[[ -f /.dockerenv ]] && echo "$SSH_SERVER_HOSTKEYS" > ~/.ssh/known_hosts'
  script:
    - npm i -g pm2
    - pm2 deploy ecosystem.config.js production
  # only:
  # - master

在我的项目设置中,我已经从生产服务器cat ~/.ssh/id_rsa.pub中添加了SSH_PRIVATE_KEY变量和id_rsa。

有人可以帮助我吗?

12 个答案:

答案 0 :(得分:6)

就我而言,我不得不在SSH_PRIVATE_KEY变量的末尾添加新行

答案 1 :(得分:2)

我犯了一个愚蠢的错误,并添加了没有-----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY-----子句的密钥。

总结一下,您应该添加:

-----BEGIN RSA PRIVATE KEY-----
<< the key itself goes here >>
-----END RSA PRIVATE KEY-----

此外,请确保在结束符后有换行符。

答案 2 :(得分:1)

就我而言,这是因为我已将 SSH_PRIVATE_KEY变量设置为受保护的。当我禁用“保护”状态时,它没有任何错误。

enter image description here

答案 3 :(得分:1)

默认情况下,它是〜/ .ssh / id_rsa.pub中的SSH公钥。

私钥包含在〜/ .ssh / id_rsa

答案 4 :(得分:1)

确保文件变量末尾的换行符存在。如果没有,就会出现以下错误:

function testpromise(){
  return new Promise((resolve, reject)=>{
    reject("Error");
  })
}


testpromise()
.then(()=>{console.log("Then")})
.catch((err)=>{console.log(err)})

在此示例中,Load key "/home/.../....tmp/ID_RSA": invalid format [MASKED]@...: Permission denied (publickey). 是我的文件变量。

答案 5 :(得分:0)

使用

  SSH_PRIVATE_KEY: |
    -----BEGIN OPENSSH PRIVATE KEY-----

代替

  SSH_PRIVATE_KEY: >
    -----BEGIN OPENSSH PRIVATE KEY-----

'|'将保存换行符'\ n'

答案 6 :(得分:0)

它与变量扩展一起使用(双括号中的花括号):

  - echo "${SSH_PRIVATE_KEY}" | ssh-add -

同时保护SSH_PRIVATE_KEY变量!

此方法只是打印变量的less ambiguous method;在这种情况下,它会阻止最后一个换行符的修剪。

答案 7 :(得分:0)

就我而言,这是因为我已将SSH_PRIVATE_KEY变量设置为在特定环境中可用。我将其更改为我正在使用的(或者您可以将其更改为全部,具体取决于您的设置)。

答案 8 :(得分:0)

如果您从 PuTTYgen 导出密钥,则要使用其命令对话-导出OpenSSH密钥(强制采用新文件格式) << / p>

修剪最后的空格并添加新行。

答案 9 :(得分:0)

我在gitlab和bitbucket上遇到了这个问题,都解决了在密钥文件末尾添加\ n的问题。

x = "simpleOriginDate"

答案 10 :(得分:0)

您必须复制文件(id_rsa)的全部内容,包括最后的空白行。我用这种方法解决了这个问题。

答案 11 :(得分:-1)

我让它使用受保护的变量。

如果变量是文件,则echo将不再起作用:

cat "$SSH_PRIVATE_KEY" | ssh-add -

否则;如果变量不是文件,请使用以下命令:

echo "$SSH_PRIVATE_KEY" | ssh-add -