2009-12-03 14 views

Répondre

15

pour autant que je sais que la version actuelle (.NET 2.0 et 3.5) de FtpWebRequest ne supporte que SSL explicite.

Actuellement, .NET 2.0 ne prend actuellement pas en charge le protocole SSL implicite, uniquement explicite. Nous envisagerons d'ajouter ceci pour une future version .

JonCole - MSFTModerator à MSDN forum post

Si vous devez utiliser à la fois Implict et explicite TLS/SSL, vous devez essayer un des composants tiers FTP/SSL. Le code suivant utilise notre Rebex FTP/SSL et provient du tutorial page.

Explicite TLS/SSL

Le client se connecte au serveur FTP de manière habituelle non protégée, généralement sur le port 21 a été affecté au protocole FTP. Lorsque l'on souhaite protéger la connexion à l'aide de SSL, une négociation SSL est initialisée, la connexion de contrôle est sécurisée et toutes les communications suivantes sont protégées.

// 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); 

Une protection explicite signifie qu'il est possible de sécuriser la connexion à tout moment. Si vous ne savez pas si vous aurez besoin de la protection au moment de la connexion, vous pouvez vous connecter en utilisant le protocole FTP non crypté ordinaire et sécuriser la connexion ultérieurement.

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); 

protection SSL Implicite de la session FTP

protocole FTPS a été attribué un port séparé par l'IANA. Lors de la connexion à ce port, une négociation SSL démarre immédiatement et la connexion de contrôle est sécurisée. Toutes les connexions de données sont également implicitement sécurisées de la même manière. Ceci est similaire à l'approche utilisée par HTTPS.

Cette approche n'est pas favorisée par l'IETF et est déconseillée. Il est pris en charge par Rebex FTP/SSL pour l'interopérabilité avec les serveurs plus anciens, mais il est fortement recommandé d'utiliser la protection explicite dans la mesure du possible.

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); 

Vous pouvez télécharger le composant à rebex.net/ftp-ssl.net/

+3

J'apprécie le poste, bien que semble être un conflit d'intérêts ... puisque vous représentez le composant que vous poussiez. – PortageMonkey

+2

Je comprends votre inquiétude. Cependant, il semble que le consensus actuel ici soit que la mention de son propre produit soit éthiquement correcte tant que la divulgation complète est fournie. J'ai même changé mon pseudo pour être sûr que mon biais ne sera pas oublié ;-). Vous pouvez trouver des liens intéressants à meta.stackoverflow en discutant de ce sujet: http://meta.stackexchange.com/questions/15787/is-it-bad-etiquette-to-mention-your-own-products-in-a- stackoverflow-answer et http://meta.stackexchange.com/questions/20031/vendors-on-stackoverflow. Je pense que c'est correct tant que la réponse est valide et que l'identité n'est pas cachée. –

12

Je l'ai utilisé plus tôt client Alex FTPS. Peut-être vous devriez regarder à http://ftps.codeplex.com/.

+0

+1 pour AlexFTPS! LGPL et gratuit (comme dans $$$) qui est ce qu'une bibliothèque de base comme celle-ci devrait être. Pourquoi MS ne supportait pas implicitement TLS/SSL dans leurs classes FTP intégrées, je ne le saurai jamais. – mattmc3

+3

@ mattmc3, je sais pourquoi MS n'a pas construit Implicit SSL; c'est parce qu'il est déprécié. –

+0

AlexFTPS est maintenant un paquet NuGet. –

-1

edtFTPnet/PRO est une bibliothèque cliente FTP qui prend également en charge les modes implicites et explicites FTPS. Il s'agit simplement de spécifier le bon protocole:

SecureFTPConnection conn = new SecureFTPConnection(); 
conn.Protocol = FileTransferProtocol.FTPSImplicit; 

// set remote host, user, pwd etc ... 

// now connect 
conn.Connect(); 

Le même composant prend également en charge SFTP.

Et oui, je suis l'un des développeurs de ce composant (et de edtFTPnet, le client FTP libre, open source .NET).

+0

Juste pour être clair, la page du produit semble indiquer que la version "gratuite" ne supporte pas cette fonctionnalité. Non pas que vous l'ayez explicitement dit, mais c'est certainement une hypothèse que j'ai faite en fonction de votre message. – mattmc3

+1

la version gratuite (LGPL) est uniquement FTP - elle ne supporte pas FTPS ou SFTP –

1

Vous pouvez également essayer Ftp.dll FTP/FTPS client.

Il soutient explicitement implicite et connexions SSL. Voici l'exemple implicite:

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(); 
} 

Veuillez noter qu'il s'agit d'un produit commercial et que je suis l'auteur de ce composant.

2

.NET Framework/FtpWebRequest prend en charge que le cryptage explicite TLS/SSL. Il ne prend pas en charge le cryptage TLS/SSL implicite.

Je crois qu'il est improbable que ce soit le cas. L'implémentation FTP des frameworks .NET utilise uniquement des fonctionnalités standard du protocole. Le chiffrement implicite TLS/SSL n'a jamais été standardisé. Il a été introduit uniquement en tant que mécanisme temporaire permettant d'utiliser un cryptage transparent avec les clients FTP qui ne prenaient pas en charge le cryptage. En général, il n'y a aucune raison d'utiliser le cryptage TLS/SSL implicite. Un serveur FTP qui prend uniquement en charge le cryptage TLS/SSL implicite est brisé, imo.


Quoi qu'il en soit, si vous avez besoin d'utiliser le cryptage implicite TLS/SSL, vous devez utiliser une 3ème partie bibliothèque FTP.

Avec WinSCP .NET assembly, il est facile:

// 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 
} 

Vous pouvez avoir WinSCP GUI generate a C# FTP code template, comme celui ci-dessus, pour vous.

(je suis l'auteur de WinSCP)