Gitlab自动部署失效,服务器日志报no matching host key type found错误
问题根因
- 你的CI配置使用了
php:latest滚动更新标签,近期该镜像内置的OpenSSH客户端版本升级,新版OpenSSH默认废弃了传统主机密钥算法,仅主动向服务端提供sk-ecdsa-sha2-nistp256@openssh.com、sk-ssh-ed25519@openssh.com两种安全密钥类算法 - 你的目标服务器运行的是OpenSSH 7.6p1版本,该版本发布时未支持上述两种sk前缀的算法,双方密钥协商失败导致连接中断,你之前的修改逻辑完全颠倒:不需要让客户端新增支持sk类算法,而是要让客户端兼容服务端已有的传统算法
修复方案
方案一(推荐,一劳永逸)
修改.gitlab-ci.yml中deploy任务的两处配置,主动指定服务端支持的传统算法:
image: php:latest deploy: stage: deploy only: - master before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - echo "$SSH_KEY" | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh # 修改ssh-keyscan指定扫描传统算法的主机密钥 - ssh-keyscan -H -t ecdsa-sha2-nistp256,ssh-ed25519,ssh-rsa $SSH_HOST > ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts script: # 修改ssh命令指定兼容传统主机密钥算法 - ssh -o HostKeyAlgorithms=+ssh-rsa,ssh-ed25519,ecdsa-sha2-nistp256 $SSH_USER@$SSH_HOST "cd $SSH_PATH && git pull origin master"
方案二(临时兼容)
将镜像从滚动的latest标签替换为之前稳定运行的固定版本号标签,比如image: php:8.1,避免镜像自动升级带来的依赖版本变动。
内容的提问来源于stack exchange,提问作者Andrzej S.
相关产品推荐
相关产品推荐

