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

使用SSH.NET 2024.0.0连接Ubuntu OpenSSH服务器遇权限拒绝问题求助

SSH.NET 2024.0.0 OpenSSH私钥连接Ubuntu服务器失败(Permission denied (publickey))

问题描述

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:15:12