2009-12-03 26 views

Respuesta

15

por lo que yo sé la versión actual (.NET 2.0 y 3.5) de FtpWebRequest sólo admite SSL explícito.

En realidad, NET 2.0 actualmente no soporte SSL implícito, explícito única. Consideraremos agregar esto para una futura versión de .

JonCole - MSFTModerator en MSDN forum post

Si es necesario utilizar tanto Implict y explícita TLS/SSL que tiene que probar uno de los componentes FTP/SSL de terceros. El siguiente código utiliza nuestro Rebex FTP/SSL y está tomado del tutorial page.

explícita TLS/SSL

cliente se conecta al servidor de FTP de una manera no protegida de costumbre, por lo general para el puerto 21 se le asignó el 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ícito de la sesión FTP protocolo

FTPS fue asignado originalmente un puerto separado por la IANA. 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); 

Usted puede descargar el componente a rebex.net/ftp-ssl.net/

+3

aprecio el puesto, a pesar de que parece ser un conflicto de intereses ... ya que representa el componente que está empujando. – PortageMonkey

+2

Entiendo su preocupación. Sin embargo, parece que el consenso actual aquí es que mencionar el propio producto es éticamente correcto siempre que se proporcione una divulgación completa. Incluso cambié mi sobrenombre para asegurarme de que mi sesgo no se pasa por alto ;-). Puede encontrar interesantes enlaces siguientes en meta.stackoverflow sobre este tema: http://meta.stackexchange.com/questions/15787/is-it-bad-etiquette-to-mention-your-own-products-in-a- stackoverflow-answer y http://meta.stackexchange.com/questions/20031/vendors-on-stackoverflow. Creo que está bien siempre y cuando la respuesta sea válida y la identidad no esté oculta. –

12

he utilizado Alex FTPS cliente anterior. Puede ser que deberías mirar http://ftps.codeplex.com/.

+0

+1 para AlexFTPS! LGPL y gratuito (como en $$$) que es lo que debería ser una biblioteca central como esta. Por qué MS no admitía TLS/SSL implícitos en sus clases de FTP integradas, nunca lo sabré. – mattmc3

+3

@ mattmc3, sé por qué MS no compiló SSL implícito; es porque está en desuso. –

+0

AlexFTPS ahora también es un paquete NuGet. –

-1

edtFTPnet/PRO es una biblioteca 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 FTP de .NET de código abierto gratuito).

+0

Para que quede claro, la página del producto parece indicar que la versión "gratuita" no admite esta funcionalidad. No es que usted haya dicho explícitamente que sí necesariamente, pero ciertamente es una suposición que hice en base a su publicación. – mattmc3

+1

la versión gratuita (LGPL) es solo FTP; no es compatible con FTPS o SFTP –

1

También puede intentar Ftp.dll FTP/FTPS client.

Soporta implícita y conexiones explícitas SSL. 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.

2

.NET Framework/FtpWebRequest soporta la encriptación/SSL solamente TLS 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 usted necesita usar el cifrado TLS/SSL implícito, usted tiene que utilizar una biblioteca de FTP tercera parte.

Con WinSCP .NET assembly, 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 tener WinSCP GUI generate a C# FTP code template, como la de arriba, para usted.

(yo soy el autor de WinSCP)

Cuestiones relacionadas