c# - validación - WebRequest usando SSL
no se puede crear un canal seguro ssl/tls c# (2)
Tengo el siguiente código para recuperar un archivo usando FTP (que funciona bien).
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(svrPath);
request.KeepAlive = true;
request.UsePassive = true;
request.UseBinary = true;
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(uname, passw);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))
using (StreamWriter destination = new StreamWriter(destinationFile))
{
destination.Write(reader.ReadToEnd());
destination.Flush();
}
Sin embargo, cuando intento hacer esto usando SSL, no puedo acceder al archivo, como se muestra a continuación:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(svrPath);
request.KeepAlive = true;
request.UsePassive = true;
request.UseBinary = true;
// The following line causes the download to fail
request.EnableSsl = true;
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(uname, passw);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))
using (StreamWriter destination = new StreamWriter(destinationFile))
{
destination.Write(reader.ReadToEnd());
destination.Flush();
}
¿Alguien puede decirme por qué esto último no funcionaría?
EDITAR:
Obtengo la siguiente excepción:
The remote server returned an error: (530) Not logged in.
Pruebe esta solicitud FtpWebRequest = (FtpWebRequest) FtpWebRequest.Create (svrPath);
¿Dónde valida el certificado SSL? Hacer SSL a través de una conexión FTP no es tan simple como configurar la propiedad .EnableSsl
. Debe proporcionar un método de validación de certificado. Consulte este artículo para obtener el código C # para hacer lo que quiera. Además, alguien copió y pegó toda su clase de FTP en este artículo de MSDN si necesita una implementación más detallada.
Solo para ponerlo rápidamente en funcionamiento rápidamente, pruebe con esto:
if (request.EnableSsl) ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
y luego más tarde:
public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) {
return true; // Read the links provided above for real implementation
}