GitHub操作中的SSH主机密钥验证失败-但密钥存在于KNOWN_HOSTS中 [英] SSH "Host key verification failed" in GitHub Actions - but key exists in known_hosts
问题描述
我在GitHub操作中有一个最奇怪的错误,我现在已经努力解决了好几个小时,我完全没有想法了。
我目前使用的是一个非常简单的GitHub操作。最终目标是在其他工作流中通过ssh运行特定的bash命令。
Dockerfile:
FROM ubuntu:latest
COPY entrypoint.sh /entrypoint.sh
RUN apt update && apt install openssh-client -y
RUN chmod +x entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
入口点.sh:
#!/bin/sh
mkdir -p ~/.ssh/
echo "$1" > ~/.ssh/private.key
chmod 600 ~/.ssh/private.key
echo "$2" > ~/.ssh/known_hosts
echo "ssh-keygen"
ssh-keygen -y -e -f ~/.ssh/private.key
echo "ssh-keyscan"
ssh-keyscan <IP>
ssh -i ~/.ssh/private.key -tt <USER>@<IP> "echo test > testfile1"
echo "known hosts"
cat ~/.ssh/known_hosts
wc -m ~/.ssh/known_hosts
action.yml
name: "SSH Runner"
description: "Runs bash commands in remote server via SSH"
inputs:
ssh_key:
description: 'SSH Key'
known_hosts:
description: 'Known Hosts'
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.ssh_key }}
- ${{ inputs.known_hosts }}
同一存储库中的当前工作流文件:
on: [push]
jobs:
try-ssh-commands:
runs-on: ubuntu-latest
name: SSH MY_TEST
steps:
- name: Checkout
uses: actions/checkout@v2
- name: test_ssh
uses: ./
with:
ssh_key: ${{secrets.SSH_PRIVATE_KEY}}
known_hosts: ${{secrets.SSH_KNOWN_HOSTS}}
在GitHub操作在线控制台中,我得到以下输出:
ssh-keygen
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, converted by root@844d5e361d21 from OpenSSH"
AAAAB3NzaC1yc2EAAAADAQABAAABAQDaj/9Guq4M9V/jEdMWFrnUOzArj2AhneV3I97R6y
<...>
9f/7rCMTJwae65z5fTvfecjIaUEzpE3aen7fR5Umk4MS925/1amm0GKKSa2OOEQnWg2Enp
Od9V75pph54v0+cYfJcbab
---- END SSH2 PUBLIC KEY ----
ssh-keyscan
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
<IP> ssh-ed25519 AAAAC3NzaC1lZD<...>9r5SNohBUitk
<IP> ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRNWiDWO65SKQnYZafcnkVhWKyxxi5r+/uUS2zgYdXvuZ9UIREw5sumR95kbNY1V90<...>
qWXryZYaMqMiWlTi6ffIC5ZoPcgGHjwJRXVmz+jdOmdx8eg2llYatRQbH7vGDYr4zSztXGM77G4o4pJsaMA/
***
Host key verification failed.
known hosts
***
175 /github/home/.ssh/known_hosts
据我所知,***
用于替换GitHub密钥,在我的情况下,GitHub密钥是已知主机的密钥。将***
作为ssh-keyscan
和cat known_host
的结果应该意味着known_hosts
文件是正确的,并且应该可以连接。因为在这两种情况下,GitHub都成功审查了控制台输出。由于该文件包含175个字符,因此我可以假定它包含实际的密钥。但如您所见,脚本失败,错误为Host key verification failed
。
当我在另一个工作流中使用完全相同的输入数据手动执行相同的步骤时,我成功了。从我的本地计算机使用相同的private_key
和known_host
文件的ssh也是如此。
例如,这适用于完全相同的秘密
- name: Create SSH key
run: |
mkdir -p ~/.ssh/
echo "$SSH_PRIVATE_KEY" > ../private.key
sudo chmod 600 ../private.key
echo "$SSH_KNOWN_HOSTS_PROD" > ~/.ssh/known_hosts
shell: bash
env:
SSH_PRIVATE_KEY: ${{secrets.SSH_PRIVATE_KEY}}
SSH_KNOWN_HOSTS: ${{secrets.SSH_KNOWN_HOSTS}}
- name: SSH into DO and run
run: >
ssh -i ../private.key -tt ${SSH_USERNAME}@${SERVER_IP}
"
< commands >
"
在entrypoint.sh
中对ssh命令使用 -o "StrictHostKeyChecking no"
标志也是有效的。但出于安全原因,我想避免这种情况。
我已经试图解决这个问题几个小时了,但我似乎遗漏了一个关键的细节。是否有人遇到类似问题或知道我做错了什么?
推荐答案
经过几个小时的搜索,我发现了问题所在。
当使用-o "StrictHostKeyChecking no"
选项强制接受所有主机密钥时,不会创建~/.ssh/known_hosts
文件。这意味着我安装在容器中的openssh客户端似乎不能读取该文件。
因此,告诉ssh命令在哪里查找该文件解决了问题:
ssh -i ~/.ssh/private.key -o UserKnownHostsFile=/github/home/.ssh/known_hosts -tt <USER>@<IP> "echo test > testfile1"
显然,用户还可以永久更改ssh_config
中known_hosts
文件的位置(请参阅here)。
希望这能在某个时候对某人有所帮助。
这篇关于GitHub操作中的SSH主机密钥验证失败-但密钥存在于KNOWN_HOSTS中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!