我正在实现一个SSH客户端,它将使用代理身份验证(如果可用)并在失败时回退到公共密钥身份验证。我发现我可以使用多个签名者来做到这一点,如下所示:
sshConfig := &ssh.ClientConfig{
User: getUsername(username, currentUser),
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Auth: []ssh.AuthMethod{
ssh.PublicKeysCallback(getSigners),
},
}
func getSigners() ([]ssh.Signer, error) {
signers := make([]ssh.Signer, 0)
currentUser, _ := user.Current()
if os.Getenv("SSH_AUTH_SOCK") != "" {
sshAgent, err := net.Dial("unix", os.Getenv("SSH_AUTH_SOCK"))
if err == nil {
agentSigners, _ := agent.NewClient(sshAgent).Signers()
signers = append(signers, agentSigners...)
}
}
// default to id_rsa
keyPath := path.Join(path.Join(currentUser.HomeDir, ".ssh/id_rsa"))
buffer, errI := ioutil.ReadFile(keyPath)
if errI != nil {
fmt.Println(errI)
return signers, errI
}
block, _ := pem.Decode(buffer)
var key ssh.Signer
if strings.Contains(block.Headers["Proc-Type"], "ENCRYPTED") {
fmt.Print("SSH Passphrase: ")
bytePassword, _ := terminal.ReadPassword(int(syscall.Stdin))
key, _ = ssh.ParsePrivateKeyWithPassphrase(buffer, bytePassword)
} else {
key, _ = ssh.ParsePrivateKey(buffer)
}
signers = append(signers, key)
return signers, nil
}
此方法的问题在于,它将始终提示输入密码短语,因为密码短语提示发生在进行任何身份验证尝试之前。可以延迟公钥解密的时间,以便在要求用户输入密码之前尝试进行代理身份验证吗?