使用正确的私钥 (Golang) 连接到 SFTP 服务器失败(超时)

我正在尝试用 Golang 编写一个 sftp 客户端。服务器的所有者需要使用公钥/私钥进行连接。我已经向他们发送了一个公钥(4096 位)并获得了用户名。为了测试连接,我使用我的私钥使用 FileZilla - 它工作正常。但是我的 golang 客户端不工作:ssh.Dial 永远挂起或只是在 ClientConfig 超时时中止......有没有人知道它可能有什么问题(我的代码或周围)?我的代码如下:


keyFile := filepath.Join(dir, "id_rsa")

pkBytes, err := os.ReadFile(keyFile)

if err != nil {

    return err

}

signer, err := ssh.ParsePrivateKeyWithPassphrase(pkBytes, []byte("mysecret"))

if err != nil {

    return err

}


username := "my_username"

sftpDir := "/home/upload/"


keyFile = filepath.Join(dir, "id_rsa.pub")

pkBytes, err = os.ReadFile(keyFile)

if err != nil {

    return err

}


hostKey, _, _, _, err := ssh.ParseAuthorizedKey(pkBytes)

if err != nil {

    return err

}


clientConfig := &ssh.ClientConfig{

    User:            username,

    Auth:            []ssh.AuthMethod{ssh.PublicKeys(signer)},

    HostKeyCallback: ssh.FixedHostKey(hostKey),

    Timeout:         10 * time.Second,

}


conn, err := ssh.Dial("tcp", "sftp.trustyou.com:22", clientConfig)

// here we stop or hang forever.... :-(

if err != nil {

    log.Fatalf("SSH DIAL FAILED:%v", err)

}

defer conn.Close()


幕布斯6054654
浏览 356回答 2
2回答

守候你守候我

我终于可以回答我自己的问题了:代码没问题。该问题仅发生在我们位于防火墙后面的客户服务器上。因此,网络设置对此负责。为了确保我将 ClientConfig 设置更改为 ssh.InsecureIgnoreHostKey 并在我的办公室计算机上运行它。它连接成功。clientConfig := &ssh.ClientConfig{    User:            h.UserName,    Auth:            []ssh.AuthMethod{ssh.PublicKeys(t.signer)},    HostKeyCallback: ssh.InsecureIgnoreHostKey(), // ssh.FixedHostKey(hostKey),    Timeout:         15 * time.Second,}PS 我知道我的答案(和问题本身)现在看起来与这里的一些真正有创意的问题相比很愚蠢......对此感到抱歉。但有时它就是这样工作的......

梦里花落0921

package mainimport (    "github.com/alessiosavi/GoGPUtils/helper"    stringutils "github.com/alessiosavi/GoGPUtils/string"    "github.com/alessiosavi/GoSFTPtoS3"    "io/ioutil"    "log"    "strings")func main() {    log.SetFlags(log.LstdFlags | log.Lshortfile | log.Lmicroseconds)    var sftpConf = &GoSFTPtoS3.SFTPConf{        Host:     "localhost", // FIXME: Change host and user        User:     "alessiosavi",        Password: "",        Port:     22,        Bucket:   "bucket-ftp",        Timeout:  50,        PrivKey:  "",    }    // FIXME: Use your key    file, err := ioutil.ReadFile("/home/alessiosavi/.ssh/mykey.pem")    if err != nil {        panic(err)    }    sftpConf.PrivKey = string(file)    conn, err := sftpConf.NewConn()    defer conn.Close()    list, err := conn.List("/tmp")    if err != nil {        panic(err)    }    log.Println(helper.MarshalIndent(list))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go