使用fingerpring的FTPS

问题描述:

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

我已经收到了关于如何做到这一点,使用,我相信,在WINSCP命令的示例:

open ftpes://SomeUser:[email protected]/ -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)); 

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

+0

[使用与.NET的HttpWebRequest的请求/响应自签名证书]的可能的复制(https://*.com/questions/526711/using-a-self-signed-certificate-with-nets- httpwebrequest-response) –

最后我采取了不同的方法来上传文件,并使用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()); 
      } 
+0

您有关于FTP的SSL/TLS指纹的问题(实际上可以通过WinSCP .NET程序集解决)。但实际上你最终使用了SSH/SFTP。什么是完全不同的协议。你的回答应该解释这一点。 –

+0

另外你的代码'if(ShouldUseSSL())sessionOptions.SshHostKeyFingerprint = ...'没什么意义。首先,SSL和SSH是两个完全不同的协议。其次,你无条件地使用SSH/SFTP,所以你也必须无条件地设置'SshHostKeyFingerprint'。几乎没有任何场景可以设置'Protocol = Protocol.Sftp',但不能设置'SshHostKeyFingerprint'。 –

+0

@MartinPrikryl Thnaks的言论,马丁。我已经删除了'ShouldUseSSL'部分。我已经简化了SO答案的代码,但忘记删除那里的'if'。我的意图是达到与问题中的命令相同的结果,所以这对我来说是有效的。 –