You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言通过SSH隧道下载文件遇认证失败问题求助

SSH隧道公钥认证失败问题排查与解决

问题场景

在Windows10系统中,使用Go语言通过sshtunnel库建立SSH隧道并下载文件时,出现公钥认证失败错误,相关代码及报错信息如下:

运行代码

package main

import (
    "fmt"
    "io"
    "io/ioutil"
    "net"
    "os"
    "strconv"

    "github.com/sgreben/sshtunnel"
    "golang.org/x/crypto/ssh"
)

func main() {
    keyPath := "sshtest2_private.pem"
    authConfig := sshtunnel.ConfigAuth{
        Keys: []sshtunnel.KeySource{{Path: &keyPath}},
    }
    sshAuthMethods, _ := authConfig.Methods()
    clientConfig := ssh.ClientConfig{
        User:            "some_user",
        Auth:            sshAuthMethods,
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }
    tunnelConfig := sshtunnel.Config{
        SSHAddr:   "xx.xxx.xxx.xx:22",
        SSHClient: &clientConfig,
    }
    conn, _, err := sshtunnel.Dial("tcp", "zzz.zzz.zzz.zzz:22", &tunnelConfig)
    if err != nil {
        panic(err)
    }
    fmt.Fprintln(conn, "GET /")
    io.Copy(os.Stdout, conn)
}

报错信息

panic: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

使用的私钥文件sshtest2_private.pem格式为:

-----BEGIN RSA PRIVATE KEY-----

the content of my key

-----END RSA PRIVATE KEY-----

排查与解决步骤

1. 验证私钥有效性与服务器配置

  • 手动测试密钥登录:用Windows自带SSH客户端测试能否登录目标服务器,执行命令:
    ssh -i sshtest2_private.pem some_user@xx.xxx.xxx.xx
    
    如果命令行也登录失败,说明问题出在密钥或服务器配置:
    • 确认服务器端~/.ssh/authorized_keys文件中已添加对应公钥,公钥需以ssh-rsa开头,格式无多余换行或字符。
    • 检查服务器sshd_config配置:确保PubkeyAuthentication yes已开启,AuthorizedKeysFile路径指向正确(默认是~/.ssh/authorized_keys)。
    • 修正服务器权限:将~/.ssh目录权限设为700,authorized_keys文件权限设为600,否则sshd会拒绝使用该密钥。

2. 修复代码中的潜在问题

  • 添加密钥加载错误处理:代码中忽略了authConfig.Methods()的返回错误,这会导致无法排查密钥加载失败的原因,修改如下:
    sshAuthMethods, err := authConfig.Methods()
    if err != nil {
        panic(fmt.Sprintf("加载认证方法失败: %v", err))
    }
    
  • 确认密钥路径正确性:若编译后程序运行路径与main.go目录不同,需使用绝对路径指定密钥文件,例如:
    keyPath := "C:/Users/YourName/Projects/ssh-test/sshtest2_private.pem"
    
  • 调整Windows文件权限:右键私钥文件→属性→安全,删除所有非当前用户的权限,仅保留当前用户的读取权限,避免因权限过宽被SSH库拒绝。

3. 确认目标地址配置

代码中sshtunnel.Dial的第二个参数是隧道转发的目标地址,若你是要下载文件,这里应该填写目标服务的端口(如HTTP服务的80或443),而非22端口,避免连接到无关服务。

内容的提问来源于stack exchange,提问作者DevMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:55:22