GitLab Runner CI 管道内的 SSH 连接无法验证主机密钥

Posted

技术标签:

【中文标题】GitLab Runner CI 管道内的 SSH 连接无法验证主机密钥【英文标题】:SSH Connection Inside GitLab Runner CI Pipeline Not Able to Verify Host Key 【发布时间】:2021-04-13 13:16:13 【问题描述】:

我正在尝试在我的 GitLab CI 管道中设置一个阶段,签出一个私有 GitLab 存储库,但我似乎无法让 SSH 身份验证工作。

在我的本地机器上,我创建了一个 SSH 私钥/公钥对。我使用本地计算机仅用于创建该密钥对,而不是将其用作服务器/GitLab 运行器。

我已将公钥作为部署密钥添加到我的 GitLab 存储库中。我将私钥作为一个名为$GIT_SSH_PRIV_KEY 的受保护变量。

下面的代码处于一个阶段,我现在只是在测试ssh -T git@gitlab.com 是否可以正确验证。

    stage: git_merge
    before_script:
        - apt-get update -qq
        - apt-get install openssh-client -qq
        - eval $(ssh-agent -s)
        - echo "$GIT_SSH_PRIV_KEY" | tr -d '\r' | ssh-add - > /dev/null
        # - ssh-add <(echo "$GIT_SSH_PRIV_KEY")
        - mkdir -p ~/.ssh && touch ~/.ssh/known_hosts
        - echo $"SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
        - chmod 644 ~/.ssh/known_hosts
    script:
        - ssh -T git@gitlab.com

我在管道中收到的错误是Host Key verification failed,所以我不确定我的问题目前在哪里。

【问题讨论】:

- echo $"SSH_KNOWN_HOSTS" $ 和 " 的顺序错误。 【参考方案1】:

我已将公钥作为部署密钥添加到我的 GitLab 存储库中。我将私钥作为一个名为$GIT_SSH_PRIV_KEY 的受保护变量。

但是,作为documented by GitLab,您必须将SSH_KNOWN_HOSTS 创建为“Key”的新variable,并作为“值”添加ssh-keyscan 的输出(因为error message is related to ~/.ssh/known_hosts) .

## Use the domain name
ssh-keyscan example.com

## Or use an IP
ssh-keyscan 1.2.3.4

通过在.gitlab-ci.yml 中直接使用变量而不是 ssh-keyscan,它的好处是,如果主机域名因某种原因发生更改,您不必更改 .gitlab-ci.yml。 此外,这些值是您预定义的,这意味着如果主机密钥突然更改,CI/CD 作业不会失败,因此服务器或网络有问题。

如评论所述,该变量必须用作"$SSH_KNOWN_HOSTS",而不是$"SSH_KNOWN_HOSTS"

【讨论】:

以上是关于GitLab Runner CI 管道内的 SSH 连接无法验证主机密钥的主要内容,如果未能解决你的问题,请参考以下文章

gitlab-runner:管道无限等待

gitlab ssh runner 失败。怎么了?

Gitlab-ci - 管道无法运行

GitLab CI shell runner不继承系统环境变量

GitLab CI 管道阶段超时

Windows 上的 Gitlab Build Runner 使用 HTTP 而不是 SSH