【问题标题】:Connection fails (timeout) to SFTP server with correct private key (Golang)使用正确的私钥(Golang)连接到 SFTP 服务器失败(超时)
【发布时间】:2022-10-17 21:29:02
【问题描述】:

我正在尝试用 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()

【问题讨论】:

    标签: go sftp


    【解决方案1】:

    我终于可以回答我自己的问题了:代码没问题。该问题仅发生在我们客户位于防火墙后面的服务器上。因此,网络设置对此负责。 为了确保我将 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,
    }
    

    附言我知道与这里的一些真正有创意的问题相比,我的答案(以及问题本身)现在看起来很愚蠢......对此感到抱歉。但这就是它有时的工作方式......

    【讨论】:

      【解决方案2】:
      package main
      
      import (
          "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))
      
      }
      

      【讨论】:

        猜你喜欢
        • 2019-05-20
        • 2019-10-24
        • 2015-03-31
        • 2021-10-18
        • 2017-12-29
        • 1970-01-01
        • 1970-01-01
        • 2016-03-09
        • 2020-10-28
        相关资源
        最近更新 更多