我尝试在 ftpwebrequest 中使用 SSL,如下所示:
FileStream outputStream = new FileStream(fileName, FileMode.Append);
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpserverIp + "/" + file));
reqFTP.EnableSsl = true;
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.KeepAlive = false;
reqFTP.Timeout = -1;
reqFTP.UsePassive = true;
reqFTP.Credentials = new NetworkCredential("sh", "SE");
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
long cl = response.ContentLength;
// reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
int bufferSize = 4096;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
Console.WriteLine("Connected: Downloading File");
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
//Console.WriteLine(readCount.ToString());
}
ftpStream.Close();
outputStream.Close();
response.Close();
我得到了以下异常:
根据验证程序,远程证书无效。
根据我的谷歌搜索,我删除了证书中的私钥部分并开始处理。现在它抛出:
431 无法初始化 ssl 连接
我尝试谷歌搜索,但到目前为止没有结果,有什么想法吗?
我正在尝试连接 FileZilla。
答案很简单,FtpWebRequest 甚至对 FTPS 的支持还不够好。
.Net Framework 提供的 System.Net.FTPWebRequest 类非常适合简单任务(例如下载或上传文件或获取目录列表),并且还通过 EnableSsl 属性支持 SSL 请参阅:http://blogs。 msdn.com/adarshk/archive/2005/04/22/410925.aspx。那么为什么要为此开设新课程呢?
重点是 FTP 中的 SSL 支持不仅仅是一个开关(如 HTTP/HTTPS)。 FTP 需要两个单独的连接:一个用于命令(控制连接),另一个用于数据(数据连接),用于下载、上传和目录列表。 FTPWebRequest.EnableSsl 只是强制在两者上使用 SSL。问题是这并不总是合适。
Microsoft 仅在为 Windows Server 2008 及更高版本提供 FTP 7.5 时才开始在服务器端支持 FTPS。到目前为止,他们甚至不支持 Internet Explorer 和 Windows Explorer 中的 FTPS。难怪 .NET Framework BCL 缺乏 FTPS 支持。
在这段代码中:
new Uri("ftp://" + ftpserverIp + "/" + file)
您正在尝试连接到非 SSL ftp 服务器,该服务器用“ftp”表示。 将“ftp://”更改为“ftps://”应该会有所帮助(假设服务器支持 SSL。)
您缺少的步骤是建立证书验证策略。
这是通过以下代码完成的:
public static bool ValidateCertificate(object sender,
X509Certificate certificate, X509Chain chain,
SslPolicyErrors sslPolicyErrors) {
/**
* validation steps for the certificate go here
* if you want them, but it may be expedient to
* just accept whatever the FTP server gave you.
* The channel will be encrypted regardless of
* how trusted the certificate is.
*/
return true;
}
然后设置上面的方法在获取证书检查时命中:
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(ValidateCertificate);
给定的示例适用于 .NET 3.5,这意味着在当前接受的答案时,这种设置不可能的说法已经是错误的。