in internal/sshd/server_config.go [72:116]
func parseHostCerts(hostKeys []ssh.Signer, certFiles []string) map[string]*ssh.Certificate {
keyToCertMap := map[string]*ssh.Certificate{}
hostKeyIndex := make(map[string]int)
for index, hostKey := range hostKeys {
hostKeyIndex[string(hostKey.PublicKey().Marshal())] = index
}
for _, filename := range certFiles {
keyRaw, err := os.ReadFile(filepath.Clean(filename))
if err != nil {
log.WithError(err).WithFields(log.Fields{"filename": filename}).Error("failed to read host certificate")
continue
}
publicKey, _, _, _, err := ssh.ParseAuthorizedKey(keyRaw)
if err != nil {
log.WithError(err).WithFields(log.Fields{"filename": filename}).Error("failed to parse host certificate")
continue
}
cert, ok := publicKey.(*ssh.Certificate)
if !ok {
log.WithFields(log.Fields{"filename": filename}).Error("failed to decode host certificate")
continue
}
hostRawKey := string(cert.Key.Marshal())
index, found := hostKeyIndex[hostRawKey]
if found {
keyToCertMap[hostRawKey] = cert
certSigner, err := ssh.NewCertSigner(cert, hostKeys[index])
if err != nil {
log.WithError(err).WithFields(log.Fields{"filename": filename}).Error("the host certificate doesn't match the host private key")
continue
}
hostKeys[index] = certSigner
} else {
log.WithFields(log.Fields{"filename": filename}).Errorf("no matching private key for certificate %s", filename)
}
}
return keyToCertMap
}