Reputation: 23
I'm using Renci.SSHNet to establish a connection to SFTP servers. I've done so without any problems but I've recently ran into a server to which I can´t establish a connection through my code.
I keep getting the following error:
No suitable authentication method found to complete authentication (publickey,keyboard-interactive).
The thing is, I know the host, user and password are correct as I can establish a connection using FileZilla. I've noticed while connecting to other servers using FileZilla that the fingerprints for the ones I can also connect to with my code are generated through RSA as opposed to the one that is giving me trouble, which is SHA2.
TL/DR: What I'm wondering is: is the Renci.SshNet.SFTP library compatible with sha-2 generated fingerprints or will I have to use another library for this?
Upvotes: 2
Views: 4587
Reputation: 1
With following changes:
public class RsaSha256DigitalSignature : CipherDigitalSignature, IDisposable
{
private HashAlgorithm _hash;
public RsaSha256DigitalSignature(RsaWithSha256SignatureKey rsaKey)
// custom OID
: base(new ObjectIdentifier(2, 16, 840, 1, 101, 3, 4, 2, 1), new RsaCipher(rsaKey))
{
// custom
_hash = SHA256.Create();
}
protected override byte[] Hash(byte[] input)
{
return _hash.ComputeHash(input);
}
private bool _isDisposed;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (_isDisposed)
return;
if (disposing)
{
var hash = _hash;
if (hash != null)
{
hash.Dispose();
_hash = null;
}
_isDisposed = true;
}
}
~RsaSha256DigitalSignature()
{
Dispose(false);
}
}
Upvotes: 0
Reputation: 83
I had a similar problem and finally managed to fix it. Below the solution:
1)Make sure following directives added to the solution
using Renci.SshNet;
using Renci.SshNet.Security;
using SshNet.Security.Cryptography;
2)Create the connectionInfo object and add necessary HostKeyAlgorithms in it.
var methods = new List<AuthenticationMethod>
{
new PasswordAuthenticationMethod("username", "password")
};
var connectionInfo = new ConnectionInfo("host", "username", methods.ToArray());
connectionInfo.HostKeyAlgorithms.Clear();
//ssh-ed25519
connectionInfo.HostKeyAlgorithms.Add("ssh-ed25519", (data) => { return new KeyHostAlgorithm("ssh-ed25519", new ED25519Key(), data); });
//ecdsa-sha2-nistp256
connectionInfo.HostKeyAlgorithms.Add("ecdsa-sha2-nistp256", (data) => { return new KeyHostAlgorithm("ecdsa-sha2-nistp256", new EcdsaKey(), data); });
//ecdsa-sha2-nistp384
connectionInfo.HostKeyAlgorithms.Add("ecdsa-sha2-nistp384", (data) => { return new KeyHostAlgorithm("ecdsa-sha2-nistp384", new EcdsaKey(), data); });
//ecdsa-sha2-nistp521
connectionInfo.HostKeyAlgorithms.Add("ecdsa-sha2-nistp521", (data) => { return new KeyHostAlgorithm("ecdsa-sha2-nistp521", new EcdsaKey(), data); });
//ssh-rsa
connectionInfo.HostKeyAlgorithms.Add("ssh-rsa", (data) => { return new KeyHostAlgorithm("ssh-rsa", new RsaKey(), data); });
//ssh-dss
connectionInfo.HostKeyAlgorithms.Add("ssh-dss", (data) => { return new KeyHostAlgorithm("ssh-dss", new DsaKey(), data); });
3)Connect to desired sftp host using connectionInfo
var sftp = new SftpClient(connectionInfo);
using (sftp)
{
try
{
sftp.Connect();
Console.WriteLine("Connected");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Upvotes: 1
Reputation: 202594
The SSH.NET library does not support ECDSA key exchange algorithms (ecdh-sha2-*) yet (as of 2014.4.6-beta2 release).
It supports these:
The ecdh-sha2-*'s are commented-out, probably because the implementation is not complete/tested.
Though note that the server can support multiple algorithms and can agree on a different algorithm with different clients.
So the fact that you see an unsupported key type in the FileZilla, does not mean that the server necessarily insists on this key type.
It is clear that the server does not require ECDSA key exchange from the fact that the connection fail in the authentication phase. The authentication happens only after a successful key exchange. So your root problem is not the key exchange, but authentication.
If you need a help resolving your authentication problem, start a new question, include relevant source code, FileZilla log file and explain us what you did to setup the authentication on the server-side. A server-side log file might be helpful too.
Upvotes: 0