Ssh

ssh主機密鑰證書,遠端查找有效期?

  • March 28, 2018

我有一個使用 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。)

引用自:https://serverfault.com/questions/619979