我需要在给定公共 RSA 密钥的情况下启动到远程主机的 ssh 连接。我到目前为止的代码如下
func sftpClient(host, port, user, pass string) (*sftp.Client, error) {
var authMethod ssh.AuthMethod
if strings.Index(pass, "-----BEGIN RSA PRIVATE KEY-----") == 0 {
signer, err := ssh.ParsePrivateKey([]byte(pass))
if err != nil {
return nil, err
}
authMethod = ssh.PublicKeys(signer)
} else if strings.Index(pass, "---- BEGIN SSH2 PUBLIC KEY ----") == 0 {
publicKey, err := ssh.ParsePublicKey([]byte(pass))
if err != nil {
return nil, err
}
authMethod = ???
} else {
authMethod = ssh.Password(pass)
}
config := &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{authMethod},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Config: ssh.Config{
Ciphers: []string{
// some ciphers here
},
},
}
conn, err := ssh.Dial("tcp", host+":"+port, config)
if err != nil {
return nil, err
}
client, err := sftp.NewClient(conn)
if err != nil {
return nil, err
}
return client, nil
}
基于密码的身份验证和基于私钥的身份验证工作得很好,因为 ssh 库提供了这些包装器(ssh.Password并且ssh.PublicKeys创建了某种包装器AuthMethod)。我没有尝试很多,因为我找不到很多选择:
authMethod = ssh.NewPublicKey(publicKey)
authMethod = publicKey
它们都不起作用。
我还尝试使用不同的方法解析公钥,但这也失败了。我使用的方法是ssh.ParseAuthorizedKey这个 - 类似于ss.ParsePublicKeyreturn aPublicKey显然不能用作身份验证方法。
所以我的问题是:如何使用给定的公共RSA 密钥在 Go 上启动 ssh 客户端?
繁星点点滴滴
相关分类