GitLab CI 中的 SSH 主机 key 验证失败

标签 ssh gitlab gitlab-ci

本地设置

我通过 ssh-keygen 创建了一个公共(public)和私有(private) SSH key 命令。

我决定先在本地设置私钥,然后在我的 repo 的 gitlab CI 上设置它。

我在服务器上设置了公钥(在这种情况下,另一个 gitlab 存储库,但这可能会在 future 发生变化并且不应该影响问题)。

我通过以下命令在本地成功地与服务器通信(在这种情况下,我通过 git 使用 SSH,但将来可能会再次更改):

git clone git@gitlab.com:...../......git

GitLab CI 设置

然后我决定在 gitlab CI 上设置私钥和通信。

在我的仓库中,我导航到设置 ->持续集成 ->变量,并添加了以下环境变量:
  • SSH_DEPLOY_PRIVATE_KEY - 我曾经使用与本地相同的私钥
  • SSH_KNOWN_HOSTS
  • 我拿了gitlab.com来自我本地计算机的 ~/.ssh/known_hosts 的已知主机文件
  • gitlab.com,35.231.145.151 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY=

  • 然后我在 .gitlab-ci.yml 内设置 SSH :
    script:
      - apt-get install openssh-client -y
      - eval $(ssh-agent -s)
      - echo "$SSH_DEPLOY_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
      - mkdir -p /.ssh && touch /.ssh/known_hosts
      - echo "$SSH_KNOWN_HOSTS" >> /.ssh/known_hosts
      - mkdir -p ~/.ssh
      - chmod 700 ~/.ssh
    

    这似乎工作正常,我收到以下消息:Identity added: (stdin) (runner@....)
    然后我添加了相同的git clone命令与服务器通信,但失败并出现以下错误:
    Cloning into '......'...
    Host key verification failed.
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.
    

    本地测试仍然有效。我使用上面相同的命令在本地设置 SSH(除了我使用 pacman -S openssh 来安装)。

    我该如何解决?

    编辑

    我知道我可以执行 ssh-keyscan直接在 GitLab CI 中,理论上这应该可以解决问题,但据我所知,这很容易受到中间人攻击。我正在尝试寻找更安全的解决方案。

    编辑 2

    运行后ssh-keyscan直接在 GitLab CI 中,我收到相同的错误消息。

    详细输出是相同的:
    $ GIT_SSH_COMMAND="ssh -vvv" git clone git@gitlab.com:..../.....git deployed
    Cloning into 'deployed'...
    Host key verification failed.
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.
    

    编辑 3

    似乎已连接到互联网。加 apt-get install否则不会工作。



    编辑 4

    我不明白为什么这是一项如此艰巨的任务。我关注了this article并且做的一切都是正确的。似乎还有很多其他类似的问题,也没有任何答案。这只是我们无法控制的 GitLab CI 问题吗?

    我现在也认为这与 SSH 服务器是另一个 GitLab 存储库这一事实有关。也许 GitLab CI 会阻止同一网络内的 SSH 连接。不知道为什么,但这是一种可能性。也不知道在没有 SSH 的情况下如何连接。

    编辑 5

    使用 GIT_SSH_COMMAND 时,详细输出显然不起作用,所以我尝试了没有 git 的 ssh 连接:
    ssh -vvvv git@gitlab.com
    

    日志输出:
    OpenSSH_6.7p1 Debian-5+deb8u5, OpenSSL 1.0.1t  3 May 2016
    debug1: Reading configuration data /etc/ssh/ssh_config
    debug1: /etc/ssh/ssh_config line 19: Applying options for *
    Pseudo-terminal will not be allocated because stdin is not a terminal.
    debug2: ssh_connect: needpriv 0
    debug1: Connecting to gitlab.com [35.231.145.151] port 22.
    debug1: Connection established.
    debug1: permanently_set_uid: 0/0
    debug1: key_load_public: No such file or directory
    debug1: identity file /root/.ssh/id_rsa type -1
    debug1: key_load_public: No such file or directory
    debug1: identity file /root/.ssh/id_rsa-cert type -1
    debug1: key_load_public: No such file or directory
    debug1: identity file /root/.ssh/id_dsa type -1
    debug1: key_load_public: No such file or directory
    debug1: identity file /root/.ssh/id_dsa-cert type -1
    debug1: key_load_public: No such file or directory
    debug1: identity file /root/.ssh/id_ecdsa type -1
    debug1: key_load_public: No such file or directory
    debug1: identity file /root/.ssh/id_ecdsa-cert type -1
    debug1: key_load_public: No such file or directory
    debug1: identity file /root/.ssh/id_ed25519 type -1
    debug1: key_load_public: No such file or directory
    debug1: identity file /root/.ssh/id_ed25519-cert type -1
    debug1: Enabling compatibility mode for protocol 2.0
    debug1: Local version string SSH-2.0-OpenSSH_6.7p1 Debian-5+deb8u5
    debug1: Remote protocol version 2.0, remote software version OpenSSH_7.2p2 Ubuntu-4ubuntu2.8
    debug1: match: OpenSSH_7.2p2 Ubuntu-4ubuntu2.8 pat OpenSSH* compat 0x04000000
    debug2: fd 3 setting O_NONBLOCK
    debug3: load_hostkeys: loading entries for host "gitlab.com" from file "/root/.ssh/known_hosts"
    debug3: load_hostkeys: loaded 0 keys
    debug1: SSH2_MSG_KEXINIT sent
    debug1: SSH2_MSG_KEXINIT received
    debug2: kex_parse_kexinit: curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
    debug2: kex_parse_kexinit: ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-dss-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-dss-cert-v00@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,ssh-rsa,ssh-dss
    debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se
    debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se
    debug2: kex_parse_kexinit: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1,hmac-md5-etm@openssh.com,hmac-ripemd160-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-md5-96-etm@openssh.com,hmac-md5,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
    debug2: kex_parse_kexinit: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1,hmac-md5-etm@openssh.com,hmac-ripemd160-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-md5-96-etm@openssh.com,hmac-md5,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
    debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib
    debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib
    debug2: kex_parse_kexinit: 
    debug2: kex_parse_kexinit: 
    debug2: kex_parse_kexinit: first_kex_follows 0 
    debug2: kex_parse_kexinit: reserved 0 
    debug2: kex_parse_kexinit: curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1
    debug2: kex_parse_kexinit: ssh-rsa,rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp256,ssh-ed25519
    debug2: kex_parse_kexinit: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
    debug2: kex_parse_kexinit: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
    debug2: kex_parse_kexinit: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
    debug2: kex_parse_kexinit: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
    debug2: kex_parse_kexinit: none,zlib@openssh.com
    debug2: kex_parse_kexinit: none,zlib@openssh.com
    debug2: kex_parse_kexinit: 
    debug2: kex_parse_kexinit: 
    debug2: kex_parse_kexinit: first_kex_follows 0 
    debug2: kex_parse_kexinit: reserved 0 
    debug2: mac_setup: setup umac-64-etm@openssh.com
    debug1: kex: server->client aes128-ctr umac-64-etm@openssh.com none
    debug2: mac_setup: setup umac-64-etm@openssh.com
    debug1: kex: client->server aes128-ctr umac-64-etm@openssh.com none
    debug1: sending SSH2_MSG_KEX_ECDH_INIT
    debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
    debug1: Server host key: ECDSA f1:d0:fb:46:73:7a:70:92:5a:ab:5d:ef:43:e2:1c:35
    debug3: load_hostkeys: loading entries for host "gitlab.com" from file "/root/.ssh/known_hosts"
    debug3: load_hostkeys: loaded 0 keys
    debug3: load_hostkeys: loading entries for host "35.231.145.151" from file "/root/.ssh/known_hosts"
    debug3: load_hostkeys: loaded 0 keys
    debug1: read_passphrase: can't open /dev/tty: No such device or address
    Host key verification failed.
    

    倒数第二行表示它正在尝试使用 /dev/tty 与终端通信。文件。当然,这个脚本是在非交互式庄园中运行的,所以它失败了。它不应该使用我的 key 而不是从终端请求密码吗?

    最佳答案

    您可能需要尝试将模式设置为 644 而不是 700。Verifying the SSH host keys 中建议使用 644。文档,也是 SSH 默认用于此文件的内容。 SSH 的某些部分对此非常特别 - 我不确定 known_hosts 是否特别。

    文档还提到您应该设置 SSH_KNOWN_HOSTS 的值ssh-keyscan 的整个输出的变量因为有多个键。

    编辑:

    以下.gitlab-ci.yml在 GitLab.com 上为我工作。注意 ~/.ssh/ 的使用而不是 /.ssh/ .

    image: ubuntu:latest
    
    test_job:
      script:
      - apt-get update
      - apt-get install openssh-client git-core -y
      - eval $(ssh-agent -s)
      - echo "$SSH_DEPLOY_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
      - mkdir -p ~/.ssh && touch ~/.ssh/known_hosts
      - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
      - git clone git@gitlab.com:gitlab-org/gitlab-ce.git
    

    关于GitLab CI 中的 SSH 主机 key 验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57290734/

    相关文章:

    SSH 连接超时

    linux - 通过 ssh 远程执行命令不起作用

    gitlab - 如何使用json输入在多行脚本中传递GitLab变量?

    ldap - 如何调试Gitlab LDAP身份验证?

    ubuntu - Gitlab:已经添加了SSH key ,仍然权限被拒绝

    docker - 无法在 gitlab CI 中构建 docker 镜像

    git - 如何在不每次输入密码的情况下将更改推送到远程存储库?

    GITLAB:将脚本输出保存在变量 .gitlab-ci.yml 中

    gitlab - 如何在每次推送到 GitHub 时运行 GitLab CI 管道?

    mysql - 如何在 Spring Boot 应用程序中通过 ssh 隧道连接到远程 mysql