如何使用 C# 和 .NET 将 SFTP 连接与密钥文件一起使用

How to use SFTP connection with key file using C# and .NET

我有一个 C# .NET 项目,我正在尝试打开到服务器的 SFTP 连接并将文件放到服务器上。

我有 SFTP 主机名用户名密钥文件(.pem 文件)。
我这里没有密码

请帮助我在 C# 和 .Net 中使用 SFTP。

可能每个 SFTP/SSH 库都支持 public 密钥验证。

例如:

  • SSH.NET (NuGet package):

    var privateKey = new PrivateKeyFile(@"C:\some\path\key.pem");
    var client = new SftpClient("example.com", "username", new[] { privateKey });
    client.Connect();
    

    如果私钥加密:

    var privateKey = new PrivateKeyFile(@"C:\some\path\key.pem", "passphrase");
    
  • WinSCP .NET assembly (NuGet package):

    SessionOptions sessionOptions = new SessionOptions
    {
        Protocol = Protocol.Sftp,
        HostName = "example.com",
        UserName = "username",
        SshHostKeyFingerprint = "ssh-rsa 2048 ...=",
        SshPrivateKeyPath = @"C:\some\path\key.ppk",
    };
    
    using (Session session = new Session())
    {
        session.Open(sessionOptions);
    
        // Your code
    }
    

    WinSCP 需要将密钥转换为 PPK 格式(您可以为此使用 WinSCP GUI,或 PuTTYgen)。另请注意,WinSCP 会验证 SSH 主机密钥 (SshHostKeyFingerprint)。 SSH.NET 默认情况下无法做到这一点,这是一个安全漏洞。

    如果私钥是加密的,加PrivateKeyPassphrase or SecurePrivateKeyPassphrase.

    WinSCP GUI 可以generate a code template for you

    (我是图书馆的作者)

我 运行 遇到了同样的问题。 Martin 提供的代码当然对我有帮助,但是它缺少一些满足我需要的设置。

我需要添加一个端口号和一个密码短语来完全自动化我的解决方案。所以代码最终像:

        SessionOptions sessionOptions = new SessionOptions
            {
                Protocol = Protocol.Sftp,
                PortNumber = port,
                HostName = host,
                UserName = username,
                PrivateKeyPassphrase = passphrase,
                SshHostKeyFingerprint = fingerprint,
                SshPrivateKeyPath = privatekeyfile
            };