Gilab CI:从环境变量加载 ssh 密钥

C T*_*que 1 ssh openssl docker gitlab-ci

我花了一天时间尝试将密钥对添加到 Gitlab CI 中的 docker 映像

当在 ssh-keygen 中加载密钥以生成 pub 密钥或在 ssh-add 中加载私钥时,我总是收到这些错误:“libcrypto 错误”或“格式无效”(取决于所使用的 docker 映像):

加载密钥“/root/.ssh/id_rsa”:libcrypto 中出现错误

代码如下:

job_deploy:
  image: ubuntu:kinetic
  stage: deploy
  rules:
    - if: $CI_PIPELINE_SOURCE == "push"
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == "master"

  environment: "staging"
  before_script:
    - 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client openssl libssl-dev -y )'
    - eval $(ssh-agent -s)
    # - echo -n "${SSH_PRIVATE_KEY}" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa
    - chmod -R 400 ~/.ssh
    - ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub # < error here
    # - ssh-add ~/.ssh/id_rsa

  script:
    - ssh root@00.00.00.00 "ls"
Run Code Online (Sandbox Code Playgroud)

ssh 密钥的变量如下所示:

SSH_PRIVATE_KEY: "-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAuNk4L4Cf4oDaDjXdjNydM6g5hg5/wGzxoqzENx2Xxq1QminyrZpB
...
Eo6Re1Rp+K3vifSALr2QbOfhd2yVy27oM8FuFQQpOppOJQPuWuwmSyHbT6AhIlAbo8E2v1
mrCMIVawQXSytHAAAAFmN5cHJpZW5AY3lwcmllbi11YnVudHUBAgME
-----END OPENSSH PRIVATE KEY-----"
Run Code Online (Sandbox Code Playgroud)

我尝试在变量末尾添加新行

我尝试将 docker 映像更改为 debian 和 ubuntu 的较新或较旧的映像,但错误仍然存​​在

libcrypto 中的错误

openssl 中存在此错误的问题:https ://github.com/openssl/openssl/issues/13443

但它已在 openssl-3.0.0-alpha16 中解决,并且 openssl 3.0.3 中也存在该错误

C T*_*que 5

这是我找到的解决方案:

  before_script:
    - 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client wget gnupg -y )'
    - wget -qO- https://get.docker.com/gpg | apt-key add -
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - touch ~/.ssh/config
    - touch ~/.ssh/known_hosts
    - chmod -R 400 ~/.ssh
    - ssh-keyscan <ip> >> ~/.ssh/known_hosts
    - '[[ -f /.dockerinit ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
Run Code Online (Sandbox Code Playgroud)

使用密钥内容创建变量 SSH_PRIVATE_KEY (在末尾添加空行)

话虽这么说,我无法让它与在我的开发机器上运行的运行程序一起工作。