fluxcd-flux2/internal/keyscan/keyscan.go
Hidde Beydals c5491b9da8 internal: add simple keyscanner
This is an initial implementation and not a replacement candidate
for ssh-keyscan since it does only scan the key of the algorithm
the client and server agreed upon. This agreement may change
depending on the key being used, making it useless for distributed
usages.
2020-05-04 09:08:00 +02:00

40 lines
828 B
Go

package keyscan
import (
"encoding/base64"
"fmt"
"net"
"golang.org/x/crypto/ssh"
"golang.org/x/crypto/ssh/knownhosts"
)
func ScanKeys(host string) ([]byte, error) {
col := &collector{}
config := &ssh.ClientConfig{
User: "git",
HostKeyCallback: col.StoreKey(),
}
client, err := ssh.Dial("tcp", host, config)
if err == nil {
defer client.Close()
}
if len(col.knownKeys) > 0 {
return col.knownKeys, nil
}
return col.knownKeys, err
}
type collector struct {
knownKeys []byte
}
func (c *collector) StoreKey() ssh.HostKeyCallback {
return func(hostname string, remote net.Addr, key ssh.PublicKey) error {
c.knownKeys = append(
c.knownKeys,
fmt.Sprintf("%s %s %s\n", knownhosts.Normalize(hostname), key.Type(), base64.StdEncoding.EncodeToString(key.Marshal()))...,
)
return nil
}
}