在Jenkins中使用私有的Git npm仓库时,主机密钥验证失败

3

我们有一个使用了一些私有Bitbucket库作为npm依赖的Node项目。这些依赖项在我们的package.json中如下所示:

"errors": "git+ssh://git@bitbucket.org/[USER]/[REPO].git",

我们有一个由Jenkinsfile定义的Jenkins构建作业。该文件使用凭证插件来定义一个私有SSH密钥,该密钥用于在构建作业中拉取私有存储库,具体操作如下:
stage('Install dependencies') {
container('node-image') {
    sshagent(['degov-git']) {
        sh 'mkdir $HOME/.ssh && touch $HOME/.ssh/known_hosts && chmod 600 $HOME/.ssh/known_hosts'
        sh 'ssh-keyscan -t rsa bitbucket.org >> $HOME/.ssh/known_hosts'
        sh 'npm install'
    }
}

然而,我们收到了一个错误,即主机密钥验证失败:

[2019-05-05T07:36:26.027Z] npm ERR! Error while executing:
[2019-05-05T07:36:26.027Z] npm ERR! /usr/bin/git ls-remote -h -t ssh://git@bitbucket.org/[USER]/[REPO].git
[2019-05-05T07:36:26.027Z] npm ERR! Host key verification failed.

当在Jenkins中使用sshagent时,是否可以添加主机密钥?我们该如何操作?
谢谢。

你有找到这个问题的解决方案吗? - mik3fly-4steri5k
不好意思,目前我们还没有集成这些包作为Git子模块。 - Awemo
我终于解决了我的问题,但我不确定你和我的上下文是否完全相同。 我使用Ansible,然后使用来自私有存储库的子模块进行npm安装。 Ansible使用sudo执行npm命令,但作为普通用户登录,而ssh密钥和主机未被登录用户知道。我只是将ssh密钥和known_hosts复制并赋予登录用户正确的访问权限。虽然有点粗糙,但它完成了工作。 - mik3fly-4steri5k
1个回答

0
很可能,bitbucket.org 有许多公共服务器,因此仅对该单个URI进行密钥扫描并不一定有效(当随机到达不同的服务器时)。此外,将 (>> 而不是 >) 添加到 known_hosts 文件的策略最终会生成一个非常大的文本文件,其中包含重复、可能冲突的条目。Cloudbees 讨论了解决这个问题的策略。
一种解决方案可能是将keyscan调用更改为ssh-keyscan -t ‘ssh-rsa,ssh-dss’ $AGENT_HOSTNAME_OR_IP,这将收集其他密钥。我还会考虑使用~代替$HOME作为.ssh目录的位置,因为我最近在一个故障排除工作中发现它们不同。使用sh "printenv | sort"来显示作业中当前环境变量的确切值。
另一种解决方案可能不太可取,即返回到SSH Agent 直到2017年中期的先前行为,其中设置了StrictHostKeyChecking关闭。(在具有Jenkins服务器和本地Git服务器并排坐在一起的安全局域网上--也许通过私人网络--这可能是可以接受的。)这可以通过类似于sh"mkdir -p ~/.ssh && echo '主机 *' > ~/.ssh/config && echo ' StrictHostKeyChecking no'的方法清理和重写~/.ssh/config文件来完成。我想今天我不会在开放的Web上这样做,但这是值得在本地考虑的选项。

注意:Jenkins上的sshagent常见错误之一是报告uid不存在用户,因此ssh操作失败。几个版本前,SSH代理程序更新了一个底层库,现在需要在系统上提供一个预配用户。同样,可以采用类似于此Jenkins工单中的解决方案的方法来解决这个问题。

希望这里的信息能够帮助其他可能会遇到相关故障排除关键字的人们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接