Isso é possível, mas falta suporte a ferramentas. Eu encontrei uma biblioteca que fala o protocolo SSH bem o suficiente para me deixar escrever uma ferramenta para extrair o certificado de host valid_before tempo sem um login ssh completo. Aqui está, na linguagem Go. Espero que ajude.
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()
}
}
(Instruções de uso rápido: instale Vá , salve o código visto acima em sshcertscan.go, execute go build sshcertscan.go
e aponte em um servidor ssh na porta 22 do examplehost com ./sshcertscan examplehost:22
.)