8

尝试仅使用当前的 SSH.NET 库通过用户名和私钥进行身份验证。我无法从用户那里获取密码,所以这是不可能的。

这就是我现在正在做的事情。

Renci.SshNet.ConnectionInfo conn = 
    new ConnectionInfo(hostName, port, username, new AuthenticationMethod[]
        {
            new PasswordAuthenticationMethod(username, ""), 
            new PrivateKeyAuthenticationMethod(username, new PrivateKeyFile[] 
                   { new PrivateKeyFile(privateKeyLocation, "") }),
        });

using (var sshClient = new SshClient(conn))
{
    sshClient.Connect();
} 

现在,如果我PasswordAuthenticationMethodAuthenticationMethod[]数组中删除 ,我会得到一个异常,因为找不到合适的身份验证方法。如果我尝试这样传递(主机名、端口、用户名、密钥文件 2)

var keyFile = new PrivateKeyFile(privateKeyLocation);
var keyFile2 = new[] {keyFile};

再次,没有找到合适的方法。

似乎我必须使用ConnectionInfo上面概述的对象,但似乎它评估PasswordAuthenticationMethod并且无法登录(因为我没有提供密码)并且从不评估PrivateKeyAuthMethod......是这样吗?是否有其他方法可以使用 SSH.NET lib 仅使用用户名或主机名和私钥进行身份验证?

4

3 回答 3

13

您的问题是您仍在使用密码,即使它是空白的。删除这一行:

new PasswordAuthenticationMethod(username, ""), 

这对我来说非常有效:

var pk = new PrivateKeyFile(yourkey);
var keyFiles = new[] { pk };

var methods = new List<AuthenticationMethod>();
methods.Add(new PrivateKeyAuthenticationMethod(UserName, keyFiles));

var con = new ConnectionInfo(HostName, Port, UserName, methods.ToArray());
于 2017-01-08T17:00:05.383 回答
0

你需要这样的东西,它对我来说很好用。在创建新的 ConnectionInfo 对象时要注意,我只传递了主机、端口、用户和身份验证方法(不需要密码);第二个区别是我传递了单个 PrivateKeyFile,'Phrase' 参数没有空引号;

public ConnectionInfo GetCertificateBasedConnection()
    {
        ConnectionInfo connection;
        Debug.WriteLine("Trying to create certification based connection...");
        using (var stream = new FileStream(ConfigurationHelper.PrivateKeyFilePath, FileMode.Open, FileAccess.Read))
        {
            var file = new PrivateKeyFile(stream);
            var authMethod = new PrivateKeyAuthenticationMethod(ConfigurationHelper.User, file);

            connection = new ConnectionInfo(ConfigurationHelper.HostName, ConfigurationHelper.Port, ConfigurationHelper.User, authMethod);
        }
        Debug.WriteLine("Certification based connection created successfully");
        return connection;
    }
于 2017-05-30T07:28:12.523 回答
-5

要执行私钥身份验证,您还需要密码,它与私钥一起允许身份验证。
RenciSSH真正需要的是与时俱进,编写一个publickeyauthentication方法。

于 2016-12-05T12:27:16.710 回答