Click here to Skip to main content
11,702,168 members (65,210 online)
Click here to Skip to main content

An FTP secure client library for C#

, 10 Dec 2008 CPOL 233.6K 9.5K 125
Rate this:
Please Sign up or sign in to vote.
How to implement an FTP secure connection with an SSL stream class.

Introduction

The purpose of this article is to create a C # FTP client in Secure mode, so if you don’t have much knowledge of FTPS, I advise you to take a look at this: FTPS.

In the .NET Framework, to upload a file in FTPS mode, we generally use the FtpWebRequest class, but you can not send commands with « quote » arguments, and even if you search on the web, you will not find a concrete example of a secured C# FTP client.

It’s for those reasons I decided to create this article.

SSL Stream?

To send a socket in Secure Socket Layer (SSL) mode, we use the class System.Net.Security.SslStream.

Provides a stream used for client-server communication that uses the Secure Socket Layer (SSL) security protocol to authenticate the server and optionally the client”.

For more information, refer to MSDN.

Using the Code

1. Pre-Authenticate

FTPFactory ftp = new FTPFactory();
ftp.setDebug(true);
ftp.setRemoteHost(Settings.Default.TargetFtpSource);

//Connect to SSL Port (990)
ftp.setRemotePort(990);
ftp.loginWithoutUser();

//Send "AUTH SSL" Command
string cmd = "AUTH SSL";
ftp.sendCommand(cmd);

Before connecting to the FTP server in SSL mode, you have to define the 990 SSL port and send the « AUTH SSL » command authentication using SSL.

WelcomeFTPSecure.JPG

2. Create SSL Stream

//Create SSL Stream
ftp.getSslStream();
ftp.setUseStream(true);
//Login to FTP Secure
ftp.setRemoteUser(Settings.Default.TargetFtpSecureUser);
ftp.setRemotePass(Settings.Default.TargetFtpSecurePass);
ftp.login();

ftp.getSslStream() creates an SSL stream from client socket which will be used for exchange between the client and the server FTPS. Then, you have to enter a login and password to authenticate on the FTPS server.

Note: if the SSL stream is well established, then I display all the information about the server certificate.

CertificatInfos.JPG

3. Upload File

//Set ASCII Mode
ftp.setBinaryMode(false);

//Send Arguments if you want
//cmd = "site arg1 arg2";
//ftp.sendCommand(cmd);

//Upload file
ftp.uploadSecure(@"Filepath", false);

ftp.close();

Before uploading a file, you have to specify the mode: ftp.setBinaryMode(bool value).

  • value is false --> ASCII mode
  • value is true --> Binary mode

By default, it’s binary. Now, you upload the file using:

ftp.uploadSecure(@"Filepath", false)

Note: you can upload in non secured mode using ftp.upload().

Points of Interest

I learned how an SSL stream and the RAW FTP communication works between a client and an FTP server. Searching on the web, I found many who were stuck on the issue of SSL communication with an FTP server, so I hope this article will be of great help.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

kadaoui el mehdi
Architect
Belgium Belgium
in 2005, I started my career. Net and I could improve in this technology through the project WinFroms. Net 2.0 / MVC2 for "Nestle".

After obtaining my diploma MASTER "MBDS" from the University of Nice Sophia Anti-police, I left to Belguim to work as Expert .Net Analyst Developer.

Currently I specialize in architecture Asp.net to the lowest level.

Meanwhile I remain very active in the community. Net, I created the 1st community. Net Morocco "on Facebook and LinkedIn and twitter, called "Morocco .Net User Group (MONUG)"

You may also be interested in...

Comments and Discussions

 
GeneralRe: Getting a file listing returning odd characters Pin
kadaoui el mehdi16-Nov-09 9:47
memberkadaoui el mehdi16-Nov-09 9:47 
GeneralRe: Getting a file listing returning odd characters Pin
hankgrav16-Nov-09 9:56
memberhankgrav16-Nov-09 9:56 
GeneralRe: Getting a file listing returning odd characters Pin
kadaoui el mehdi19-Nov-09 1:11
memberkadaoui el mehdi19-Nov-09 1:11 
GeneralRe: Getting a file listing returning odd characters Pin
Member 1044694019-Jan-14 23:57
memberMember 1044694019-Jan-14 23:57 
GeneralDuring PASV I get: 500 You need to use a client supporting PRET (PRE Transfer) to use PASV Pin
AndreasLink14-Nov-09 3:56
memberAndreasLink14-Nov-09 3:56 
GeneralRe: During PASV I get: 500 You need to use a client supporting PRET (PRE Transfer) to use PASV Pin
AndreasLink14-Nov-09 4:23
memberAndreasLink14-Nov-09 4:23 
GeneralCode hangs up on readReply() Pin
Ericc196928-Oct-09 15:57
memberEricc196928-Oct-09 15:57 
GeneralRe: Code hangs up on readReply() Pin
AndreasLink14-Nov-09 4:00
memberAndreasLink14-Nov-09 4:00 
GeneralRe: Code hangs up on readReply() Pin
Member 3728808-Dec-09 9:54
memberMember 3728808-Dec-09 9:54 
GeneralRe: Code hangs up on readReply() Pin
MagicPT13-Jan-10 6:46
memberMagicPT13-Jan-10 6:46 
GeneralRe: Code hangs up on readReply() [modified] Pin
Silve_X17-Jul-10 23:52
memberSilve_X17-Jul-10 23:52 
GeneralError on port=990 Pin
Sameera Homa25-Sep-09 9:37
memberSameera Homa25-Sep-09 9:37 
GeneralRe: Error on port=990 Pin
kadaoui el mehdi25-Sep-09 9:46
memberkadaoui el mehdi25-Sep-09 9:46 
GeneralRe: Error on port=990 Pin
Sameera Homa25-Sep-09 10:02
memberSameera Homa25-Sep-09 10:02 
You are very quick. Thank you for replying so quickly. I’ll try to work on you suggestions and will get back to you.

hi

GeneralRe: Error on port=990 Pin
kadaoui el mehdi25-Sep-09 10:04
memberkadaoui el mehdi25-Sep-09 10:04 
GeneralRe: Error on port=990 Pin
SonnyDude13-Jul-10 21:13
memberSonnyDude13-Jul-10 21:13 
GeneralRe: Error on port=990 Pin
mendick200016-Nov-10 4:49
membermendick200016-Nov-10 4:49 
GeneralRe: Error on port=990 Pin
maximus.dec.meridius9-Mar-11 5:11
membermaximus.dec.meridius9-Mar-11 5:11 
Answer(Solution) The code hang on the function AuthenticateAsClient of the data stream. Pin
sonnguyen7917-Jul-09 12:48
membersonnguyen7917-Jul-09 12:48 
GeneralRe: (Solution) The code hang on the function AuthenticateAsClient of the data stream. Pin
Kris Munroe22-Sep-09 8:13
memberKris Munroe22-Sep-09 8:13 
AnswerRe: (Solution) The code hang on the function AuthenticateAsClient of the data stream. Pin
Jonathan.wilkins28-Jan-10 21:37
memberJonathan.wilkins28-Jan-10 21:37 
GeneralRe: (Solution) The code hang on the function AuthenticateAsClient of the data stream. Pin
Member 383304120-Oct-09 12:16
memberMember 383304120-Oct-09 12:16 
QuestionUsing the lib to connect a non secure ftp server Pin
david_864015-Jul-09 2:33
memberdavid_864015-Jul-09 2:33 
QuestionFTP Client and Server Pin
aschreiber25-Jun-09 13:10
memberaschreiber25-Jun-09 13:10 
GeneralNotImplementedException Pin
SimpleData6-May-09 2:10
memberSimpleData6-May-09 2:10 
GeneralExplicit mode Pin
adhager21-Apr-09 18:16
memberadhager21-Apr-09 18:16 
GeneralRe: Explicit mode Pin
kadaoui el mehdi5-May-09 3:00
memberkadaoui el mehdi5-May-09 3:00 
GeneralNo welcome message received Pin
optionj8515-Apr-09 1:52
memberoptionj8515-Apr-09 1:52 
GeneralRe: No welcome message received Pin
kadaoui el mehdi16-Apr-09 23:17
memberkadaoui el mehdi16-Apr-09 23:17 
GeneralRe: No welcome message received Pin
optionj8517-Apr-09 1:11
memberoptionj8517-Apr-09 1:11 
GeneralRe: No welcome message received Pin
kadaoui el mehdi17-Apr-09 2:26
memberkadaoui el mehdi17-Apr-09 2:26 
GeneralRe: No welcome message received Pin
optionj8517-Apr-09 3:05
memberoptionj8517-Apr-09 3:05 
GeneralRe: No welcome message received Pin
desarrolloJL13-Sep-10 6:37
memberdesarrolloJL13-Sep-10 6:37 
QuestionCert invalid? Pin
hk_willow3-Mar-09 11:47
memberhk_willow3-Mar-09 11:47 
AnswerRe: Cert invalid? Pin
kadaoui el mehdi5-Mar-09 21:52
memberkadaoui el mehdi5-Mar-09 21:52 
GeneralRe: Cert invalid? Pin
vstonape4-May-09 2:35
membervstonape4-May-09 2:35 
GeneralRe: Cert invalid? Pin
kadaoui el mehdi5-May-09 2:56
memberkadaoui el mehdi5-May-09 2:56 
GeneralIndex Out of bounds Pin
hk_willow23-Feb-09 12:49
memberhk_willow23-Feb-09 12:49 
GeneralRe: Index Out of bounds Pin
hk_willow23-Feb-09 13:38
memberhk_willow23-Feb-09 13:38 
GeneralRe: Index Out of bounds Pin
Mr Ed Hellyer26-Feb-09 7:06
memberMr Ed Hellyer26-Feb-09 7:06 
GeneralRe: Index Out of bounds Pin
mulengak27-Mar-09 3:10
membermulengak27-Mar-09 3:10 
QuestionThe requested name is valid, but no data of the requested type was found Pin
dsac11-Feb-09 6:10
memberdsac11-Feb-09 6:10 
AnswerRe: The requested name is valid, but no data of the requested type was found Pin
kadaoui el mehdi11-Feb-09 21:19
memberkadaoui el mehdi11-Feb-09 21:19 
GeneralRe: The requested name is valid, but no data of the requested type was found Pin
210jim5-Mar-09 7:19
member210jim5-Mar-09 7:19 
QuestiondownlodSecure? Pin
JohnDoe177-Feb-09 6:48
memberJohnDoe177-Feb-09 6:48 
AnswerRe: downlodSecure? Pin
kadaoui el mehdi7-Feb-09 23:31
memberkadaoui el mehdi7-Feb-09 23:31 
GeneralRe: downlodSecure? Pin
René André18-Feb-10 1:01
memberRené André18-Feb-10 1:01 
Generalprivate key issue Pin
flemingqin21-Jan-09 6:06
memberflemingqin21-Jan-09 6:06 
GeneralRe: private key issue Pin
kadaoui el mehdi21-Jan-09 21:13
memberkadaoui el mehdi21-Jan-09 21:13 
GeneralWorks like a charm Pin
TSNY20-Jan-09 5:04
memberTSNY20-Jan-09 5:04 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.150819.1 | Last Updated 10 Dec 2008
Article Copyright 2008 by kadaoui el mehdi
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid