使用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));
这是使用证书指纹的正确方法吗?
最后我采取了不同的方法来上传文件,并使用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'。我的意图是达到与问题中的命令相同的结果,所以这对我来说是有效的。 –
[使用与.NET的HttpWebRequest的请求/响应自签名证书]的可能的复制(https://*.com/questions/526711/using-a-self-signed-certificate-with-nets- httpwebrequest-response) –