ssh 主机密钥证书,远程查找有效期?

ssh 主机密钥证书,远程查找有效期?

我有一个使用 ssh 证书来验证 ssh 主机密钥的环境。我说的是通过运行创建的证书类型ssh-keygen -s /path/to/ca -h ...。这些证书还创建了有效期,说明它们何时会过期。这些证书现在已经使用了很长时间,我需要开始监视它们,以便在它们即将过期时得到提醒。

有什么方法可以进行远程连接而无需登录,并以某种方式显示有效期间隔或下载证书?运行ssh -vvv似乎没有显示我需要的信息。两者ssh-keyscan似乎都不支持证书。也许是我还没有仔细查看的某个库?

最糟糕的情况是,我总是可以编写一个在本地运行并解析输出的监控插件ssh-keygen -L -f。不过,远程扫描确实感觉是更好的方法。

答案1

-c(编辑:OpenSSH 7.2 以命令的新标志的形式引入了工具支持ssh-keyscan。这个答案的其余部分是在该版本发布之前一年多写的,但我将其保留在这里,因为我对此感到自豪。)

这是可行的,但缺乏工具支持。我找到了一个能够很好地处理 SSH 协议的库,让我可以编写一个工具来提取主机证书有效期前的时间,而无需完整的 ssh 登录。这是用 Go 语言编写的。希望对您有所帮助。

package main

import "golang.org/x/crypto/ssh"
import "fmt"
import "os"
import "time"

func ignoreCertChain(auth ssh.PublicKey, address string) bool {
    return true // Pretend all certificates are trusted.
}

var sawACert bool

func examineCert(cert *ssh.Certificate) bool {
  expires := cert.ValidBefore
  var humanReadable string
  if expires >= ssh.CertTimeInfinity {
    humanReadable = "infinity"
  } else if expires < (1 << 63) {
    humanReadable = time.Unix(int64(expires), 0).Format(time.RFC3339)
  } else {
    humanReadable = "the distant future"
  }
  fmt.Println("Cert expires at time", expires, "(" + humanReadable + ")")
  sawACert = true
  return true  // Reject the cert, to force early connection close.
}

func main() {
  serverHostPort := os.Args[1]
  checker := &ssh.CertChecker{
    IsHostAuthority: ignoreCertChain,
    IsRevoked: examineCert,
  }
  config := &ssh.ClientConfig{
    User: "test-sshcertscan-not-a-real-login-attempt",
    Auth: []ssh.AuthMethod{
      ssh.Password(""),
    },
    HostKeyCallback: checker.CheckHostKey,
  }
  sawACert = false
  client, err := ssh.Dial("tcp", serverHostPort, config);
  if err != nil && !sawACert {
    panic(fmt.Sprint("Cannot connect to ", serverHostPort, ", error: ",
                     err.Error()))
  } else if client != nil {
    defer client.Close()
  }
}

(快速使用说明:安装,将上面看到的代码保存在 sshcertscan.go 中,运行go build sshcertscan.go,然后使用 将其指向 examplehost 端口 22 上的 ssh 服务器./sshcertscan examplehost:22。)

答案2

不幸的是我不知道有任何开源工具。似乎 nmap 能够以某种方式检索它国家证券交易所脚本(但需要一些调整——检查 /usr/share/nmap/scripts)。

SSH松脂树服务器包含一个名为 ssh-fetchkey 的工具,它将检索证书,然后您可以使用 ssh-certview 查看详细信息。

答案3

以下命令将获取证书并显示有关它的信息:

ssh-keyscan -c <host> | ssh-keygen -L  -f -

示例输出:

        Type: [email protected] host certificate
        Public key: ED25519-CERT SHA256:XXX<redacted>
        Signing CA: ED25519 SHA256:XXX<redacted>
        Key ID: "my_server"
        Serial: 0
        Valid: from 2022-12-05T15:42:00 to 2023-12-04T15:43:35
        Principals: 
                my_server.example.com
                my_server
                www.example.com
        Critical Options: (none)
        Extensions: (none)

答案4

恐怕答案是“那是不可能的”。至少我发现使用 openssh 客户端或 python 的 paramiko SSH 库都不可能。我建议进行如您所述进行的本地检查,并结合更简单的远程检查,以验证 SSHD 使用的密钥是否是您刚刚检查证书有效期的密钥。

相关内容