我使用 Yubikey 连接多个服务器。我在 Windows 下执行此操作,这与 .ssh 目录中的 sshconfig 配合得很好。
现在我遇到一种情况,我需要在 Linux 下运行一些东西,并使用 YubiKey 连接到相同的服务器。所以我安装了 WSL(Ubuntu),并将我的配置和密钥从我的 Windows SSH 配置复制到 WSL 环境。当连接到仅使用密码或仅使用密钥文件而不使用 YubiKey 的服务器时,SSH 通常可以正常工作。
但是每个需要 YubiKey 的连接都会失败并出现以下错误(由于显而易见的原因,更改了 IP 和名称):
Confirm user presence for key ED25519-SK SHA256:BnVjcbhrBbURNA7KSkTI22C0Z9/6avSGpC72GbIvOJw
sign_and_send_pubkey: signing failed for ED25519-SK "/home/kgr/.ssh/keys/admin@server": device not found
[email protected]: Permission denied (publickey).
遗憾的是,我没有找到有关此处发生的“未找到设备”的任何信息。
有任何提示可能导致这种情况的原因吗?或者 WSL 是否需要一些特殊步骤才能正确使用 YubiKey?
编辑:我忘了提一些事情,因为这没什么区别:
我关注了https://levelup.gitconnected.com/how-to-use-a-yubikey-in-wsl2-linux-on-windows-96f176518583但没有成功。一旦我尝试在 WSL 中使用任何 gpg 命令,它就会说没有这样的设备,而在 Windows 中它可以工作。
我还在网上发现一些评论,自 Gpg4win 版本 4 以来,.bashrc 条目必须指向 AppDataLocal 中的配置。但我也尝试过,并没有什么区别。
编辑2:经过一些有用的评论,我可以在 WSL 中使用 gpg --card-status 查看我的卡。无论如何,ssh 连接仍然失败并出现相同的错误。运行 gpg --card-status 时我注意到的一件事是“版本”条目显示“0”。不确定这有多大关系。由于目前一切似乎都正常,但 ssh 失败了,所以我有点不知所措。
答案1
文章 如何在 Windows 上的 WSL2(Linux)中使用 Yubikey 包含所需的 WSL2 设置。
安装所需的软件包:
sudo apt update
sudo apt upgrade
sudo apt install socat iproute2
mkdir ~/.ssh
wget https://github.com/BlackReloaded/wsl2-ssh-pageant/releases/latest/download/wsl2-ssh-pageant.exe -O ~/.ssh/wsl2-ssh-pageant.exe
chmod +x ~/.ssh/wsl2-ssh-pageant.exe
将以下内容附加到您的~/.bashrc
文件:
# SSH Socket
# Removing Linux SSH socket and replacing it by link to wsl2-ssh pageant socketexport SSH_AUTH_SOCK="$HOME/.ssh/agent.sock"
if ! ss -a | grep -q "$SSH_AUTH_SOCK"; then
rm -f "$SSH_AUTH_SOCK"
wsl2_ssh_pageant_bin="$HOME/.ssh/wsl2-ssh-pageant.exe"
if test -x "$wsl2_ssh_pageant_bin"; then
(setsid nohup socat UNIX-LISTEN:"$SSH_AUTH_SOCK,fork" EXEC:"$wsl2_ssh_pageant_bin" >/dev/null 2>&1 &)
else
echo >&2 "WARNING: $wsl2_ssh_pageant_bin is not executable."
fi
unset wsl2_ssh_pageant_bin
fi# GPG Socket
# Removing Linux GPG Agent socket and replacing it by link to wsl2-ssh-pageant GPG socketexport GPG_AGENT_SOCK="$HOME/.gnupg/S.gpg-agent"
if ! ss -a | grep -q "$GPG_AGENT_SOCK"; then
rm -rf "$GPG_AGENT_SOCK"
wsl2_ssh_pageant_bin="$HOME/.ssh/wsl2-ssh-pageant.exe"
if test -x "$wsl2_ssh_pageant_bin"; then
(setsid nohup socat UNIX-LISTEN:"$GPG_AGENT_SOCK,fork" EXEC:"$wsl2_ssh_pageant_bin --gpg S.gpg-agent" >/dev/null 2>&1 &)
else
echo >&2 "WARNING: $wsl2_ssh_pageant_bin is not executable."
fi
unset wsl2_ssh_pageant_bin
fi
现在重新启动 WSL2:
wsl.exe --shutdown
要测试 WSL2 中对 YubiKey 的访问,请尝试gpg --card-status
获取有关 yubikey 的信息。
要将密钥可信度更改为 ultimate :
$ gpg --edit-key 1CA87B39873495770098080098336BC4E5C445AB
gpg> trust
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.) 1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menuYour decision? 5
Do you really want to set this key to ultimate trust? (y/N) y
gpg> quit
如果您现在运行gpg --list-keys
密钥应该具有最终的信任。
有关更多详细信息,请参阅链接的文章。