web-dev-qa-db-fra.com

Est-ce que .NET FtpWebRequest prend en charge à la fois implicite (FTPS) et explicite (FTPES)?

On me demande de prendre en charge le FTPS implicite et explicite (également connu sous le nom de FTPES). Nous utilisons actuellement le .NET FtpWebRequest. Le FtpWebRequest prend-il en charge les deux types de FTPES, et quelle est la différence?

Merci

27
PortageMonkey

pour autant que je sache, la version actuelle (.NET 2.0 et 3.5) de FtpWebRequest ne prend en charge que le SSL explicite.

En fait, .NET 2.0 ne prend actuellement pas en charge SSL implicite, seulement explicite. Nous envisagerons de l'ajouter pour une prochaine version.

JonCole - MSFTModerator sur message sur le forum MSDN

Si vous devez utiliser TLS/SSL implicite et explicite, vous devez essayer l'un des composants FTP/SSL tiers. Le code suivant utilise notre Rebex FTP/SSL et provient de la page du tutoriel .

TLS/SSL explicite

Le client se connecte au serveur FTP d'une manière non protégée habituelle, généralement le port 21 a été attribué au protocole FTP. Lorsque vous souhaitez 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 pas au moment de la connexion, vous souhaiterez peut-être vous connecter en utilisant le protocole FTP non chiffré ordinaire et sécuriser la connexion plus tard.

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

Le protocole FTPS a été initialement 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 sécurisées implicitement 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 à la place 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 sur rebex.net/ftp-ssl.net/

17
Martin Vobr

J'ai utilisé Alex FTPS Client plus tôt. Peut-être que vous devriez regarder http://ftps.codeplex.com/ .

13
user263369

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

Je pense qu'il est peu probable que ce soit le cas. L'implémentation FTP des frameworks .NET utilise uniquement des fonctionnalités standardisées du protocole. Le cryptage implicite TLS/SSL n'a jamais été standardisé. Il a été introduit uniquement en tant que mécanisme temporaire pour permettre l'utilisation d'un chiffrement transparent avec des clients FTP qui ne prenaient pas en charge le chiffrement. En général, il n'y a aucune raison d'utiliser le cryptage TLS/SSL implicite. Un serveur FTP qui prend en charge le chiffrement implicite TLS/SSL uniquement est cassé, imo. Notez que RFC 2228 [Extensions de sécurité FTP] a été introduit il y a plus de 20 ans!


Quoi qu'il en soit, si vous devez utiliser le cryptage implicite TLS/SSL, vous devez utiliser une bibliothèque FTP tierce.

Avec WinSCP .NET Assembly , c'est simple:

// 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 l'interface graphique WinSCP génère un modèle de code FTP C # , comme celui ci-dessus, pour vous.

(je suis l'auteur de WinSCP)

5
Martin Prikryl

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

Il prend en charge les connexions SSL implicites et explicites . 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.

1
Pawel Lesnikowski

edtFTPnet/PRO est une bibliothèque client 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 .NET open source gratuit).

0
Bruce Blackshaw