如何使用 C# 和 .NET 使用带有密钥文件的 SFTP 连接

问题描述 投票:0回答:3

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

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

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

c# .net sftp ssh-keys pem
3个回答
37
投票

可能每个 SFTP/SSH 库都支持公钥身份验证。

例如:

  • SSH.NETNuGet 包):

    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 程序集NuGet 包):

    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
    SecurePrivateKeyPassphrase

    WinSCP GUI 可以为您生成代码模板

    (我是该库的作者)


2
投票

我遇到了同样的问题。马丁提供的代码确实对我有帮助,但是它缺少一些满足我需求的设置。

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

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

0
投票

SSH.Net

       using (SftpClient client = new SftpClient(new PasswordConnectionInfo("URL", "Username", "Password")))
        {
            client.Connect();

            string Serverfile = "";
            string Localfile = "";

            using (Stream stream = File.OpenWrite(Localfile))
            {
                client.DownloadFile(Serverfile, stream);
            }

            client.Disconnect();
        }
© www.soinside.com 2019 - 2024. All rights reserved.