¿.NET FtpWebRequest admite tanto implícita (FTPS) como explícita (FTPES)?

Me están pidiendo que admita FTPS implícito y explícito (también conocido como FTPES). Actualmente estamos utilizando .NET FtpWebRequest . ¿ FtpWebRequest admite ambos tipos de FTPES y cuál es la diferencia?

Gracias

Hasta donde yo sé, la versión actual (.NET 2.0 y 3.5) de FtpWebRequest solo admite SSL explícito.

En realidad, .NET 2.0 actualmente no admite SSL implícito, solo explícito. Consideraremos agregar esto para una versión futura.

JonCole – MSFTModerator en la publicación del foro de MSDN

Si necesita usar Implict y Explícito TLS / SSL, debe probar uno de los componentes de FTP / SSL de terceros. El código siguiente utiliza nuestro Rebex FTP / SSL y se toma de la página del tutorial .

TLS / SSL explícito

El cliente se conecta al servidor FTP de una forma no protegida habitual, generalmente al puerto 21 asignado al protocolo FTP. Cuando se desea proteger la conexión mediante SSL, se inicializa una negociación de SSL, se asegura la conexión de control y se protegen todas las comunicaciones siguientes.

 // Create an instance of the Ftp class. Ftp ftp = new Ftp(); // Connect securely using explicit SSL. // Use the third argument to specify additional SSL parameters. ftp.Connect(hostname, 21, null, FtpSecurity.Explicit); // Connection is protected now, we can log in safely. ftp.Login(username, password); 

La protección explícita significa que es posible asegurar la conexión en cualquier momento. Si no sabe si necesitará la protección no en el momento de la conexión, es posible que desee conectarse utilizando el protocolo FTP ordinario sin cifrar y asegurar la conexión más adelante.

 Ftp ftp = new Ftp(); // Connect to the server with no protection. ftp.Connect(hostname, 21); // Upgrade connection to SSL. // This method also accepts an argument to specify SSL parameters. ftp.Secure(); // Connection is protected now, we can log in safely. ftp.Login(username, password); 

Protección SSL implícita de la sesión FTP

El IANA asignó originalmente un puerto separado al protocolo FTPS. Tras la conexión a este puerto, una negociación SSL comienza de inmediato y la conexión de control está asegurada. Todas las conexiones de datos también están aseguradas implícitamente de la misma manera. Esto es similar al enfoque utilizado por HTTPS.

Este enfoque no es favorecido por el IETF y está en desuso. Es compatible con Rebex FTP / SSL para la interoperabilidad con servidores más antiguos, pero se recomienda encarecidamente usar la protección explícita siempre que sea posible.

 Ftp ftp = new Ftp(); // Connect securely using implicit SSL. // Use the third argument to specify additional SSL parameters. ftp.Connect(hostname, 990, null, FtpSecurity.Implicit); // Connection is protected now, we can log in safely. ftp.Login(username, password); 

Puede descargar el componente en rebex.net/ftp-ssl.net/

He usado Alex FTPS Client anteriormente. Puede ser que debas mirar http://ftps.codeplex.com/ .

.NET Framework / FtpWebRequest solo admite el cifrado TLS / SSL explícito. No es compatible con el cifrado TLS / SSL implícito.

Creo que es poco probable que lo haga. La implementación FTP de .NET frameworks usa solo características estandarizadas del protocolo. El cifrado TLS / SSL implícito nunca se estandarizó. Se introdujo solo como un mecanismo temporal para permitir el uso de encriptación sin problemas con clientes FTP que no admitían el cifrado. En general, no hay ninguna razón para utilizar el cifrado TLS / SSL implícito. Un servidor FTP que solo admite el cifrado TLS / SSL implícito está roto, imo.


De todos modos, si necesita utilizar el cifrado TLS / SSL implícito, debe usar una biblioteca FTP de un tercero.

Con el ensamblado WinSCP .NET , es fácil:

 // Set up session options SessionOptions sessionOptions = new SessionOptions { Protocol = Protocol.Ftp, UserName = "username", Password = "password", FtpSecure = FtpSecure.Implicit, }; using (Session session = new Session()) { // Connect session.Open(sessionOptions); // Your code } 

Puede hacer que la GUI de WinSCP genere una plantilla de código FTP de C # , como la anterior, para usted.

(Soy el autor de WinSCP)

También puede probar el cliente http://Ftp.dll FTP / FTPS .

Admite conexiones SSL implícitas y explícitas . Aquí está la muestra implícita:

 using(Ftp ftp = new Ftp()) { ftp.ConnectSSL("ftp.server.com"); ftp.Login("user", "password"); ftp.ChangeFolder("uploads"); ftp.UploadFile("report.txt", @"c:\report.txt"); ftp.Close(); } 

Tenga en cuenta que este es un producto comercial y yo soy el autor de este componente.

edtFTPnet / PRO es una biblioteca de cliente FTP que también admite modos FTPS implícitos y explícitos. Es simplemente una cuestión de especificar el protocolo correcto:

  SecureFTPConnection conn = new SecureFTPConnection(); conn.Protocol = FileTransferProtocol.FTPSImplicit; // set remote host, user, pwd etc ... // now connect conn.Connect(); 

El mismo componente también es compatible con SFTP.

Y sí, soy uno de los desarrolladores de este componente (y de edtFTPnet , el cliente de FTP gratuito y gratuito de .NET).