![ssh 主机密钥证书,远程查找有效期?](https://linux22.com/image/639487/ssh%20%E4%B8%BB%E6%9C%BA%E5%AF%86%E9%92%A5%E8%AF%81%E4%B9%A6%EF%BC%8C%E8%BF%9C%E7%A8%8B%E6%9F%A5%E6%89%BE%E6%9C%89%E6%95%88%E6%9C%9F%EF%BC%9F.png)
我有一个使用 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
答案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 使用的密钥是否是您刚刚检查证书有效期的密钥。