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

gliderlabs/ssh多公钥认证问题:仅识别首个公钥如何解决?

解决gliderlabs/ssh多公钥认证仅识别首个公钥的问题

你的问题出在ssh.ParseAuthorizedKey方法的使用上——这个函数只会解析输入内容中的第一行有效公钥,所以authorized_keys文件里后续的公钥都被直接忽略了。

要实现多公钥认证,需要逐行解析authorized_keys文件的内容,逐一对比每一个合法公钥:

func ExamplePublicKeyAuth() {
    ssh.ListenAndServe(":2222", nil,
        ssh.PublicKeyAuth(func(ctx ssh.Context, key ssh.PublicKey) bool {
            authKeyPath := path.Join(os.Getenv("HOME"), ".ssh/authorized_keys")
            data, err := os.ReadFile(authKeyPath) // 推荐用os.ReadFile替代已废弃的ioutil.ReadFile
            if err != nil {
                return false
            }

            // 按行分割文件内容
            lines := strings.Split(string(data), "\n")
            for _, line := range lines {
                line = strings.TrimSpace(line)
                // 跳过空行和注释行
                if line == "" || strings.HasPrefix(line, "#") {
                    continue
                }

                // 解析当前行的公钥
                allowedKey, _, _, _, err := ssh.ParseAuthorizedKey([]byte(line))
                if err != nil {
                    continue // 跳过解析失败的无效行
                }

                // 对比当前密钥,匹配则返回认证通过
                if ssh.KeysEqual(key, allowedKey) {
                    return true
                }
            }

            // 所有公钥都不匹配,返回认证失败
            return false
        }),
    )
}

关键改动说明:

  • 用os.ReadFile替代了已废弃的ioutil.ReadFile(Go 1.16+版本推荐)
  • 将文件内容按行分割,逐行处理每一条公钥记录
  • 跳过空行和以#开头的注释行,避免无效解析操作
  • 对每一行合法公钥进行解析和匹配,只要有一个匹配就立即返回true完成认证
  • 解析失败的行会被跳过,不影响其他有效公钥的认证逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:25:24