2017-08-01 208 views
1

我试图连接到远程主机,并检查文件是否存在 在这个阶段,我想只是连接,但我得到了一个错误:SSH握手抱怨缺少主机密钥

2017/08/01 18:16:39 unable to connect: ssh: handshake failed: ssh: required host key was nil 

我试图找出他人是否有我的问题,但我无法找到。

我明白,我需要以某种方式检查knowns_hosts的过程,但我只是无法弄清楚如何...

var hostKey ssh.PublicKey 
    // A public key may be used to authenticate against the remote 
    // server by using an unencrypted PEM-encoded private key file. 
    // 
    // If you have an encrypted private key, the crypto/x509 package 
    // can be used to decrypt it. 
    key, err := ioutil.ReadFile("/home/user/.ssh/id_rsa") 
    if err != nil { 
     log.Fatalf("unable to read private key: %v", err) 
    } 

    // Create the Signer for this private key. 
    signer, err := ssh.ParsePrivateKey(key) 
    if err != nil { 
     log.Fatalf("unable to parse private key: %v", err) 
    } 

    config := &ssh.ClientConfig{ 
     User: "user", 
     Auth: []ssh.AuthMethod{ 
      // Use the PublicKeys method for remote authentication. 
      ssh.PublicKeys(signer), 
     }, 
     HostKeyCallback: ssh.FixedHostKey(hostKey), 
    } 

    // Connect to the remote server and perform the SSH handshake. 
    client, err := ssh.Dial("tcp", "host.com:22", config) 
    if err != nil { 
     log.Fatalf("unable to connect: %v", err) 
    } 
    defer client.Close() 
} 
+1

你hostKey是 ssh.FixedHostKey(hostKey) 我觉得空 hostKey = signer.PublicKey()也许可以帮助。 – bayrinat

+0

@BayRinat有一个进展,现在我得到一个不匹配“2017/08/01 19:15:47无法连接:ssh:handshake failed:ssh:host key mismatch”,而我100%确定我的密钥是正确,因为我能够通过终端 –

回答

3

这里你正在寻找:

func getHostKey(host string) (ssh.PublicKey, error) { 
    file, err := os.Open(filepath.Join(os.Getenv("HOME"), ".ssh", "known_hosts")) 
    if err != nil { 
     return nil, err 
    } 
    defer file.Close() 

    scanner := bufio.NewScanner(file) 
    var hostKey ssh.PublicKey 
    for scanner.Scan() { 
     fields := strings.Split(scanner.Text(), " ") 
     if len(fields) != 3 { 
      continue 
     } 
     if strings.Contains(fields[0], host) { 
      var err error 
      hostKey, _, _, _, err = ssh.ParseAuthorizedKey(scanner.Bytes()) 
      if err != nil { 
       return nil, errors.New(fmt.Sprintf("error parsing %q: %v", fields[2], err)) 
      } 
      break 
     } 
    } 

    if hostKey == nil { 
     return nil, errors.New(fmt.Sprintf("no hostkey for %s", host)) 
    } 
    return hostKey, nil 
} 

然后将您的hostKey定义行替换为

hostKey, err := getHostKey("host.com") 
if err != nil { 
    log.Fatal(err) 
} 

有关该主题的更多信息:

+0

SSH相同的密钥谢谢,现在它抛出一个错误,我的主机名没有主机密钥 –

+0

我已经删除了known_hosts文件,并在我的终端上运行一个SSH到服务器和确认指纹 - 所以它是目前我知道主机中唯一的服务器,它仍然抱怨... –

+0

我很新的编码和去调试可以解释不同:)我所做的是读取文件和(我只是为了确保它包含指纹[而且它确实]),我在scanner中添加了几个fmt.Println。扫描()打印出字段和len的字段,并发现字段包含fingerp RINT和它的len为3 –