SSH 主机密钥指纹与模式 C# WinSCP 不匹配

use*_*095 7 c# ftp ftps winscp winscp-net

我正在尝试通过 WinSCP 使用 C# 连接到 FTPS 服务器,但出现此错误:

SSH 主机密钥指纹...与模式不匹配...

经过大量研究,我认为这与密钥的长度有关。在“服务器和协议信息”下使用其接口连接时,我从 WinSCP 获得的密钥是xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx 但我在示例中看到的密钥 更短,如下所示xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

有人可以帮助我并为我提供解决此问题的任何指示,将不胜感激。

这是我的代码

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);
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Dan*_*elZ 7

如果您有 WinSCP 客户端,并且能够连接到 FTP 站点。WinSCP 有一个很好的“代码生成”功能。

  1. 先连接
  2. 选择会话 > 生成会话 URL/代码

在此输入图像描述


小智 5

我也面临着同样的问题。但在尝试了一些不同的模式之后,以下模式对我有用:

  1. 添加 ssh-rsa 作为第一部分
  2. 添加 2048(以位为单位的密钥长度)作为第二部分
  3. 删除 SHA256:如果您获得的密钥中有该值
  4. 仅保留密钥部分,不要将它们分开在 2 个集合中,保留从命令 ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub 获取的密钥原样

示例:ssh-rsa 2048 N48XXXXH2x9W1ZIFXXXXXXXXX6p3UqI6kGA8BbO1XXX


Mar*_*ryl 4

您在代码中使用 SFTP(通过 SSH)进行连接,但在 GUI 中使用 FTPS(通过 TLS/SSL 的 FTP)进行连接。

这是两个完全不同的协议。

使用Protocol = Protocol.Ftp并启用 TLS/SSL FtpSecure = FtpSecure.Explicit。

SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    FtpSecure = FtpSecure.Explicit,
    HostName = ftpSite,
    UserName = username,
    Password = password,
};
Run Code Online (Sandbox Code Playgroud)

SshHostKeyFingerprintFTPS 的等效项是TlsHostCertificateFingerprint。但仅当 TLS/SSL 证书未由受信任的机构签名(例如自签名证书)时才需要使用它。


最简单的方法是让WinSCP GUI为您生成代码。