SSH.NET 仅通过私钥进行身份验证(public 密钥身份验证)
SSH.NET Authenticate via private key only (public key authentication)
正在尝试仅使用当前 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();
}
现在,如果我从 AuthenticationMethod[]
数组中删除 PasswordAuthenticationMethod
,我会收到一个异常,因为没有找到合适的身份验证方法。如果我尝试传入(主机名、端口、用户名、密钥文件 2)
var keyFile = new PrivateKeyFile(privateKeyLocation);
var keyFile2 = new[] {keyFile};
同样,没有找到合适的方法。
看来我必须使用上面概述的 ConnectionInfo
对象,但它似乎评估 PasswordAuthenticationMethod
并且无法登录(因为我没有提供密码)并且从不评估 PrivateKeyAuthMethod
... 是这样吗?有没有其他方法可以使用 SSH.NET lib 仅使用用户名或主机名和私钥进行身份验证?
要执行私钥身份验证,您还需要密码,它与私钥一起允许身份验证。
真正需要的是让RenciSSH与时俱进,写一个publickey认证方法。
您的问题是您仍在使用密码,即使它是空白的。删除此行:
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());
你需要这样的东西,它对我来说很好用。
在创建新的 ConnectionInfo 对象时要注意,我只传递主机、端口、用户和 auth 方法(不需要密码);
第二个区别是我传递的是单个 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;
}
正在尝试仅使用当前 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();
}
现在,如果我从 AuthenticationMethod[]
数组中删除 PasswordAuthenticationMethod
,我会收到一个异常,因为没有找到合适的身份验证方法。如果我尝试传入(主机名、端口、用户名、密钥文件 2)
var keyFile = new PrivateKeyFile(privateKeyLocation);
var keyFile2 = new[] {keyFile};
同样,没有找到合适的方法。
看来我必须使用上面概述的 ConnectionInfo
对象,但它似乎评估 PasswordAuthenticationMethod
并且无法登录(因为我没有提供密码)并且从不评估 PrivateKeyAuthMethod
... 是这样吗?有没有其他方法可以使用 SSH.NET lib 仅使用用户名或主机名和私钥进行身份验证?
要执行私钥身份验证,您还需要密码,它与私钥一起允许身份验证。
真正需要的是让RenciSSH与时俱进,写一个publickey认证方法。
您的问题是您仍在使用密码,即使它是空白的。删除此行:
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());
你需要这样的东西,它对我来说很好用。 在创建新的 ConnectionInfo 对象时要注意,我只传递主机、端口、用户和 auth 方法(不需要密码); 第二个区别是我传递的是单个 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;
}