Ssh
ssh主機密鑰證書,遠端查找有效期?
我有一個使用 ssh 證書來驗證 ssh 主機密鑰的環境。我說的是通過執行創建的證書類型
ssh-keygen -s /path/to/ca -h ...
。這些證書也創建了一個有效間隔,說明它們何時到期。這些證書現在已經使用了足夠長的時間,以至於我需要開始監視它們,以便在它們開始接近到期時提醒您。任何方式我都可以在不登錄的情況下進行遠端連接,並且以某種方式獲得顯示的有效間隔。下載證書?執行
ssh -vvv
似乎沒有顯示我需要的資訊。兩者似乎都沒有ssh-keyscan
證書意識。也許是我沒有仔細研究過的一些圖書館?最壞的情況是我總是可以編寫一個在本地執行並解析
ssh-keygen -L -f
. 儘管如此,遠端掃描確實感覺是更可取的方法。
這是可能的,但它缺乏工具支持。我找到了一個庫,它可以很好地使用 SSH 協議,讓我可以編寫一個工具來提取主機證書 valid_before 時間,而無需完整的 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() } }
(快速使用說明:安裝Go,將上面看到的程式碼保存在 sshcertscan.go 中,執行
go build sshcertscan.go
,然後將其指向 examplehost 埠 22 上的 ssh 伺服器./sshcertscan examplehost:22
。)