【问题标题】:How to Connect to SFTP server using .key file in c#.net如何在 c#.net 中使用 .key 文件连接到 SFTP 服务器
【发布时间】:2022-02-24 15:03:22
【问题描述】:

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

我有 SFTP 主机名、用户名和密钥文件(.key 文件)。 我这里有密码。

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

我尝试按照下面提到的方式进行操作:-

using (SSHClient sshClient = new SSHClient(getKeyConnection(HostName, UserName, Port, Myprivatekey.key,PassPhrase)))
            {
                Console.WriteLine("Connecting to server.");
                sshClient.OperationTimeout = TimeSpan.FromSeconds(60);
                sshClient.Connect();
                Console.WriteLine("Is Connected to server " + sshClient.IsConnected);

            }

我的 GetkeyConnection 方法如下所示:

public static ConnectionInfo getKeyConnection(string host, string username, int port, string privateKeyFile,string password)
        {
            Console.WriteLine("Getting key Connection Info to establish Private Key SFTP");
            return new ConnectionInfo(host, port, username, privateKeyObject(username, privateKeyFile,password));
        }

我的 privateKeyObject 使用

private static AuthenticationMethod[] privateKeyObject(string username, string publicKeyPath,string password)
        {
            Console.WriteLine("Private key object method called.");
            PrivateKeyFile privateKeyFile = new PrivateKeyFile(publicKeyPath,password);      
            PrivateKeyAuthenticationMethod privateKeyAuthenticationMethod = new PrivateKeyAuthenticationMethod(username, privateKeyFile);
            return new AuthenticationMethod[] { privateKeyAuthenticationMethod };
        }

当我尝试连接时,我得到了无效的私钥文件。 知道我们如何做到这一点。

我们有 X.509 证书,该证书使用中间 CA 签名并安装在我们的 SFTP 服务器上。我们有一个私钥文件和一个密码,我在我的身份验证方法中发送。对于 SFTP,我们使用 Renci nuget 包

【问题讨论】:

  • SFTP 是 HTTPS 的子集。两者都使用 TLS 进行身份验证,这是在请求从客户端发送到服务器之前完成的。 TLS 服务器发送一个可能名称为证书的证书块,然后客户端检查存储以查看是否有任何证书与从服务器发送的证书列表匹配。密钥文件是证书。因此,您需要做的就是将证书加载到客户端的商店中。我假设服务器已经在证书块中有证书。
  • SSH 是与 SFTP 不同的协议,您不应同时使用这两种协议。 SSH 用于进行安全的 shell 连接,而 SFTP 用于进行安全的文件传输。除了证书之外,SSH 和 SFTP 都需要用户名和密码。

标签: c# service window key x509certificate


【解决方案1】:

Renci 要求私钥是 openssl 格式。该异常通常是无效密钥文件格式或丢失文件的结果。您可以使用 putty gen、openssl 工具或 Java keytool 实用程序将密钥转换为正确的格式。

注意: "Renci.SshNet.Common.SshException: Invalid private key file" when loading SSH private key from configuration string using SSH.NET

【讨论】:

  • 我之前尝试使用 PuttyGen、Winscp 执行相同的操作,以将文件转换为 Openssl 格式,但一旦我加载私钥文件,它就会提示格式不支持。
  • 我通过将证书导出到 PFX 来使用包含私钥的自签名证书运行测试。然后使用 openssl 将 pfx 中的私钥转换为可以由 openssl 操作的 PEM 密钥库:“openssl pkcs12 -in test.pfx -out test.pem -nocerts -nodes” 然后运行 ​​RSA/EC 转换以转换Renci 组件期望的正确 RSA 格式的密钥:“openssl ec -aes256 -in test.pem -out key.pem -passout pass:test1234” 然后将 key.pem 文件放入您的私钥预期的目录中在里面。
  • 转换后,此标头应位于文件顶部: -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED
  • 谢谢@charlie,我刚刚通过在 openssl 中运行命令将我的私钥转换为 TSA 私钥。
【解决方案2】:

当我们生成 X509 证书时,它会生成一个私钥,需要通过运行下面提到的命令将其转换为 RSA 私钥。

openssl rsa -in server.key -out server_new.key

确保以管理员模式打开 openssl。 这意味着您的密钥文件应以 --- Begin RSA Private Key----

开头

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-26
    • 2016-03-10
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多