如何验证ssh证书是否由指定的ssh CA私钥签名?

如何验证ssh证书是否由指定的ssh CA私钥签名?

我正在尝试使用强化我的 ssh 设置这种材料。它工作正常,但我有一个问题正在努力寻找答案。

有谁知道是否有办法根据 SSH CA 检查 ssh 主机/用户证书签名?我知道我可以尝试 ssh 进入持有该主机证书的主机,如果它连接了,那么签名显然没问题......但我正在编写一个自动化任务,我需要一种编程方式来确保证书文件由 CA 签名。说出一些ssh-keygen命令或其他任何内容。

更新:

正如@PKapp 提议的那样:

我可以比较两个输出:服务器端证书签名 CA 的指纹和 CA 本身的指纹

sudo ssh-keygen -L -f /etc/ssh/ssh_host_ed25519_key-cert.pub | fgrep "Signing CA" | sed 's/^[ \t]*//' | cut -d ' ' -f 4
SHA256:LkdPQLdx4tuZp7pG0g6nAJqilFd6ZzjGdgVEV9elrdA

sudo ssh-keygen -l -f /etc/ssh/id_ed25519-HostCA.pub | cut -d ' ' -f 2
SHA256:LkdPQLdx4tuZp7pG0g6nAJqilFd6ZzjGdgVEV9elrdA

如果过滤后的输出相同,则证书匹配...

答案1

要远程获取 ssh 主机证书,您可以使用ssh-keyscan -c <hostname>(如果没有该-c选项,您将只能获取主机密钥)。要限制特定证书类型,如有必要,您可以包含-t type、使用ssh-rsanot 。[email protected]

然后,您可以使用 .zip 文件提取证书详细信息,包括签名 CA 的公钥ssh-keygen -L -f <certfile>。如果您使用(小写)-l,则ssh-keygen仅输出有关证书中嵌入的基础(公共)主机密钥的信息,而不是所有证书元素。

答案2

我还没有为我的内部 ssh 设置签名。但当我为 imap 做这件事时,我学会了一种简单的检查方法。

https://www.feistyduck.com/library/openssl-cookbook/online/ch-testing-with-openssl.html了解详情。

基本上,使用“openssl s_client ...”您可以获得很多有用的数据。

例如,我的未签名(CA 未签名)ssh(注意 - 未发送客户端 CA 名称,并与从我的 imaps 测试中获得的“自签名”报告进行比较)

openssl s_client -connect x072:22
CONNECTED(00000003)
804401144:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:825:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 305 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1526335517
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

然而,当连接到我的 imaps 服务时 - 我看到一个(深度:0 自签名)证书链。

root@x071:[/root]openssl s_client -connect x063:993
CONNECTED(00000003)
depth=0 C = NL, ST = N. Holland, L = Amsterdam, O = ROOTVG, OU = aixtools
verify error:num=18:self signed certificate
verify return:1
depth=0 C = NL, ST = N. Holland, L = Amsterdam, O = ROOTVG, OU = aixtools
verify error:num=26:unsupported certificate purpose
verify return:1
depth=0 C = NL, ST = N. Holland, L = Amsterdam, O = ROOTVG, OU = aixtools
verify return:1
---
Certificate chain
 0 s:/C=NL/ST=N. Holland/L=Amsterdam/O=ROOTVG/OU=aixtools
   i:/C=NL/ST=N. Holland/L=Amsterdam/O=ROOTVG/OU=aixtools
---
Server certificate
-----BEGIN CERTIFICATE-----
snip...

这些与使用 ssh-keygen 不同,我必须自己进行更多研究。但我认为我应该留在 openssl s_client 因为它的分歧。

相关内容