У меня есть среда, в которой я использую сертификаты ssh для аутентификации ключей хоста ssh. Я говорю о сертификатах, созданных при запуске ssh-keygen -s /path/to/ca -h ...
. Эти сертификаты также создаются с периодом действия, указывающим, когда они истечут. Эти сертификаты используются уже достаточно долго, и мне нужно начать их отслеживать, чтобы предупредить о приближении их истечения.
В любом случае я могу выполнить удаленное соединение, не входя в систему, и каким-то образом либо получить отображаемый интервал действия alt. скачать сертификат? Бег ssh -vvv
не отображаются для отображения нужной мне информации. Также не делает ssh-keyscan
похоже, знает сертификат. Может быть, какую-то библиотеку я недостаточно внимательно изучил?
В худшем случае я всегда могу написать плагин мониторинга, который запускается локально и анализирует вывод ssh-keygen -L -f
. Тем не менее, удаленное сканирование действительно кажется более предпочтительным подходом.
Это возможно, но без поддержки инструментов. Я нашел библиотеку, которая достаточно хорошо говорит по протоколу SSH, чтобы позволить мне написать инструмент для извлечения сертификата хоста valid_before без полного входа в систему ssh. Вот он, на языке го. Я надеюсь, что это помогает.
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
, затем направьте его на ssh-сервер на examplehost порт 22 с ./sshcertscan examplehost:22
.)
К сожалению, я не знаю ни одного инструмента с открытым исходным кодом. Кажется, что Nmap сможет каким-то образом получить его с помощью NSE скрипты (но требует некоторой настройки - проверьте / usr / share / nmap / scripts).
SSH Tectia SSH server включает инструмент ssh-fetchkey, который будет извлекать сертификат, а затем вы можете использовать ssh-certview для просмотра деталей.
Боюсь, ответ - «это невозможно». По крайней мере, я не нашел, используя либо клиент openssh, либо библиотеку paramiko SSH для python. Я бы предложил локальную проверку, как вы описали, в сочетании с более простой удаленной проверкой, которая подтверждает, что ключ, используемый SSHD, является ключом, срок действия сертификата которого вы только что проверили.