【问题标题】:FTPS using fingerpring使用指纹的 FTPS
【发布时间】:2018-03-02 13:45:21
【问题描述】:

我必须使用 SSL 与 FTP 服务器通信。

我收到了一个关于如何使用 WinScp 命令的示例:

open ftpes://SomeUser:SomePass@SomeDomain.com/ -certificate="xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"

问题是如何在应用程序中使用-certificate 部分?我必须将字符串保存在文件中还是...?

例如如果我们使用 C# 的 FtpWebRequest:

FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(downlaodLocation); 

我们如何使用这个指纹?

X509Certificate 类有一个接受 byte[] 的构造函数。

byte[] toBytes = Encoding.ASCII.GetBytes("xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx");
ftp.ClientCertificates.Add(new X509Certificate(toBytes));

这是使用证书指纹的正确方法吗?

【问题讨论】:

标签: c# ssl ftp certificate


【解决方案1】:

最终我采取了不同的方法来上传文件,并为此使用 WinScp for c# lib。

            SessionOptions sessionOptions = new SessionOptions
            {
                Protocol = Protocol.Sftp,
                HostName = ConfigurationManager.AppSettings["FTP.HOSTNAME"],
                UserName = ConfigurationManager.AppSettings["FTP.USERNAME"],
                Password = ConfigurationManager.AppSettings["FTP.PASSWORD"],
            };
            if (port.HasValue)
            {
                sessionOptions.PortNumber = port.Value;
            }

                sessionOptions.SshHostKeyFingerprint = ConfigurationManager.AppSettings["FTP.CERT.FINGERPRINT"].Trim();

            using (Session session = new Session())
            {
                if (!string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["LOG.PATH"]))
                {
                    session.SessionLogPath = ConfigurationManager.AppSettings["LOG.PATH"];
                }
                session.Open(sessionOptions);
                TransferOptions transferOptions = new TransferOptions
                {
                    TransferMode = TransferMode.Binary
                };

                TransferOperationResult transferResult = session.PutFiles(ConfigurationManager.AppSettings["FILE.TO.UPLOAD"], ConfigurationManager.AppSettings["FILE.DESTINATION.NAME"], true, transferOptions);

                transferResult.Check();

                StringBuilder result = new StringBuilder();
                foreach (TransferEventArgs transfer in transferResult.Transfers)
                {
                    result.Append(string.Format("Upload of {0} : {1}", transfer.FileName, transfer.Error));
                }
                Console.WriteLine(result.ToString());
            }

【讨论】:

  • 您已经询问过用于 FTP 的 SSL/TLS 指纹(确实可以通过 WinSCP .NET 程序集解决)。但实际上你最终使用了 SSH/SFTP。什么是完全不同的协议。你的回答应该能说明这一点。
  • 您的代码if (ShouldUseSSL()) sessionOptions.SshHostKeyFingerprint = ... 也没什么意义。首先,SSL 和 SSH 是两个完全不同的协议。其次,您无条件使用 SSH/SFTP,因此您还必须无条件设置SshHostKeyFingerprint。几乎没有任何场景可以设置Protocol = Protocol.Sftp,但不能设置SshHostKeyFingerprint
  • @MartinPrikryl Thnaks 的评论,马丁。我已经删除了 ShouldUseSSL 部分。我已经简化了 SO 答案的代码,但忘记在那里删除 if。我的意图是达到与问题命令相同的结果,所以这对我有用。
  • 但是,正如我已经解释过的,您答案中的代码与您问题中的代码 (FTPS) 完全不同。 SFTP 和 FTPS 是两种完全不同且不兼容的协议。
  • @MartinPrikryl 我已经编辑了答案以指定这是一种不同的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 2016-12-03
相关资源
最近更新 更多