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

