我正在尝试通过智能卡技术 SSH 到 CentOS 7.5 机器 (192.168.1.5)。
现在我可以使用主插槽的 x509 证书和匹配的私钥通过 SSH 完成此操作,但这意味着我必须将证书的公钥放到我想要通过 SSH 连接的每台机器上。如果你问我,这很繁琐。
因此我想使用不同的公钥/私钥,特别是 RSA 密钥,这样我就可以在将来的某个时候,使用 RSA 证书对它们进行签名,以便 OpenSSH 信任 RSA 证书,从而避免信任每张智能卡的 x509 证书。但现在我只想使用智能卡上的 RSA 密钥对进行 SSH。
因此我开始按照典型步骤生成密钥并将其加载到智能卡上。
ssh-keygen -f gofish
ssh-keygen -f gofish.pub -e -m pem
ykman piv import-key 9c gofish
ykman piv generate-certificate 9c gofish.pem -s 'gofish543'
ssh-keygen -D [opensc-pkcs11.so] -e
- 将上述命令的输出放置到我的目标 CentOS 机器上。
ssh [email protected] -I [opensc-pkcs11.so]
一切似乎都正常,我转到 Windows 10 并使用 PuTTY 进行 SSH。这时一切都崩溃了。使用 PuTTY-CAC 进行智能卡 SSH 身份验证,它成功地将我的智能卡信息加载到 pageant 中,但当我转到 ssh 时,它失败并出现错误...
PuTTY 终端呈现以下内容...
Using username "gofish543".
Authenticating with public key "CAPI:5e084cb687f0c54adf8ddd733720db48407d3195" from agent
Server refused public-key signature despite accepting key!
[email protected]'s password:
sshd 错误日志显示以下内容...
debug1: matching key found: file /home/gofish543/.ssh/authorized_keys, line 1 RSA SHA256:Eor3aPxtNW6zrxLbq+1tB/urwql1CQB6EM8tFIx31+I^M
debug1: restore_uid: 0/0^M
debug3: mm_answer_keyallowed: key 0x55d310674760 is allowed^M
debug3: mm_request_send entering: type 23^M
debug3: mm_key_verify entering [preauth]^M
debug3: mm_request_send entering: type 24 [preauth]^M
debug3: mm_key_verify: waiting for MONITOR_ANS_KEYVERIFY [preauth]^M
debug3: mm_request_receive_expect entering: type 25 [preauth]^M
debug3: mm_request_receive entering [preauth]^M
debug3: mm_request_receive entering^M
debug3: monitor_read: checking request 24^M
key_verify: invalid argument^M
debug3: mm_answer_keyverify: key 0x55d310674710 signature unverified^M
debug3: mm_request_send entering: type 25^M
Failed publickey for gofish543 from 192.168.1.3 port 50051 ssh2: RSA SHA256:Eor3aPxtNW6zrxLbq+1tB/urwql1CQB6EM8tFIx31+I^M
公钥、私钥认证在 处失效key_verify: invalid argument
。搜索此问题未得到任何适用结果。我该如何解决此问题?
顺便提一下,如果我在错误日志中泄露了不该泄露的内容,比如私钥或私钥信息,请知悉,所有这些机器都位于与互联网隔离的笔记本电脑上的内部网络上。这些密钥将在一两周内被删除。
答案1
我看到您正在使用 Yubico 设备作为 PIV。但在 Windows 上,您使用的是 PUTTY-CAC 和 CAPI。这意味着 Windows 10 内置 PIV 代码很可能被用来访问 Yubico 作为 PIV 类型的卡。这应该可以工作,但看起来返回的签名没有经过验证。也可能是 Putty CAPI 代码没有正确构建 SSH 答案。
看着腻子-CAC目前尚不清楚代码是否支持SHA256。原始的Windows BSP不支持,仅支持CALG_SHA1。后来支持了CALG_SHA_256。微软 ALG_ID
Putty 确实具有可能有用的日志记录功能。WireShark 也可能有助于查看正在交换的 ssh 数据包。
您可能想要尝试使用 Putty-CAC PKCS#11 接口并使用 opensc-pkcs11 或 Yubico pkcs11 模块。
在 Windows 10 上使用 Putty-CAC(客户端协议版本 2.0;客户端软件版本 PuTTY_Release_0.70_4)对 OpenSSH(本地版本字符串 SSH-2.0-OpenSSH_7.7)进行测试后,使用带有 PIV 小程序的 Yubikey 4。我可以让它与 pkcs11(opensc-pkcs11.dl)一起工作,但不能与 CAPI 一起工作。我认为问题出在 Putty-CAC cert-capi.c 第 68 行:
if (CryptCreateHash((HCRYPTPROV)hCryptProv, CALG_SHA1, 0, 0, &hHash) != FALSE &&
我认为问题CALG_SHA1
应该是CALG_SHA_256
由于较新的 OpenSSH 不支持 sha1 签名,但支持 rsa-sha-256 或 rsa_sha-512。
我没有良好的环境设置来重建 Putty-CAC。
另一个不错的网站是https://piv.idmanagement.gov/engineering/ssh/
请参阅错误报告Putty-CAC/问题/30
经过进一步测试,发现删除 Yubico Minidriver 包后一切开始正常。不需要该驱动程序,因为 Windows 10 内置了 PIV 卡或带有 PIV 小程序的令牌驱动程序。Yubico Minidriver 无法处理导致显示 MessageBox 的某些问题,但 Putty-CAC 无法处理错误的返回代码,并且提前向 SSHD 发送了带有错误签名的虚假响应。