问题
I am trying to connect to an FTPS server using C# via WinSCP and I am getting this error:
SSH host key fingerprint ... does not match pattern ...
After tons of research, I believe is has something to do with the length of the key. The key I got from WinSCP when connected using its interface under "Server and protocol information" is
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
but the ones I saw in the example is shorter like this xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Can someone please help and offer me any pointer to resolve this would be greatly appreciated.
Here is my code
string winscpPath = "C:\\Program Files (x86)\\WinSCP\\WinSCP.exe";
string username = "User123";
string password = "abc1234";
string ftpSite = "192.168.5.110";
string localPath = "C:\\Users\\ttom\\Documents";
string remoteFTPDirectory = "/Usr/thisfolder";
string sshKey = "1b:68:10:80:77:c6:65:91:51:31:5t:65:1c:g6:13:20:39:g8:d8:6d";
Boolean winSCPLog = true;
string winSCPLogPath = "C:\\Users\\ttom\\Documents\\Visual Studio 2015\\Projects\\WebApplication1\\WebApplication1";
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = ftpSite,
UserName = username,
Password = password,
SshHostKeyFingerprint = sshKey
};
using (Session session = new Session())
{
// WinSCP .NET assembly must be in GAC to be used with SSIS,
// set path to WinSCP.exe explicitly, if using non-default path.
session.ExecutablePath = winscpPath;
session.DisableVersionCheck = true;
if (winSCPLog)
{
session.SessionLogPath = @winSCPLogPath + @"ftplog.txt";
session.DebugLogPath = @winSCPLogPath + @"debuglog.txt";
}
// Connect
session.Timeout = new TimeSpan(0, 2, 0); // two minutes
session.Open(sessionOptions);
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;
session.GetFiles(remoteFTPDirectory + "/" +
"test.txt", localPath, false, transferOptions);
}
回答1:
You are connecting using SFTP (over SSH) in the code, but using FTPS (FTP over TLS/SSL) in GUI.
These are two completely different protocols.
Use Protocol = Protocol.Ftp and enable TLS/SSL using FtpSecure = FtpSecure.Explicit.
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
FtpSecure = FtpSecure.Explicit,
HostName = ftpSite,
UserName = username,
Password = password,
};
An equivalent of SshHostKeyFingerprint
for FTPS is TlsHostCertificateFingerprint. But you need to use it only when the TLS/SSL certificate is not signed by a trusted authority (e.g. a self signed certificate).
The easiest is to have WinSCP GUI generate code for you.
回答2:
I am working on a similar task. Have you tried prefixing 'ssh-rsa' to your fingerprint string?
Everything seems to be working on my end so that leads me to believe that there are two things that could be going on here.
You could be missing part of your authentication string:
string SshHostKeyFingerpring = "ssh-rsa XXXX 1b:68:10:80:77:c6:65:91:51:31:5t:65:1c:g6:13:20:39:g8:d8:6d";
and/or
You are using two protocols. SFTP and FTPS
回答3:
I also had the same error. In my case I discovered the PC that I copied the SSH Fingerprint key from was running a newer version of WinSCP than the one I had on my development PC.
Updating the WinSCP.exe and WinSCPnet.DLL files on my Dev PC fixed the issue for me.
来源:https://stackoverflow.com/questions/35050307/ssh-host-key-fingerprint-does-not-match-pattern-c-sharp-winscp