使用SSH.NET 2024.0.0连接Ubuntu OpenSSH服务器遇权限拒绝问题求助
问题描述
使用SSH.NET 2024.0.0版本,无法通过OpenSSH格式的用户私钥连接部署了OpenSSH服务器的Ubuntu机器,但在PowerShell中执行ssh -i user-key username@host可以正常连接,报错信息为:
Permission denied (publickey).
环境与信息
- SSH.NET版本:2024.0.0
- 服务器:Ubuntu(OpenSSH服务)
- 私钥格式:
-----BEGIN OPENSSH PRIVATE KEY----- ... -----END OPENSSH PRIVATE KEY-----
代码示例
byte[] content = Convert.FromBase64String(certFile); var privateKeyFile = new PrivateKeyFile(new MemoryStream(content), passphrase); PrivateKeyAuthenticationMethod privateKeyAuthentication = new PrivateKeyAuthenticationMethod(username, privateKeyFile); var keybAuth = new KeyboardInteractiveAuthenticationMethod(username); keybAuth.AuthenticationPrompt += delegate (object sender, AuthenticationPromptEventArgs e) { if ((e.Prompts.Count() != 1) || (e.Prompts.First().Request != "Verification code:")) { throw new InvalidOperationException("Unexpected auth prompt"); } e.Prompts.First().Response = "verification code"; }; var conn = new ConnectionInfo(host, port, username, privateKeyAuthentication, keybAuth) { Timeout = 5000, RetryAttempts = 2, MaxSessions = 20 }; using (var ssh = new SshClient(conn)) { ssh.Connect(); ... }
解决方案与排查方向
检查私钥加载完整性:
确认certFile是否包含完整的私钥文本(包括-----BEGIN OPENSSH PRIVATE KEY-----和-----END OPENSSH PRIVATE KEY-----行)。如果certFile仅为中间的Base64数据,需先拼接完整私钥内容再转换:string fullPrivateKey = $"-----BEGIN OPENSSH PRIVATE KEY-----\n{certFile}\n-----END OPENSSH PRIVATE KEY-----"; byte[] content = Encoding.UTF8.GetBytes(fullPrivateKey);直接对纯Base64字符串用
Convert.FromBase64String会导致私钥格式不完整,SSH.NET无法正确解析。验证Passphrase正确性:
如果私钥设置了密码,确保代码中传入的passphrase与实际密码一致。PowerShell会交互式提示输入密码,而代码中密码错误会直接导致认证失败。简化认证方式测试:
暂时移除KeyboardInteractiveAuthenticationMethod,仅使用PrivateKeyAuthenticationMethod建立连接,排除多认证方式的干扰,确认私钥认证本身是否正常:var conn = new ConnectionInfo(host, port, username, privateKeyAuthentication) { Timeout = 5000, RetryAttempts = 2, MaxSessions = 20 };启用SSH.NET调试日志:
添加日志监听,查看私钥加载和认证过程的详细错误信息:SshClient.Logging.LogLevel = LogLevel.Debug; SshClient.Logging.Log += (sender, e) => Console.WriteLine($"SSH Log: {e.Message}");查看服务器端sshd日志:
在Ubuntu服务器上执行以下命令,实时查看认证日志,获取失败的具体原因(如格式错误、密码错误等):sudo tail -f /var/log/auth.log
内容的提问来源于stack exchange,提问作者Cong Thanh Huynh

