gitlab-ci SSH 密钥格式无效

s-l*_*ndz 31 gitlab gitlab-ci

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

echo "$SSH_PRIVATE_KEY" | ssh-add -
Error loading key "(stdin)": invalid format
Run Code Online (Sandbox Code Playgroud)

你可以看到我的.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
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以帮助我吗?

pan*_*909 46

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

在此处输入图片说明

  • 另请确保将变量设置为“VARIABLE”类型,而不是“FILE”类型 (5认同)
  • 或者你可以保护分支。在这种情况下,变量也可以保持受保护! (3认同)

Den*_*lot 18

在我的情况下,我不得不在SSH_PRIVATE_KEY变量的末尾放一个新行

  • @FelixOuttaSpace 只需在最后按 Enter 键即可 (4认同)

Joh*_*ohn 17

对于所有到达这篇文章但尚未找到解决方案的人。

尝试使分支受到保护,因为它是受保护变量所必需的。

受保护:仅暴露于受保护的分支或受保护的标签。

将 CI/CD 变量添加到项目中


API*_*API 9

它适用于变量扩展(双字符串引号中的大括号):

  - echo "${SSH_PRIVATE_KEY}" | ssh-add -
Run Code Online (Sandbox Code Playgroud)

同时保持SSH_PRIVATE_KEY变量受保护!

这种方法只是一种不太模糊的打印变量的方法;在这种情况下,它会阻止修剪最后一个换行符。

  • 很好的问题@ZemmouriTarek;这就是 [bash 管道](https://askubuntu.com/a/1074072) 的工作原理;破折号“-”只是表示没有更多选项,应该输入第一部分的输出 (2认同)

M. *_*ami 7

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

Load key "/home/.../....tmp/ID_RSA": invalid format
 [MASKED]@...: Permission denied (publickey).

Run Code Online (Sandbox Code Playgroud)

在这个例子中,这ID_RSA是我的文件变量。


Abr*_*Voy 6

我犯了一个愚蠢的错误并添加了没有-----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY-----条款的键。

总结一下,你应该补充:

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

Run Code Online (Sandbox Code Playgroud)

此外,确保存在关闭后的换行符。


Jav*_*vid 6

我让它与受保护的变量一起工作。

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

cat "$SSH_PRIVATE_KEY" | ssh-add -
Run Code Online (Sandbox Code Playgroud)

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

echo "$SSH_PRIVATE_KEY" | ssh-add -
Run Code Online (Sandbox Code Playgroud)


Sol*_*try 5

如果您从PuTTYgen导出密钥,要获取密钥内容,请使用其命令Conversations - Export OpenSSH key(强制使用新文件格式)

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