结合使用加密/ ssh和代理身份验证,同时又退回到加密密钥身份验证

时间:2019-01-08 22:17:12

标签: go ssh cryptography

我正在实现一个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
}

此方法的问题在于,它将始终提示输入密码短语,因为密码短语提示发生在进行任何身份验证尝试之前。可以延迟公钥解密的时间,以便在要求用户输入密码之前尝试进行代理身份验证吗?

0 个答案:

没有答案