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
相关产品推荐
相关产品推荐

