<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0"><channel><title>ftps Wiki &amp; Documentation Rss Feed</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home</link><description>ftps Wiki Rss Description</description><item><title>Updated Wiki: Home</title><link>http://ftps.codeplex.com/wikipage?version=46</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;Project Description&lt;/h1&gt;
&lt;p&gt;&lt;br&gt;
This projects provides a &lt;strong&gt;free FTP/FTPS client and class library&lt;/strong&gt; available on any platform supporting the
&lt;strong&gt;.Net Framework 2.0&lt;/strong&gt; or &lt;strong&gt;Mono 2.0&lt;/strong&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris.
&lt;br&gt;
&lt;br&gt;
Please see &lt;a href="http://www.mono-project.com"&gt;http://www.mono-project.com&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br&gt;
&lt;br&gt;
Implemented RFCs:&lt;br&gt;
&lt;br&gt;
959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br&gt;
&lt;br&gt;
FTPS (sometimes called FTPES or &lt;em&gt;explicit&lt;/em&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents.
&lt;a href="http://www.ietf.org/rfc/rfc4217.txt"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;/a&gt; Support for the so called
&lt;em&gt;implicit&lt;/em&gt; FTPS has also been added (although not standard).&lt;br&gt;
&lt;br&gt;
FTPS should not be confused with SFTP (FTP over SSH).&lt;br&gt;
&lt;br&gt;
For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS"&gt;http://en.wikipedia.org/wiki/FTPS&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see
&lt;a href="#Implemented"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.twitter.com/cloudbaseit"&gt;&lt;img src="http://twitter-badges.s3.amazonaws.com/follow_me-c.png" alt="Follow alexpilotti on Twitter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="Cloudbase Solutions" href="http://www.cloudbase.it"&gt;&lt;img title="CBSLogo_thumb.png" src="http://i3.codeplex.com/Download?ProjectName=hypervbackup&amp;DownloadId=351258" alt="CBSLogo_thumb.png" width="150" height="132"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The FTP/FTPS Client&lt;/h2&gt;
&lt;p&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to,
&lt;strong&gt;encryption via SSL/TLS&lt;/strong&gt; and &lt;strong&gt;UTF8&lt;/strong&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br&gt;
&lt;br&gt;
The idea of this client was born while preparing some material for a technical speech session I was going to give at the
&lt;em&gt;Italian Microsoft TechDays - WPC 2008&lt;/em&gt;, about IIS 7.0 new features, including the
&lt;strong&gt;Microsoft FTP for IIS 7.0&lt;/strong&gt; add in and its freshly introduced support for SSL/TLS.&lt;br&gt;
&lt;br&gt;
One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today,
 some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br&gt;
&lt;br&gt;
The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt"&gt;
http://www.ietf.org/rfc/rfc4217.txt&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers:
&lt;strong&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/strong&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small
&lt;a href="#patch"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect
 to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard
&lt;em&gt;System.Net.FTPWebRequest&lt;/em&gt; provided by the framework was not powerful enough (more on this below).
&lt;br&gt;
&lt;br&gt;
That was enough to start this project. The client provides also a wide range of options and commands via command line arguments,
&lt;span style="text-decoration:underline"&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/span&gt; available on most platforms.&lt;br&gt;
&lt;br&gt;
Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project.
&lt;br&gt;
&lt;br&gt;
Please see below for some &lt;a href="#Quick"&gt;Quick usage samples&lt;/a&gt; and the full
&lt;a href="#Command"&gt;Command line reference&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Microsoft Powershell integration&lt;/h2&gt;
&lt;p&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;/p&gt;
&lt;h2&gt;Portable GUI&lt;/h2&gt;
&lt;p&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project.
&lt;br&gt;
&lt;br&gt;
&lt;a name="Quick"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Quick usage samples&lt;/h2&gt;
&lt;p&gt;Note: execute &lt;em&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/em&gt; when using Mono.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
&lt;a name="Command"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Command line reference&lt;/h2&gt;
&lt;p&gt;The command line reference, available by executing &lt;em&gt;ftps -?&lt;/em&gt; or &lt;em&gt;mono ftps.exe -?&lt;/em&gt; using Mono, follows:&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;pre&gt;Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;Commands:&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-?, -help&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Shows help and usage info&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-d, -delete&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Deletes a remote file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-expCert, -exportSslServerCert&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-f, -features&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-g, -get, -download&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-l, -list&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Returns the contents of the given directory, or the default directory if no name is provided&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-md, -mkdir&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Creates a remote directory&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-p, -put, -upload&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-pa, -putAppend&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads a file appending it's contents if the given remote file already exists&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-pu, -putUnique&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads a file with a unique name&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-rd, -rmdir&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Removes a remote directory&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-rn, -rename&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Renames a remote file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sys, -system&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Returns a brief description of the remote system&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-cust, -custom&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;Generic options:&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-dm, -dataMode&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Active or Passive (default) data connection mode&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-h, -hostname&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Name or IP address of the remote host to connect to&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-lf, -logFile&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
ftp commands and server replies log file name&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-ltfs, -logFileTimeStamp&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Adds a timestamp to every command and reply in the log file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-noCopyrightInfo&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Avoids displaying the copyright information header&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-oda, -overrideDataAddress&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Use the control connection's remote address instead of the one returned by the PASV command&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-P, -password&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-port&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-r, -recursive&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Enable recursion to download or upload entire directory trees&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-t, -timeout&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
TCP/IP connection timeout in seconds (default 120s)&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-tm, -transferMode&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-U, -username&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-v, -verbose&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Verbose output&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;SSL/TLS specific options:&lt;/span&gt;&lt;/strong&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-ssl, -tls&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
SSL/TLS support. Possible values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support) &lt;/li&gt;&lt;li&gt;CredentialsRequested &lt;/li&gt;&lt;li&gt;CredentialsRequired &lt;/li&gt;&lt;li&gt;ControlChannelRequested &lt;/li&gt;&lt;li&gt;ControlChannelRequired &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default) &lt;/li&gt;&lt;li&gt;DataChannelRequired &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure) &lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired) &lt;/li&gt;&lt;li&gt;Implicit &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;-sslClientCertPath&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
X.509 client certificate file path&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslInvalidServerCertHandling&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Invalid X.509 server certificate handling. Valid values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accept &lt;/li&gt;&lt;li&gt;Prompt (default) &lt;/li&gt;&lt;li&gt;Refuse &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;-sslMinCipherStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslMinHashStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. hash algorithm strength (e.g: 160). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslMinKeyExStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslX509ExportFormat&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
X509 certificate export format. Not all formats are available on all platforms. Supported values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cert (default) &lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a name="FTP/FTPS"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The FTP/FTPS class library&lt;/h2&gt;
&lt;p&gt;The &lt;em&gt;System.Net.FTPWebRequest&lt;/em&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the
&lt;em&gt;EnableSsl&lt;/em&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx"&gt;
http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;/a&gt; . So why a new class for that?
&lt;br&gt;
&lt;br&gt;
The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the
&lt;span style="text-decoration:underline"&gt;control&lt;/span&gt; connection) and one for the data (the
&lt;span style="text-decoration:underline"&gt;data&lt;/span&gt; connection), for downloads, uploads and directory listings.&lt;br&gt;
&lt;em&gt;FTPWebRequest.EnableSsl&lt;/em&gt; simply forces the use of SSL on both of them. &lt;em&gt;
The problem is that this is not always suitable&lt;/em&gt;. &lt;br&gt;
&lt;br&gt;
FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called
&lt;em&gt;passive&lt;/em&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client
 and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see
&lt;a href="http://en.wikipedia.org/wiki/FTPS"&gt;http://en.wikipedia.org/wiki/FTPS&lt;/a&gt; for more on the subject.&lt;br&gt;
&lt;br&gt;
&lt;span style="text-decoration:underline"&gt;There's a partial solution to this problem:&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all
 the main FTPS servers. &lt;br&gt;
&lt;br&gt;
This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br&gt;
&lt;br&gt;
Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)
&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads &lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;em&gt;
OPTS UTF8 ON&lt;/em&gt; if available in the features returned by the &lt;em&gt;FEAT&lt;/em&gt; command)
&lt;/li&gt;&lt;li&gt;IPV6 support (planned) &lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;The full MSDN style documentation will be released shortly.&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
In order to use the FTPS class library, add the &lt;strong&gt;&lt;em&gt;AlexPilotti.FTPS.Client.dll&lt;/em&gt;&lt;/strong&gt; assembly to your project References.&lt;br&gt;
The assembly is available along with the FTPS client on the &lt;span style="text-decoration:underline"&gt;
Releases&lt;/span&gt; page.&lt;br&gt;
&lt;br&gt;
The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br&gt;
&lt;br&gt;
Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C&amp;#43;&amp;#43;/CLI, etc.):&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;div style="color:black; background-color:white"&gt;
&lt;pre&gt;&lt;span style="color:blue"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:blue"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:blue"&gt;using&lt;/span&gt; System.Net;


&lt;span style="color:blue"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:blue"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:blue"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:green"&gt;// Connect to the server, with mandatory SSL/TLS &lt;/span&gt;
            &lt;span style="color:green"&gt;// encryption during authentication and &lt;/span&gt;
            &lt;span style="color:green"&gt;// optional encryption on the data channel &lt;/span&gt;
            &lt;span style="color:green"&gt;// (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#a31515"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, 
                           &lt;span style="color:blue"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#a31515"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, 
                                                 &lt;span style="color:#a31515"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | 
                           ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:green"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#a31515"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &amp;quot;c:\\local\\path\\&amp;quot;);
        }
    }
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;Snapshots&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AlexFTPS on Windows:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;em&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/em&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Vista_640.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=56275" alt="ftps_Vista_640.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;AlexFTPS on Linux:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Linux_640.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=56273" alt="ftps_Linux_640.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;AlexFTPS on Mac OS X:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Mac_OS_X.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=53854" alt="ftps_Mac_OS_X.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;a name="Implemented"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Implemented FTP commands&lt;/h2&gt;
&lt;p&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Command name &lt;/th&gt;
&lt;th&gt;Notes &lt;/th&gt;
&lt;th&gt;RFC &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APPE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AUTH&lt;/td&gt;
&lt;td&gt;TLS supported&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CCC&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDUP&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLNT&lt;/td&gt;
&lt;td&gt;Required by some servers&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LANG&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2640&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LIST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MDTM&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;3659&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MKD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NLST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NOOP&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPTS&lt;/td&gt;
&lt;td&gt;Mainly UTF8 support&lt;/td&gt;
&lt;td&gt;2389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PASV&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PROT&lt;/td&gt;
&lt;td&gt;PROT P, C support&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSBZ&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PWD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QUIT&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RETR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RMD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RNFR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RNTO&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SIZE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;3659&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STOR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STOU&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SYST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TYPE&lt;/td&gt;
&lt;td&gt;ASCII and Image (Binary) representation types supported&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USER&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;NUnit tests&lt;/h2&gt;
&lt;p&gt;Will be posted shortly!&lt;/p&gt;
&lt;h2&gt;TODO&lt;/h2&gt;
&lt;p&gt;Here's the list of things that need to be implemented.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proxy support &lt;/li&gt;&lt;li&gt;More RFC 2228 commands &lt;/li&gt;&lt;li&gt;Internationalization &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a name="patch"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;vsftpd patch&lt;/h2&gt;
&lt;p&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br&gt;
Here's a workaround for version 2.0.7. Just apply this patch to &lt;em&gt;ssl.c&lt;/em&gt;: &lt;a href="http://www.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=53986"&gt;
vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br&gt;
Please note: this is an unofficial patch.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Alessandro Pilotti &lt;br&gt;
MVP / IIS&lt;br&gt;
&lt;br&gt;
&lt;img title="MVP_Horizontal_FullColor_small.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=112960" alt="MVP_Horizontal_FullColor_small.png"&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>alexp</author><pubDate>Sat, 16 Mar 2013 16:33:29 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20130316043329P</guid></item><item><title>Updated Wiki: Home</title><link>http://ftps.codeplex.com/wikipage?version=45</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;Project Description&lt;/h1&gt;
&lt;p&gt;&lt;br&gt;
This projects provides a &lt;strong&gt;free FTP/FTPS client and class library&lt;/strong&gt; available on any platform supporting the
&lt;strong&gt;.Net Framework 2.0&lt;/strong&gt; or &lt;strong&gt;Mono 2.0&lt;/strong&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris.
&lt;br&gt;
&lt;br&gt;
Please see &lt;a href="http://www.mono-project.com"&gt;http://www.mono-project.com&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br&gt;
&lt;br&gt;
Implemented RFCs:&lt;br&gt;
&lt;br&gt;
959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br&gt;
&lt;br&gt;
FTPS (sometimes called FTPES or &lt;em&gt;explicit&lt;/em&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents.
&lt;a href="http://www.ietf.org/rfc/rfc4217.txt"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;/a&gt; Support for the so called
&lt;em&gt;implicit&lt;/em&gt; FTPS has also been added (although not standard).&lt;br&gt;
&lt;br&gt;
FTPS should not be confused with SFTP (FTP over SSH).&lt;br&gt;
&lt;br&gt;
For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS"&gt;http://en.wikipedia.org/wiki/FTPS&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see
&lt;a href="#Implemented"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.twitter.com/cloudbaseit"&gt;&lt;img src="http://twitter-badges.s3.amazonaws.com/follow_me-c.png" alt="Follow alexpilotti on Twitter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="Cloudbase Solutions" href="http://www.cloudbase.it"&gt;&lt;img title="CBSLogo_thumb.png" src="http://i3.codeplex.com/Download?ProjectName=hypervbackup&amp;DownloadId=351258" alt="CBSLogo_thumb.png" width="150" height="132"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The FTP/FTPS Client&lt;/h2&gt;
&lt;p&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to,
&lt;strong&gt;encryption via SSL/TLS&lt;/strong&gt; and &lt;strong&gt;UTF8&lt;/strong&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br&gt;
&lt;br&gt;
The idea of this client was born while preparing some material for a technical speech session I was going to give at the
&lt;em&gt;Italian Microsoft TechDays - WPC 2008&lt;/em&gt;, about IIS 7.0 new features, including the
&lt;strong&gt;Microsoft FTP for IIS 7.0&lt;/strong&gt; add in and its freshly introduced support for SSL/TLS.&lt;br&gt;
&lt;br&gt;
One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today,
 some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br&gt;
&lt;br&gt;
The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt"&gt;
http://www.ietf.org/rfc/rfc4217.txt&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers:
&lt;strong&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/strong&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small
&lt;a href="#patch"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect
 to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard
&lt;em&gt;System.Net.FTPWebRequest&lt;/em&gt; provided by the framework was not powerful enough (more on this below).
&lt;br&gt;
&lt;br&gt;
That was enough to start this project. The client provides also a wide range of options and commands via command line arguments,
&lt;span style="text-decoration:underline"&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/span&gt; available on most platforms.&lt;br&gt;
&lt;br&gt;
Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project.
&lt;br&gt;
&lt;br&gt;
Please see below for some &lt;a href="#Quick"&gt;Quick usage samples&lt;/a&gt; and the full
&lt;a href="#Command"&gt;Command line reference&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Microsoft Powershell integration&lt;/h2&gt;
&lt;p&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;/p&gt;
&lt;h2&gt;Portable GUI&lt;/h2&gt;
&lt;p&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project.
&lt;br&gt;
&lt;br&gt;
&lt;a name="Quick"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Quick usage samples&lt;/h2&gt;
&lt;p&gt;Note: execute &lt;em&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/em&gt; when using Mono.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
&lt;a name="Command"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Command line reference&lt;/h2&gt;
&lt;p&gt;The command line reference, available by executing &lt;em&gt;ftps -?&lt;/em&gt; or &lt;em&gt;mono ftps.exe -?&lt;/em&gt; using Mono, follows:&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;pre&gt;Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;Commands:&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-?, -help&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Shows help and usage info&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-d, -delete&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Deletes a remote file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-expCert, -exportSslServerCert&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-f, -features&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-g, -get, -download&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-l, -list&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Returns the contents of the given directory, or the default directory if no name is provided&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-md, -mkdir&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Creates a remote directory&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-p, -put, -upload&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-pa, -putAppend&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads a file appending it's contents if the given remote file already exists&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-pu, -putUnique&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads a file with a unique name&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-rd, -rmdir&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Removes a remote directory&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-rn, -rename&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Renames a remote file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sys, -system&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Returns a brief description of the remote system&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-cust, -custom&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;Generic options:&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-dm, -dataMode&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Active or Passive (default) data connection mode&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-h, -hostname&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Name or IP address of the remote host to connect to&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-lf, -logFile&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
ftp commands and server replies log file name&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-ltfs, -logFileTimeStamp&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Adds a timestamp to every command and reply in the log file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-noCopyrightInfo&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Avoids displaying the copyright information header&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-oda, -overrideDataAddress&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Use the control connection's remote address instead of the one returned by the PASV command&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-P, -password&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-port&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-r, -recursive&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Enable recursion to download or upload entire directory trees&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-t, -timeout&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
TCP/IP connection timeout in seconds (default 120s)&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-tm, -transferMode&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-U, -username&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-v, -verbose&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Verbose output&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;SSL/TLS specific options:&lt;/span&gt;&lt;/strong&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-ssl, -tls&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
SSL/TLS support. Possible values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support) &lt;/li&gt;&lt;li&gt;CredentialsRequested &lt;/li&gt;&lt;li&gt;CredentialsRequired &lt;/li&gt;&lt;li&gt;ControlChannelRequested &lt;/li&gt;&lt;li&gt;ControlChannelRequired &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default) &lt;/li&gt;&lt;li&gt;DataChannelRequired &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure) &lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired) &lt;/li&gt;&lt;li&gt;Implicit &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;-sslClientCertPath&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
X.509 client certificate file path&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslInvalidServerCertHandling&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Invalid X.509 server certificate handling. Valid values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accept &lt;/li&gt;&lt;li&gt;Prompt (default) &lt;/li&gt;&lt;li&gt;Refuse &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;-sslMinCipherStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslMinHashStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. hash algorithm strength (e.g: 160). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslMinKeyExStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslX509ExportFormat&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
X509 certificate export format. Not all formats are available on all platforms. Supported values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cert (default) &lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a name="FTP/FTPS"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The FTP/FTPS class library&lt;/h2&gt;
&lt;p&gt;The &lt;em&gt;System.Net.FTPWebRequest&lt;/em&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the
&lt;em&gt;EnableSsl&lt;/em&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx"&gt;
http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;/a&gt; . So why a new class for that?
&lt;br&gt;
&lt;br&gt;
The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the
&lt;span style="text-decoration:underline"&gt;control&lt;/span&gt; connection) and one for the data (the
&lt;span style="text-decoration:underline"&gt;data&lt;/span&gt; connection), for downloads, uploads and directory listings.&lt;br&gt;
&lt;em&gt;FTPWebRequest.EnableSsl&lt;/em&gt; simply forces the use of SSL on both of them. &lt;em&gt;
The problem is that this is not always suitable&lt;/em&gt;. &lt;br&gt;
&lt;br&gt;
FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called
&lt;em&gt;passive&lt;/em&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client
 and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see
&lt;a href="http://en.wikipedia.org/wiki/FTPS"&gt;http://en.wikipedia.org/wiki/FTPS&lt;/a&gt; for more on the subject.&lt;br&gt;
&lt;br&gt;
&lt;span style="text-decoration:underline"&gt;There's a partial solution to this problem:&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all
 the main FTPS servers. &lt;br&gt;
&lt;br&gt;
This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br&gt;
&lt;br&gt;
Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)
&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads &lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;em&gt;
OPTS UTF8 ON&lt;/em&gt; if available in the features returned by the &lt;em&gt;FEAT&lt;/em&gt; command)
&lt;/li&gt;&lt;li&gt;IPV6 support (planned) &lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;The full MSDN style documentation will be released shortly.&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
In order to use the FTPS class library, add the &lt;strong&gt;&lt;em&gt;AlexPilotti.FTPS.Client.dll&lt;/em&gt;&lt;/strong&gt; assembly to your project References.&lt;br&gt;
The assembly is available along with the FTPS client on the &lt;span style="text-decoration:underline"&gt;
Releases&lt;/span&gt; page.&lt;br&gt;
&lt;br&gt;
The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br&gt;
&lt;br&gt;
Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C&amp;#43;&amp;#43;/CLI, etc.):&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;div style="color:black; background-color:white"&gt;
&lt;pre&gt;&lt;span style="color:blue"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:blue"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:blue"&gt;using&lt;/span&gt; System.Net;


&lt;span style="color:blue"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:blue"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:blue"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:green"&gt;// Connect to the server, with mandatory SSL/TLS &lt;/span&gt;
            &lt;span style="color:green"&gt;// encryption during authentication and &lt;/span&gt;
            &lt;span style="color:green"&gt;// optional encryption on the data channel &lt;/span&gt;
            &lt;span style="color:green"&gt;// (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#a31515"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, 
                           &lt;span style="color:blue"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#a31515"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, 
                                                 &lt;span style="color:#a31515"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | 
                           ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:green"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#a31515"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &amp;quot;c:\\local\\path\\&amp;quot;);
        }
    }
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;Snapshots&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AlexFTPS on Windows Vista:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;em&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/em&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Vista_640.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=56275" alt="ftps_Vista_640.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;AlexFTPS on Linux:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Linux_640.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=56273" alt="ftps_Linux_640.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;AlexFTPS on Mac OS X:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Mac_OS_X.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=53854" alt="ftps_Mac_OS_X.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;a name="Implemented"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Implemented FTP commands&lt;/h2&gt;
&lt;p&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Command name &lt;/th&gt;
&lt;th&gt;Notes &lt;/th&gt;
&lt;th&gt;RFC &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APPE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AUTH&lt;/td&gt;
&lt;td&gt;TLS supported&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CCC&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDUP&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLNT&lt;/td&gt;
&lt;td&gt;Required by some servers&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LANG&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2640&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LIST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MDTM&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;3659&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MKD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NLST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NOOP&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPTS&lt;/td&gt;
&lt;td&gt;Mainly UTF8 support&lt;/td&gt;
&lt;td&gt;2389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PASV&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PROT&lt;/td&gt;
&lt;td&gt;PROT P, C support&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSBZ&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PWD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QUIT&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RETR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RMD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RNFR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RNTO&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SIZE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;3659&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STOR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STOU&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SYST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TYPE&lt;/td&gt;
&lt;td&gt;ASCII and Image (Binary) representation types supported&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USER&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;NUnit tests&lt;/h2&gt;
&lt;p&gt;Will be posted shortly!&lt;/p&gt;
&lt;h2&gt;TODO&lt;/h2&gt;
&lt;p&gt;Here's the list of things that need to be implemented.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proxy support &lt;/li&gt;&lt;li&gt;More RFC 2228 commands &lt;/li&gt;&lt;li&gt;Internationalization &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a name="patch"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;vsftpd patch&lt;/h2&gt;
&lt;p&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br&gt;
Here's a workaround for version 2.0.7. Just apply this patch to &lt;em&gt;ssl.c&lt;/em&gt;: &lt;a href="http://www.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=53986"&gt;
vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br&gt;
Please note: this is an unofficial patch.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Alessandro Pilotti &lt;br&gt;
MVP / IIS&lt;br&gt;
&lt;br&gt;
&lt;img title="MVP_Horizontal_FullColor_small.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=112960" alt="MVP_Horizontal_FullColor_small.png"&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>alexp</author><pubDate>Sat, 16 Mar 2013 16:32:29 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20130316043229P</guid></item><item><title>Updated Wiki: Home</title><link>http://ftps.codeplex.com/wikipage?version=44</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;Project Description&lt;/h1&gt;
&lt;p&gt;&lt;br&gt;
This projects provides a &lt;strong&gt;free FTP/FTPS client and class library&lt;/strong&gt; available on any platform supporting the
&lt;strong&gt;.Net Framework 2.0&lt;/strong&gt; or &lt;strong&gt;Mono 2.0&lt;/strong&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris.
&lt;br&gt;
&lt;br&gt;
Please see &lt;a href="http://www.mono-project.com"&gt;http://www.mono-project.com&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br&gt;
&lt;br&gt;
Implemented RFCs:&lt;br&gt;
&lt;br&gt;
959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br&gt;
&lt;br&gt;
FTPS (sometimes called FTPES or &lt;em&gt;explicit&lt;/em&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents.
&lt;a href="http://www.ietf.org/rfc/rfc4217.txt"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;/a&gt; Support for the so called
&lt;em&gt;implicit&lt;/em&gt; FTPS has also been added (although not standard).&lt;br&gt;
&lt;br&gt;
FTPS should not be confused with SFTP (FTP over SSH).&lt;br&gt;
&lt;br&gt;
For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS"&gt;http://en.wikipedia.org/wiki/FTPS&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see
&lt;a href="#Implemented"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.twitter.com/cloudbaseit"&gt;&lt;img src="http://twitter-badges.s3.amazonaws.com/follow_me-c.png" alt="Follow alexpilotti on Twitter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;The FTP/FTPS Client&lt;/h2&gt;
&lt;p&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to,
&lt;strong&gt;encryption via SSL/TLS&lt;/strong&gt; and &lt;strong&gt;UTF8&lt;/strong&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br&gt;
&lt;br&gt;
The idea of this client was born while preparing some material for a technical speech session I was going to give at the
&lt;em&gt;Italian Microsoft TechDays - WPC 2008&lt;/em&gt;, about IIS 7.0 new features, including the
&lt;strong&gt;Microsoft FTP for IIS 7.0&lt;/strong&gt; add in and its freshly introduced support for SSL/TLS.&lt;br&gt;
&lt;br&gt;
One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today,
 some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br&gt;
&lt;br&gt;
The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt"&gt;
http://www.ietf.org/rfc/rfc4217.txt&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers:
&lt;strong&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/strong&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small
&lt;a href="#patch"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect
 to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard
&lt;em&gt;System.Net.FTPWebRequest&lt;/em&gt; provided by the framework was not powerful enough (more on this below).
&lt;br&gt;
&lt;br&gt;
That was enough to start this project. The client provides also a wide range of options and commands via command line arguments,
&lt;span style="text-decoration:underline"&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/span&gt; available on most platforms.&lt;br&gt;
&lt;br&gt;
Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project.
&lt;br&gt;
&lt;br&gt;
Please see below for some &lt;a href="#Quick"&gt;Quick usage samples&lt;/a&gt; and the full
&lt;a href="#Command"&gt;Command line reference&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Microsoft Powershell integration&lt;/h2&gt;
&lt;p&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;/p&gt;
&lt;h2&gt;Portable GUI&lt;/h2&gt;
&lt;p&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project.
&lt;br&gt;
&lt;br&gt;
&lt;a name="Quick"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Quick usage samples&lt;/h2&gt;
&lt;p&gt;Note: execute &lt;em&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/em&gt; when using Mono.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
&lt;a name="Command"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Command line reference&lt;/h2&gt;
&lt;p&gt;The command line reference, available by executing &lt;em&gt;ftps -?&lt;/em&gt; or &lt;em&gt;mono ftps.exe -?&lt;/em&gt; using Mono, follows:&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;pre&gt;Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;Commands:&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-?, -help&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Shows help and usage info&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-d, -delete&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Deletes a remote file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-expCert, -exportSslServerCert&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-f, -features&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-g, -get, -download&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-l, -list&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Returns the contents of the given directory, or the default directory if no name is provided&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-md, -mkdir&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Creates a remote directory&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-p, -put, -upload&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-pa, -putAppend&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads a file appending it's contents if the given remote file already exists&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-pu, -putUnique&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads a file with a unique name&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-rd, -rmdir&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Removes a remote directory&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-rn, -rename&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Renames a remote file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sys, -system&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Returns a brief description of the remote system&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-cust, -custom&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;Generic options:&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-dm, -dataMode&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Active or Passive (default) data connection mode&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-h, -hostname&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Name or IP address of the remote host to connect to&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-lf, -logFile&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
ftp commands and server replies log file name&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-ltfs, -logFileTimeStamp&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Adds a timestamp to every command and reply in the log file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-noCopyrightInfo&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Avoids displaying the copyright information header&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-oda, -overrideDataAddress&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Use the control connection's remote address instead of the one returned by the PASV command&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-P, -password&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-port&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-r, -recursive&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Enable recursion to download or upload entire directory trees&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-t, -timeout&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
TCP/IP connection timeout in seconds (default 120s)&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-tm, -transferMode&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-U, -username&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-v, -verbose&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Verbose output&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;SSL/TLS specific options:&lt;/span&gt;&lt;/strong&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-ssl, -tls&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
SSL/TLS support. Possible values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support) &lt;/li&gt;&lt;li&gt;CredentialsRequested &lt;/li&gt;&lt;li&gt;CredentialsRequired &lt;/li&gt;&lt;li&gt;ControlChannelRequested &lt;/li&gt;&lt;li&gt;ControlChannelRequired &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default) &lt;/li&gt;&lt;li&gt;DataChannelRequired &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure) &lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired) &lt;/li&gt;&lt;li&gt;Implicit &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;-sslClientCertPath&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
X.509 client certificate file path&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslInvalidServerCertHandling&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Invalid X.509 server certificate handling. Valid values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accept &lt;/li&gt;&lt;li&gt;Prompt (default) &lt;/li&gt;&lt;li&gt;Refuse &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;-sslMinCipherStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslMinHashStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. hash algorithm strength (e.g: 160). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslMinKeyExStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslX509ExportFormat&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
X509 certificate export format. Not all formats are available on all platforms. Supported values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cert (default) &lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a name="FTP/FTPS"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The FTP/FTPS class library&lt;/h2&gt;
&lt;p&gt;The &lt;em&gt;System.Net.FTPWebRequest&lt;/em&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the
&lt;em&gt;EnableSsl&lt;/em&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx"&gt;
http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;/a&gt; . So why a new class for that?
&lt;br&gt;
&lt;br&gt;
The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the
&lt;span style="text-decoration:underline"&gt;control&lt;/span&gt; connection) and one for the data (the
&lt;span style="text-decoration:underline"&gt;data&lt;/span&gt; connection), for downloads, uploads and directory listings.&lt;br&gt;
&lt;em&gt;FTPWebRequest.EnableSsl&lt;/em&gt; simply forces the use of SSL on both of them. &lt;em&gt;
The problem is that this is not always suitable&lt;/em&gt;. &lt;br&gt;
&lt;br&gt;
FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called
&lt;em&gt;passive&lt;/em&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client
 and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see
&lt;a href="http://en.wikipedia.org/wiki/FTPS"&gt;http://en.wikipedia.org/wiki/FTPS&lt;/a&gt; for more on the subject.&lt;br&gt;
&lt;br&gt;
&lt;span style="text-decoration:underline"&gt;There's a partial solution to this problem:&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all
 the main FTPS servers. &lt;br&gt;
&lt;br&gt;
This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br&gt;
&lt;br&gt;
Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)
&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads &lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;em&gt;
OPTS UTF8 ON&lt;/em&gt; if available in the features returned by the &lt;em&gt;FEAT&lt;/em&gt; command)
&lt;/li&gt;&lt;li&gt;IPV6 support (planned) &lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;The full MSDN style documentation will be released shortly.&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
In order to use the FTPS class library, add the &lt;strong&gt;&lt;em&gt;AlexPilotti.FTPS.Client.dll&lt;/em&gt;&lt;/strong&gt; assembly to your project References.&lt;br&gt;
The assembly is available along with the FTPS client on the &lt;span style="text-decoration:underline"&gt;
Releases&lt;/span&gt; page.&lt;br&gt;
&lt;br&gt;
The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br&gt;
&lt;br&gt;
Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C&amp;#43;&amp;#43;/CLI, etc.):&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;div style="color:black; background-color:white"&gt;
&lt;pre&gt;&lt;span style="color:blue"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:blue"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:blue"&gt;using&lt;/span&gt; System.Net;


&lt;span style="color:blue"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:blue"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:blue"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:green"&gt;// Connect to the server, with mandatory SSL/TLS &lt;/span&gt;
            &lt;span style="color:green"&gt;// encryption during authentication and &lt;/span&gt;
            &lt;span style="color:green"&gt;// optional encryption on the data channel &lt;/span&gt;
            &lt;span style="color:green"&gt;// (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#a31515"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, 
                           &lt;span style="color:blue"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#a31515"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, 
                                                 &lt;span style="color:#a31515"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | 
                           ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:green"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#a31515"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &amp;quot;c:\\local\\path\\&amp;quot;);
        }
    }
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;Snapshots&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AlexFTPS on Windows Vista:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;em&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/em&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Vista_640.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=56275" alt="ftps_Vista_640.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;AlexFTPS on Linux:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Linux_640.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=56273" alt="ftps_Linux_640.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;AlexFTPS on Mac OS X:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Mac_OS_X.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=53854" alt="ftps_Mac_OS_X.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;a name="Implemented"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Implemented FTP commands&lt;/h2&gt;
&lt;p&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Command name &lt;/th&gt;
&lt;th&gt;Notes &lt;/th&gt;
&lt;th&gt;RFC &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APPE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AUTH&lt;/td&gt;
&lt;td&gt;TLS supported&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CCC&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDUP&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLNT&lt;/td&gt;
&lt;td&gt;Required by some servers&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LANG&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2640&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LIST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MDTM&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;3659&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MKD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NLST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NOOP&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPTS&lt;/td&gt;
&lt;td&gt;Mainly UTF8 support&lt;/td&gt;
&lt;td&gt;2389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PASV&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PROT&lt;/td&gt;
&lt;td&gt;PROT P, C support&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSBZ&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PWD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QUIT&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RETR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RMD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RNFR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RNTO&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SIZE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;3659&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STOR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STOU&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SYST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TYPE&lt;/td&gt;
&lt;td&gt;ASCII and Image (Binary) representation types supported&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USER&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;NUnit tests&lt;/h2&gt;
&lt;p&gt;Will be posted shortly!&lt;/p&gt;
&lt;h2&gt;TODO&lt;/h2&gt;
&lt;p&gt;Here's the list of things that need to be implemented.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proxy support &lt;/li&gt;&lt;li&gt;More RFC 2228 commands &lt;/li&gt;&lt;li&gt;Internationalization &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a name="patch"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;vsftpd patch&lt;/h2&gt;
&lt;p&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br&gt;
Here's a workaround for version 2.0.7. Just apply this patch to &lt;em&gt;ssl.c&lt;/em&gt;: &lt;a href="http://www.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=53986"&gt;
vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br&gt;
Please note: this is an unofficial patch.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Alessandro Pilotti &lt;br&gt;
MVP / IIS&lt;br&gt;
&lt;br&gt;
&lt;img title="MVP_Horizontal_FullColor_small.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=112960" alt="MVP_Horizontal_FullColor_small.png"&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>alexp</author><pubDate>Wed, 31 Oct 2012 09:43:26 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20121031094326A</guid></item><item><title>Updated Wiki: Home</title><link>http://ftps.codeplex.com/wikipage?version=43</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;Project Description&lt;/h1&gt;
&lt;p&gt;&lt;br&gt;
This projects provides a &lt;strong&gt;free FTP/FTPS client and class library&lt;/strong&gt; available on any platform supporting the
&lt;strong&gt;.Net Framework 2.0&lt;/strong&gt; or &lt;strong&gt;Mono 2.0&lt;/strong&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris.
&lt;br&gt;
&lt;br&gt;
Please see &lt;a href="http://www.mono-project.com"&gt;http://www.mono-project.com&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br&gt;
&lt;br&gt;
Implemented RFCs:&lt;br&gt;
&lt;br&gt;
959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br&gt;
&lt;br&gt;
FTPS (sometimes called FTPES or &lt;em&gt;explicit&lt;/em&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents.
&lt;a href="http://www.ietf.org/rfc/rfc4217.txt"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;/a&gt; Support for the so called
&lt;em&gt;implicit&lt;/em&gt; FTPS has also been added (although not standard).&lt;br&gt;
&lt;br&gt;
FTPS should not be confused with SFTP (FTP over SSH).&lt;br&gt;
&lt;br&gt;
For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS"&gt;http://en.wikipedia.org/wiki/FTPS&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see
&lt;a href="#x_Implemented"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.twitter.com/alexpilotti"&gt;&lt;img src="http://twitter-badges.s3.amazonaws.com/follow_me-c.png" alt="Follow alexpilotti on Twitter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;The FTP/FTPS Client&lt;/h2&gt;
&lt;p&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to,
&lt;strong&gt;encryption via SSL/TLS&lt;/strong&gt; and &lt;strong&gt;UTF8&lt;/strong&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br&gt;
&lt;br&gt;
The idea of this client was born while preparing some material for a technical speech session I was going to give at the
&lt;em&gt;Italian Microsoft TechDays - WPC 2008&lt;/em&gt;, about IIS 7.0 new features, including the
&lt;strong&gt;Microsoft FTP for IIS 7.0&lt;/strong&gt; add in and its freshly introduced support for SSL/TLS.&lt;br&gt;
&lt;br&gt;
One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today,
 some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br&gt;
&lt;br&gt;
The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt"&gt;
http://www.ietf.org/rfc/rfc4217.txt&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers:
&lt;strong&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/strong&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small
&lt;a href="#x_patch"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect
 to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard
&lt;em&gt;System.Net.FTPWebRequest&lt;/em&gt; provided by the framework was not powerful enough (more on this below).
&lt;br&gt;
&lt;br&gt;
That was enough to start this project. The client provides also a wide range of options and commands via command line arguments,
&lt;span style="text-decoration:underline"&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/span&gt; available on most platforms.&lt;br&gt;
&lt;br&gt;
Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project.
&lt;br&gt;
&lt;br&gt;
Please see below for some &lt;a href="#x_Quick"&gt;Quick usage samples&lt;/a&gt; and the full
&lt;a href="#x_Command"&gt;Command line reference&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Microsoft Powershell integration&lt;/h2&gt;
&lt;p&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;/p&gt;
&lt;h2&gt;Portable GUI&lt;/h2&gt;
&lt;p&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project.
&lt;br&gt;
&lt;br&gt;
&lt;a name="Quick"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Quick usage samples&lt;/h2&gt;
&lt;p&gt;Note: execute &lt;em&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/em&gt; when using Mono.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21: &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
&lt;a name="Command"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Command line reference&lt;/h2&gt;
&lt;p&gt;The command line reference, available by executing &lt;em&gt;ftps -?&lt;/em&gt; or &lt;em&gt;mono ftps.exe -?&lt;/em&gt; using Mono, follows:&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;pre&gt;Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;Commands:&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-?, -help&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Shows help and usage info&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-d, -delete&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Deletes a remote file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-expCert, -exportSslServerCert&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-f, -features&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-g, -get, -download&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-l, -list&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Returns the contents of the given directory, or the default directory if no name is provided&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-md, -mkdir&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Creates a remote directory&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-p, -put, -upload&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-pa, -putAppend&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads a file appending it's contents if the given remote file already exists&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-pu, -putUnique&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Uploads a file with a unique name&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-rd, -rmdir&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Removes a remote directory&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-rn, -rename&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Renames a remote file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sys, -system&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Returns a brief description of the remote system&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-cust, -custom&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;Generic options:&lt;/span&gt;&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-dm, -dataMode&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Active or Passive (default) data connection mode&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-h, -hostname&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Name or IP address of the remote host to connect to&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-lf, -logFile&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
ftp commands and server replies log file name&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-ltfs, -logFileTimeStamp&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Adds a timestamp to every command and reply in the log file&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-noCopyrightInfo&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Avoids displaying the copyright information header&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-oda, -overrideDataAddress&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Use the control connection's remote address instead of the one returned by the PASV command&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-P, -password&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-port&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-r, -recursive&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Enable recursion to download or upload entire directory trees&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-t, -timeout&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
TCP/IP connection timeout in seconds (default 120s)&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-tm, -transferMode&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-U, -username&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-v, -verbose&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Verbose output&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;&lt;span style="text-decoration:underline"&gt;SSL/TLS specific options:&lt;/span&gt;&lt;/strong&gt;
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-ssl, -tls&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
SSL/TLS support. Possible values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support) &lt;/li&gt;&lt;li&gt;CredentialsRequested &lt;/li&gt;&lt;li&gt;CredentialsRequired &lt;/li&gt;&lt;li&gt;ControlChannelRequested &lt;/li&gt;&lt;li&gt;ControlChannelRequired &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default) &lt;/li&gt;&lt;li&gt;DataChannelRequired &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure) &lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired) &lt;/li&gt;&lt;li&gt;Implicit &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;-sslClientCertPath&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
X.509 client certificate file path&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslInvalidServerCertHandling&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Invalid X.509 server certificate handling. Valid values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accept &lt;/li&gt;&lt;li&gt;Prompt (default) &lt;/li&gt;&lt;li&gt;Refuse &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;-sslMinCipherStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslMinHashStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. hash algorithm strength (e.g: 160). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslMinKeyExStrength&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;-sslX509ExportFormat&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
X509 certificate export format. Not all formats are available on all platforms. Supported values are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cert (default) &lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a name="FTP/FTPS"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The FTP/FTPS class library&lt;/h2&gt;
&lt;p&gt;The &lt;em&gt;System.Net.FTPWebRequest&lt;/em&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the
&lt;em&gt;EnableSsl&lt;/em&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx"&gt;
http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;/a&gt; . So why a new class for that?
&lt;br&gt;
&lt;br&gt;
The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the
&lt;span style="text-decoration:underline"&gt;control&lt;/span&gt; connection) and one for the data (the
&lt;span style="text-decoration:underline"&gt;data&lt;/span&gt; connection), for downloads, uploads and directory listings.&lt;br&gt;
&lt;em&gt;FTPWebRequest.EnableSsl&lt;/em&gt; simply forces the use of SSL on both of them. &lt;em&gt;
The problem is that this is not always suitable&lt;/em&gt;. &lt;br&gt;
&lt;br&gt;
FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called
&lt;em&gt;passive&lt;/em&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client
 and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see
&lt;a href="http://en.wikipedia.org/wiki/FTPS"&gt;http://en.wikipedia.org/wiki/FTPS&lt;/a&gt; for more on the subject.&lt;br&gt;
&lt;br&gt;
&lt;span style="text-decoration:underline"&gt;There's a partial solution to this problem:&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all
 the main FTPS servers. &lt;br&gt;
&lt;br&gt;
This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br&gt;
&lt;br&gt;
Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)
&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads &lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;em&gt;
OPTS UTF8 ON&lt;/em&gt; if available in the features returned by the &lt;em&gt;FEAT&lt;/em&gt; command)
&lt;/li&gt;&lt;li&gt;IPV6 support (planned) &lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;The full MSDN style documentation will be released shortly.&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
In order to use the FTPS class library, add the &lt;strong&gt;&lt;em&gt;AlexPilotti.FTPS.Client.dll&lt;/em&gt;&lt;/strong&gt; assembly to your project References.&lt;br&gt;
The assembly is available along with the FTPS client on the &lt;span style="text-decoration:underline"&gt;
Releases&lt;/span&gt; page.&lt;br&gt;
&lt;br&gt;
The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br&gt;
&lt;br&gt;
Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C&amp;#43;&amp;#43;/CLI, etc.):&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;div style="color:black; background-color:white"&gt;
&lt;pre&gt;&lt;span style="color:blue"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:blue"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:blue"&gt;using&lt;/span&gt; System.Net;


&lt;span style="color:blue"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:blue"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:blue"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:green"&gt;// Connect to the server, with mandatory SSL/TLS &lt;/span&gt;
            &lt;span style="color:green"&gt;// encryption during authentication and &lt;/span&gt;
            &lt;span style="color:green"&gt;// optional encryption on the data channel &lt;/span&gt;
            &lt;span style="color:green"&gt;// (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#a31515"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, 
                           &lt;span style="color:blue"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#a31515"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, 
                                                 &lt;span style="color:#a31515"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | 
                           ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:green"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#a31515"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &amp;quot;c:\\local\\path\\&amp;quot;);
        }
    }
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;Snapshots&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;AlexFTPS on Windows Vista:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;em&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/em&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Vista_640.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=56275" alt="ftps_Vista_640.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;AlexFTPS on Linux:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Linux_640.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=56273" alt="ftps_Linux_640.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;AlexFTPS on Mac OS X:&lt;/strong&gt;&lt;br&gt;
&lt;br&gt;
&lt;img title="ftps_Mac_OS_X.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=53854" alt="ftps_Mac_OS_X.png"&gt;&lt;br&gt;
&lt;br&gt;
&lt;a name="Implemented"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Implemented FTP commands&lt;/h2&gt;
&lt;p&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Command name &lt;/th&gt;
&lt;th&gt;Notes &lt;/th&gt;
&lt;th&gt;RFC &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APPE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AUTH&lt;/td&gt;
&lt;td&gt;TLS supported&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CCC&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDUP&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLNT&lt;/td&gt;
&lt;td&gt;Required by some servers&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FEAT&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LANG&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2640&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LIST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MDTM&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;3659&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MKD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NLST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NOOP&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPTS&lt;/td&gt;
&lt;td&gt;Mainly UTF8 support&lt;/td&gt;
&lt;td&gt;2389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PASS&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PASV&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PROT&lt;/td&gt;
&lt;td&gt;PROT P, C support&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSBZ&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;2228&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PWD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QUIT&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RETR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RMD&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RNFR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RNTO&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SIZE&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;3659&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STOR&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STOU&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SYST&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TYPE&lt;/td&gt;
&lt;td&gt;ASCII and Image (Binary) representation types supported&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USER&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;959&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;NUnit tests&lt;/h2&gt;
&lt;p&gt;Will be posted shortly!&lt;/p&gt;
&lt;h2&gt;TODO&lt;/h2&gt;
&lt;p&gt;Here's the list of things that need to be implemented.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proxy support &lt;/li&gt;&lt;li&gt;More RFC 2228 commands &lt;/li&gt;&lt;li&gt;Internationalization &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a name="patch"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;vsftpd patch&lt;/h2&gt;
&lt;p&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br&gt;
Here's a workaround for version 2.0.7. Just apply this patch to &lt;em&gt;ssl.c&lt;/em&gt;: &lt;a href="http://www.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=53986"&gt;
vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br&gt;
Please note: this is an unofficial patch.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Alessandro Pilotti &lt;br&gt;
MVP / IIS&lt;br&gt;
&lt;br&gt;
&lt;img title="MVP_Horizontal_FullColor_small.png" src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=112960" alt="MVP_Horizontal_FullColor_small.png"&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>alexp</author><pubDate>Tue, 10 Apr 2012 12:54:36 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20120410125436P</guid></item><item><title>Updated Wiki: Home</title><link>http://ftps.codeplex.com/wikipage?version=42</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Project Description&lt;/h1&gt;
&lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt;&lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt;&lt;br /&gt;Implemented RFCs:&lt;br /&gt;&lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt;&lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt;&lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt;&lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented FTP commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt;
&lt;h2&gt;The FTP/FTPS Client&lt;/h2&gt;
The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt;&lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt;&lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can&amp;#39;t be easily replaced by, for example, an HTTP server.&lt;br /&gt;&lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch for version 2.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt;&lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt;&lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt;&lt;br /&gt;Please see below for some &lt;a href="#Quick usage samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command line reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt;
&lt;h2&gt;Microsoft Powershell integration&lt;/h2&gt;
The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt;
&lt;h2&gt;Portable GUI&lt;/h2&gt;
A free portable GUI is also planned and will be developed if there&amp;#39;s enough feedback on the project. &lt;br /&gt;&lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;
&lt;h2&gt;Quick usage samples&lt;/h2&gt;
Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Export the server&amp;#39;s X.509 certificate on a FTPS connection:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt;&lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;
&lt;h2&gt;Command line reference&lt;/h2&gt;
The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Shows help and usage info&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Deletes a remote file&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Exports the server&amp;#39;s SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Creates a remote directory&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads a file appending it&amp;#39;s contents if the given remote file already exists&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads a file with a unique name&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Removes a remote directory&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Renames a remote file&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-dm, -dataMode&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Active or Passive (default) data connection mode&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-lf, -logFile&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ftp commands and server replies log file name&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-ltfs, -logFileTimeStamp&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Adds a timestamp to every command and reply in the log file&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-oda, -overrideDataAddress&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Use the control connection&amp;#39;s remote address instead of the one returned by the PASV command&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Verbose output&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt;&lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  
&lt;ul&gt;&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;
&lt;li&gt;CredentialsRequested          &lt;/li&gt;
&lt;li&gt;CredentialsRequired                    &lt;/li&gt;
&lt;li&gt;ControlChannelRequested                &lt;/li&gt;
&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;
&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;
&lt;li&gt;DataChannelRequired&lt;/li&gt;
&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;
&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;
&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;
&lt;li&gt;Implicit&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;X.509 client certificate file path&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: 
&lt;ul&gt;&lt;li&gt;Accept&lt;/li&gt;
&lt;li&gt;Prompt (default)&lt;/li&gt;
&lt;li&gt;Refuse&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: 
&lt;ul&gt;&lt;li&gt;Cert (default)&lt;/li&gt;
&lt;li&gt;Pkcs12 &lt;/li&gt;
&lt;li&gt;SerializedCert&lt;/li&gt;&lt;/ul&gt;
&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;
&lt;h2&gt;The FTP/FTPS class library&lt;/h2&gt;
The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt;&lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;There&amp;#39;s a partial solution to this problem:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it&amp;#39;s enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt;&lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt;&lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;
&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;
&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;
&lt;li&gt;IPV6 support (planned)&lt;/li&gt;
&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt;&lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt;&lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System.Net;


&lt;span style="color:Blue;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:Blue;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:Green;"&gt;// Connect to the server, with mandatory SSL/TLS &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// encryption during authentication and &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// optional encryption on the data channel &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, 
                           &lt;span style="color:Blue;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, 
                                                 &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | 
                           ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:Green;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &amp;quot;c:\\local\\path\\&amp;quot;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Snapshots&lt;/h2&gt;
&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=56275" alt="ftps_Vista_640.png" title="ftps_Vista_640.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=56273" alt="ftps_Linux_640.png" title="ftps_Linux_640.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" title="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;
&lt;h2&gt;Implemented FTP commands&lt;/h2&gt;
Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;h2&gt;NUnit tests&lt;/h2&gt;
Will be posted shortly!&lt;br /&gt;
&lt;h2&gt;TODO &lt;/h2&gt;
Here&amp;#39;s the list of things that need to be implemented.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Proxy support&lt;/li&gt;
&lt;li&gt;More RFC 2228 commands&lt;/li&gt;
&lt;li&gt;Internationalization&lt;/li&gt;&lt;/ul&gt;
&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;
&lt;h2&gt;vsftpd patch&lt;/h2&gt;
There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here&amp;#39;s a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="http://www.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=53986"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It&amp;#39;s just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, that&amp;#39;s all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Alessandro Pilotti &lt;br /&gt;MVP / IIS&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=ftps&amp;DownloadId=112960" alt="MVP_Horizontal_FullColor_small.png" title="MVP_Horizontal_FullColor_small.png" /&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 02 Jan 2012 23:24:51 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20120102112451P</guid></item><item><title>Updated Wiki: Home</title><link>http://ftps.codeplex.com/wikipage?version=41</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Project Description&lt;/h1&gt;
&lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt;&lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt;&lt;br /&gt;Implemented RFCs:&lt;br /&gt;&lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt;&lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt;&lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt;&lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented FTP commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt;
&lt;h2&gt;The FTP/FTPS Client&lt;/h2&gt;
The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt;&lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt;&lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can&amp;#39;t be easily replaced by, for example, an HTTP server.&lt;br /&gt;&lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch for version 2.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt;&lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt;&lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt;&lt;br /&gt;Please see below for some &lt;a href="#Quick usage samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command line reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt;
&lt;h2&gt;Microsoft Powershell integration&lt;/h2&gt;
The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt;
&lt;h2&gt;Portable GUI&lt;/h2&gt;
A free portable GUI is also planned and will be developed if there&amp;#39;s enough feedback on the project. &lt;br /&gt;&lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;
&lt;h2&gt;Quick usage samples&lt;/h2&gt;
Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Export the server&amp;#39;s X.509 certificate on a FTPS connection:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt;&lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;
&lt;h2&gt;Command line reference&lt;/h2&gt;
The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Shows help and usage info&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Deletes a remote file&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Exports the server&amp;#39;s SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Creates a remote directory&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads a file appending it&amp;#39;s contents if the given remote file already exists&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads a file with a unique name&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Removes a remote directory&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Renames a remote file&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-dm, -dataMode&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Active or Passive (default) data connection mode&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-lf, -logFile&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ftp commands and server replies log file name&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-ltfs, -logFileTimeStamp&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Adds a timestamp to every command and reply in the log file&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-oda, -overrideDataAddress&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Use the control connection&amp;#39;s remote address instead of the one returned by the PASV command&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Verbose output&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt;&lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  
&lt;ul&gt;&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;
&lt;li&gt;CredentialsRequested          &lt;/li&gt;
&lt;li&gt;CredentialsRequired                    &lt;/li&gt;
&lt;li&gt;ControlChannelRequested                &lt;/li&gt;
&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;
&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;
&lt;li&gt;DataChannelRequired&lt;/li&gt;
&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;
&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;
&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;
&lt;li&gt;Implicit&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;X.509 client certificate file path&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: 
&lt;ul&gt;&lt;li&gt;Accept&lt;/li&gt;
&lt;li&gt;Prompt (default)&lt;/li&gt;
&lt;li&gt;Refuse&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: 
&lt;ul&gt;&lt;li&gt;Cert (default)&lt;/li&gt;
&lt;li&gt;Pkcs12 &lt;/li&gt;
&lt;li&gt;SerializedCert&lt;/li&gt;&lt;/ul&gt;
&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;
&lt;h2&gt;The FTP/FTPS class library&lt;/h2&gt;
The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt;&lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;There&amp;#39;s a partial solution to this problem:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it&amp;#39;s enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt;&lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt;&lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;
&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;
&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;
&lt;li&gt;IPV6 support (planned)&lt;/li&gt;
&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt;&lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt;&lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System.Net;


&lt;span style="color:Blue;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:Blue;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:Green;"&gt;// Connect to the server, with mandatory SSL/TLS &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// encryption during authentication and &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// optional encryption on the data channel &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, 
                           &lt;span style="color:Blue;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, 
                                                 &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | 
                           ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:Green;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &amp;quot;c:\\local\\path\\&amp;quot;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Snapshots&lt;/h2&gt;
&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=56275" alt="ftps_Vista_640.png" title="ftps_Vista_640.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=56273" alt="ftps_Linux_640.png" title="ftps_Linux_640.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" title="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;
&lt;h2&gt;Implemented FTP commands&lt;/h2&gt;
Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;h2&gt;NUnit tests&lt;/h2&gt;
Will be posted shortly!&lt;br /&gt;
&lt;h2&gt;TODO &lt;/h2&gt;
Here&amp;#39;s the list of things that need to be implemented.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Proxy support&lt;/li&gt;
&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;
&lt;li&gt;More RFC 2228 commands&lt;/li&gt;
&lt;li&gt;IPv6 support.&lt;/li&gt;
&lt;li&gt;Internationalization&lt;/li&gt;&lt;/ul&gt;
&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;
&lt;h2&gt;vsftpd patch&lt;/h2&gt;
There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here&amp;#39;s a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=53986"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It&amp;#39;s just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, that&amp;#39;s all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Alessandro Pilotti &lt;br /&gt;MVP / IIS&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=112960" alt="MVP_Horizontal_FullColor_small.png" title="MVP_Horizontal_FullColor_small.png" /&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 22 Aug 2011 11:36:25 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110822113625A</guid></item><item><title>Updated Wiki: Home</title><link>http://ftps.codeplex.com/wikipage?version=40</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Project Description&lt;/h1&gt;
&lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt;&lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt;&lt;br /&gt;Implemented RFCs:&lt;br /&gt;&lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt;&lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt;&lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt;&lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented FTP commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt;
&lt;h2&gt;The FTP/FTPS Client&lt;/h2&gt;
The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt;&lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt;&lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can&amp;#39;t be easily replaced by, for example, an HTTP server.&lt;br /&gt;&lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch for version 2.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt;&lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt;&lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt;&lt;br /&gt;Please see below for some &lt;a href="#Quick usage samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command line reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt;
&lt;h2&gt;Microsoft Powershell integration&lt;/h2&gt;
The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt;
&lt;h2&gt;Portable GUI&lt;/h2&gt;
A free portable GUI is also planned and will be developed if there&amp;#39;s enough feedback on the project. &lt;br /&gt;&lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;
&lt;h2&gt;Quick usage samples&lt;/h2&gt;
Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Export the server&amp;#39;s X.509 certificate on a FTPS connection:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt;&lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;
&lt;h2&gt;Command line reference&lt;/h2&gt;
The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Shows help and usage info&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Deletes a remote file&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Exports the server&amp;#39;s SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Creates a remote directory&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads a file appending it&amp;#39;s contents if the given remote file already exists&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads a file with a unique name&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Removes a remote directory&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Renames a remote file&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Verbose output&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt;&lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  
&lt;ul&gt;&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;
&lt;li&gt;CredentialsRequested          &lt;/li&gt;
&lt;li&gt;CredentialsRequired                    &lt;/li&gt;
&lt;li&gt;ControlChannelRequested                &lt;/li&gt;
&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;
&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;
&lt;li&gt;DataChannelRequired&lt;/li&gt;
&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;
&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;
&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;
&lt;li&gt;Implicit&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;X.509 client certificate file path&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: 
&lt;ul&gt;&lt;li&gt;Accept&lt;/li&gt;
&lt;li&gt;Prompt (default)&lt;/li&gt;
&lt;li&gt;Refuse&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: 
&lt;ul&gt;&lt;li&gt;Cert (default)&lt;/li&gt;
&lt;li&gt;Pkcs12 &lt;/li&gt;
&lt;li&gt;SerializedCert&lt;/li&gt;&lt;/ul&gt;
&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;
&lt;h2&gt;The FTP/FTPS class library&lt;/h2&gt;
The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt;&lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;There&amp;#39;s a partial solution to this problem:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it&amp;#39;s enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt;&lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt;&lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;
&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;
&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;
&lt;li&gt;IPV6 support (planned)&lt;/li&gt;
&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt;&lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt;&lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System.Net;


&lt;span style="color:Blue;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:Blue;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:Green;"&gt;// Connect to the server, with mandatory SSL/TLS &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// encryption during authentication and &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// optional encryption on the data channel &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, 
                           &lt;span style="color:Blue;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, 
                                                 &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | 
                           ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:Green;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &amp;quot;c:\\local\\path\\&amp;quot;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Snapshots&lt;/h2&gt;
&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=56275" alt="ftps_Vista_640.png" title="ftps_Vista_640.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=56273" alt="ftps_Linux_640.png" title="ftps_Linux_640.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" title="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;
&lt;h2&gt;Implemented FTP commands&lt;/h2&gt;
Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;h2&gt;NUnit tests&lt;/h2&gt;
Will be posted shortly!&lt;br /&gt;
&lt;h2&gt;TODO &lt;/h2&gt;
Here&amp;#39;s the list of things that need to be implemented.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Proxy support&lt;/li&gt;
&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;
&lt;li&gt;More RFC 2228 commands&lt;/li&gt;
&lt;li&gt;IPv6 support.&lt;/li&gt;
&lt;li&gt;Internationalization&lt;/li&gt;&lt;/ul&gt;
&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;
&lt;h2&gt;vsftpd patch&lt;/h2&gt;
There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here&amp;#39;s a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=53986"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It&amp;#39;s just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, that&amp;#39;s all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Alessandro Pilotti &lt;br /&gt;MVP / IIS&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=112960" alt="MVP_Horizontal_FullColor_small.png" title="MVP_Horizontal_FullColor_small.png" /&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>alexp</author><pubDate>Wed, 13 Jul 2011 10:52:53 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110713105253A</guid></item><item><title>Updated Wiki: Home</title><link>http://ftps.codeplex.com/wikipage?version=39</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Project Description&lt;/h1&gt;
&lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt;&lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt;&lt;br /&gt;Implemented RFCs:&lt;br /&gt;&lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt;&lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt;&lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt;&lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented FTP commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt;
&lt;h2&gt;The FTP/FTPS Client&lt;/h2&gt;
The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt;&lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt;&lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can&amp;#39;t be easily replaced by, for example, an HTTP server.&lt;br /&gt;&lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch for version 2.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt;&lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt;&lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt;&lt;br /&gt;Please see below for some &lt;a href="#Quick usage samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command line reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt;
&lt;h2&gt;Microsoft Powershell integration&lt;/h2&gt;
The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt;
&lt;h2&gt;Portable GUI&lt;/h2&gt;
A free portable GUI is also planned and will be developed if there&amp;#39;s enough feedback on the project. &lt;br /&gt;&lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;
&lt;h2&gt;Quick usage samples&lt;/h2&gt;
Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Export the server&amp;#39;s X.509 certificate on a FTPS connection:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt;
&lt;ul&gt;&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt;&lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;
&lt;h2&gt;Command line reference&lt;/h2&gt;
The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Shows help and usage info&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Deletes a remote file&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Exports the server&amp;#39;s SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Creates a remote directory&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads a file appending it&amp;#39;s contents if the given remote file already exists&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uploads a file with a unique name&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Removes a remote directory&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Renames a remote file&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Verbose output&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt;&lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  
&lt;ul&gt;&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;
&lt;li&gt;CredentialsRequested          &lt;/li&gt;
&lt;li&gt;CredentialsRequired                    &lt;/li&gt;
&lt;li&gt;ControlChannelRequested                &lt;/li&gt;
&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;
&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;
&lt;li&gt;DataChannelRequired&lt;/li&gt;
&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;
&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;
&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;
&lt;li&gt;Implicit&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;X.509 client certificate file path&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: 
&lt;ul&gt;&lt;li&gt;Accept&lt;/li&gt;
&lt;li&gt;Prompt (default)&lt;/li&gt;
&lt;li&gt;Refuse&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: 
&lt;ul&gt;&lt;li&gt;Cert (default)&lt;/li&gt;
&lt;li&gt;Pkcs12 &lt;/li&gt;
&lt;li&gt;SerializedCert&lt;/li&gt;&lt;/ul&gt;
&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;
&lt;h2&gt;The FTP/FTPS class library&lt;/h2&gt;
The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt;&lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;There&amp;#39;s a partial solution to this problem:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it&amp;#39;s enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt;&lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt;&lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;
&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;
&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;
&lt;li&gt;IPV6 support (planned)&lt;/li&gt;
&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt;&lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt;&lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C&lt;u&gt;&lt;/u&gt;/CLI, etc.):&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System.Net;


&lt;span style="color:Blue;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:Blue;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:Green;"&gt;// Connect to the server, with mandatory SSL/TLS &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// encryption during authentication and &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// optional encryption on the data channel &lt;/span&gt;
            &lt;span style="color:Green;"&gt;// (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, 
                           &lt;span style="color:Blue;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, 
                                                 &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | 
                           ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:Green;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &amp;quot;c:\\local\\path\\&amp;quot;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Snapshots&lt;/h2&gt;
&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=56275" alt="ftps_Vista_640.png" title="ftps_Vista_640.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=56273" alt="ftps_Linux_640.png" title="ftps_Linux_640.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" title="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;
&lt;h2&gt;Implemented FTP commands&lt;/h2&gt;
Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;h2&gt;NUnit tests&lt;/h2&gt;
Will be posted shortly!&lt;br /&gt;
&lt;h2&gt;TODO &lt;/h2&gt;
Here&amp;#39;s the list of things that need to be implemented.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Proxy support&lt;/li&gt;
&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;
&lt;li&gt;More RFC 2228 commands&lt;/li&gt;
&lt;li&gt;IPv6 support.&lt;/li&gt;
&lt;li&gt;Internationalization&lt;/li&gt;&lt;/ul&gt;
&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;
&lt;h2&gt;vsftpd patch&lt;/h2&gt;
There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here&amp;#39;s a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://ftps.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It&amp;#39;s just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, that&amp;#39;s all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Alessandro Pilotti &lt;br /&gt;MVP / IIS&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;DownloadId=112960" alt="MVP_Horizontal_FullColor_small.png" title="MVP_Horizontal_FullColor_small.png" /&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>alexp</author><pubDate>Fri, 26 Mar 2010 22:23:15 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20100326102315P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=38</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with mandatory SSL/TLS &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// encryption during authentication and &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// optional encryption on the data channel &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, 
                           &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, 
                                                 &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | 
                           ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56275" alt="ftps_Vista_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56273" alt="ftps_Linux_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 26 Jan 2009 15:19:51 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090126031951P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=37</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with mandatory SSL/TLS &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// encryption during authentication and &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// optional encryption on the data channel &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, 
                           &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, 
                                                 &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | 
                           ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53856" alt="ftps_Vista.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56273" alt="ftps_Linux_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 26 Jan 2009 15:18:28 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090126031828P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=36</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with mandatory SSL/TLS &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// encryption during authentication and &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// optional encryption on the data channel &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, 
                           &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | 
                           ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53856" alt="ftps_Vista.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56273" alt="ftps_Linux_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 26 Jan 2009 15:16:24 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090126031624P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=35</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
     -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired 
     -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired 
     -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with mandatory SSL/TLS encryption during authentication and &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// optional encryption on the data channel (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53856" alt="ftps_Vista.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56273" alt="ftps_Linux_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 26 Jan 2009 15:13:59 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090126031359P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=34</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired 
      -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with mandatory SSL/TLS encryption during authentication and &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// optional encryption on the data channel (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53856" alt="ftps_Vista.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56273" alt="ftps_Linux_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 26 Jan 2009 15:11:54 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090126031154P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=33</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with mandatory SSL/TLS encryption during authentication and &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// optional encryption on the data channel (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53856" alt="ftps_Vista.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56273" alt="ftps_Linux_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 26 Jan 2009 15:09:42 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090126030942P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=32</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with mandatory SSL/TLS encryption during authentication and &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// optional encryption on the data channel (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                           ESSLSupportMode.CredentialsRequired | ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53856" alt="ftps_Vista.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53857" alt="ftps_Linux.jpg" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 26 Jan 2009 15:07:13 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090126030713P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=31</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with mandatory SSL/TLS encryption during authentication and &lt;/span&gt;
            &lt;span style="color:#008000;"&gt;// optional encryption on the data channel (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), 
                                 ESSLSupportMode.CredentialsRequired | ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56275" alt="ftps_Vista_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56273" alt="ftps_Linux_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56274" alt="ftps_Mac_OS_X_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 26 Jan 2009 15:05:32 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090126030532P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=30</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with mandatory SSL/TLS encryption during authentication and optional encryption on the data channel (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), ESSLSupportMode.CredentialsRequired | ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56275" alt="ftps_Vista_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56273" alt="ftps_Linux_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=56274" alt="ftps_Mac_OS_X_640.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 26 Jan 2009 15:00:13 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090126030013P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=29</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with mandatory SSL/TLS encryption during authentication and optional encryption on the data channel (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), ESSLSupportMode.CredentialsRequired | ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53856" alt="ftps_Vista.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53857" alt="ftps_Linux.jpg" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P, C support &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Mon, 12 Jan 2009 11:08:52 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090112110852A</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=28</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with mandatory SSL/TLS encryption during authentication and optional encryption on the data channel (directory lists, file transfers)&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), ESSLSupportMode.CredentialsRequired | ESSLSupportMode.DataChannelRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53856" alt="ftps_Vista.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53857" alt="ftps_Linux.jpg" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P support only &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Thu, 08 Jan 2009 21:45:14 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090108094514P</guid></item><item><title>Updated Wiki: Home</title><link>http://www.codeplex.com/ftps/Wiki/View.aspx?title=Home&amp;version=27</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
Project Description
&lt;/h1&gt; &lt;br /&gt;This projects provides a &lt;b&gt;free FTP/FTPS client and class library&lt;/b&gt; available on any platform supporting the &lt;b&gt;.Net Framework 2.0&lt;/b&gt; or &lt;b&gt;Mono 2.0&lt;/b&gt;. This currently includes: Microsoft Windows 2000 SP4/XP SP2/2003/Vista/2008, Linux, Mac OS X 10.4 and above, and, to some extent, Sun Solaris. &lt;br /&gt; &lt;br /&gt;Please see &lt;a href="http://www.mono-project.com" class="externalLink"&gt;http://www.mono-project.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for a complete list of platforms supported by Mono 2.0.&lt;br /&gt; &lt;br /&gt;Implemented RFCs:&lt;br /&gt; &lt;br /&gt;959, 2228, 2389, 2428, 2640, 3659, 4217&lt;br /&gt; &lt;br /&gt;FTPS (sometimes called FTPES or &lt;i&gt;explicit&lt;/i&gt; FTPS) is implemented as described in the RFC 4217 and RFC 2228 documents. &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; Support for the so called &lt;i&gt;implicit&lt;/i&gt; FTPS has also been added (although not standard).&lt;br /&gt; &lt;br /&gt;FTPS should not be confused with SFTP (FTP over SSH).&lt;br /&gt; &lt;br /&gt;For more information please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Note: not all the FTP commands described in the RFC documents are curently implemented (some of them are obsolete, others were not necessary for the purposes of this project). Please see &lt;a href="#Implemented%20FTP%20commands"&gt;Implemented FTP commands&lt;/a&gt; below for a detailed list of implemeted commands&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
The FTP/FTPS Client
&lt;/h2&gt; &lt;br /&gt;The aim of this FTP/FTPS client is to support the advanced features provided by most modern FTP servers, primarily, but not limited to, &lt;b&gt;encryption via SSL/TLS&lt;/b&gt; and &lt;b&gt;UTF8&lt;/b&gt;. A list of the implemented RFC standards and specific commands follows.&lt;br /&gt; &lt;br /&gt;The idea of this client was born while preparing some material for a technical speech session I was going to give at the &lt;i&gt;Italian Microsoft TechDays - WPC 2008&lt;/i&gt;, about IIS 7.0 new features, including the &lt;b&gt;Microsoft FTP for IIS 7.0&lt;/b&gt; add in and its freshly introduced support for SSL/TLS.&lt;br /&gt; &lt;br /&gt;One of the main problems with standard FTP communications, is that all the username / password communication is performed in clear text, easily eavesdropped by sniffing the network traffic. Altough FTP is one of the oldest Internet protocols still in use today, some of its features are still largely needed as they can't be easily replaced by, for example, an HTTP server.&lt;br /&gt; &lt;br /&gt;The SSL/TLS encryption feature, as stated in the RFC 4217 document &lt;a href="http://www.ietf.org/rfc/rfc4217.txt" class="externalLink"&gt;http://www.ietf.org/rfc/rfc4217.txt&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, provides a solution for this and other security related limitations. Support for SSL/TLS has been introduced in the most used FTP servers: &lt;b&gt;Microsoft FTP for IIS 7.0, vsftpd, wu-ftpd, FileZilla server&lt;/b&gt;, to name a few. Note: vsftpd FTPS support requires version 2.1.0 or a small &lt;a href="#patch%20for%20version%202.0.7"&gt;patch for version 2.0.7&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Looking for a free client to be used during my session demos, showing interoperability with other platforms, I realized that there was no single piece of software supporting all the features I needed. Furthermore, I wanted to provide a sample on how to connect to a FTP server using SSL using Microsoft .Net and the Powershell, but the standard &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; provided by the framework was not powerful enough (more on this below).  &lt;br /&gt; &lt;br /&gt;That was enough to start this project. The client provides also a wide range of options and commands via command line arguments, &lt;u&gt;making it fully functional when used in scripts, without the shortcomings of the standard FTP clients&lt;/u&gt; available on most platforms.&lt;br /&gt; &lt;br /&gt;Portability among platforms (via the .Net Framework 2.0 and Mono 2.0) and compatibility with all the relevant FTPS servers is also a mandatory goal for this project. &lt;br /&gt; &lt;br /&gt;Please see below for some &lt;a href="#Quick%20usage%20samples"&gt;Quick usage samples&lt;/a&gt; and the full &lt;a href="#Command%20line%20reference"&gt;Command line reference&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Microsoft Powershell integration
&lt;/h2&gt; &lt;br /&gt;The development of specifc CmdLets is in progress. Please stay tuned.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Portable GUI
&lt;/h2&gt; &lt;br /&gt;A free portable GUI is also planned and will be developed if there's enough feedback on the project. &lt;br /&gt; &lt;br /&gt;&lt;a name="Quick usage samples"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Quick usage samples
&lt;/h2&gt; &lt;br /&gt;Note: execute &lt;i&gt;mono ftps.exe &amp;lt;arguments&amp;gt;&lt;/i&gt; when using Mono.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Show the directory contents of a remote directory using anonymous authentication on standard FTP (without SSL/TLS):&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -ssl ClearText -l /pub
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS during authentication or clear text mode (standard FTP) if FTPS is not supported:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -l /some/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Connect to the server using SSL/TLS on the control channel, accepting invalid certificates without prompting:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl ControlChannelRequired -sslInvalidServerCertHandling Accept -l /some/path
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Download a remote file using control and data channel SSL/TLS encryption:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl DataChannelRequired -g /remote/path/somefile.txt /local/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Upload a local file with a control channel encrypted during authentication only:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -ssl CredentialsRequired -p /local/path/somefile.txt /remote/path/
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Recursively download a whole directory tree:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -r -g /remote/path/* \local\path\
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Export the server's X.509 certificate on a FTPS connection:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -expCert serverCert.cer
&lt;/pre&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implicit FTPS connection on port 21:&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;pre&gt;
ftps -h ftp.yourserver.com -U alex -port 21 -ssl Implicit -l
&lt;/pre&gt; &lt;br /&gt;&lt;a name="Command line reference"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Command line reference
&lt;/h2&gt; &lt;br /&gt;The command line reference, available by executing &lt;i&gt;ftps -?&lt;/i&gt;  or &lt;i&gt;mono ftps.exe -?&lt;/i&gt; using Mono, follows:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
Usage: ftps [options] &amp;lt;command&amp;gt; [command specific arguments]
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Commands:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-?, -help&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Shows help and usage info&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-d, -delete&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Deletes a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-expCert, -exportSslServerCert&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Exports the server's SSL/TLS X.509 certificate. The export format is managed by the &amp;quot;sslX509ExportFormat&amp;quot; option&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-f, -features&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Prints the list of features supported by the server, as returned by the FTP FEAT command&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-g, -get, -download&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Downloads the given files in the current directory. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-l, -list&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns the contents of the given directory, or the default directory if no name is provided&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-md, -mkdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Creates a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-p, -put, -upload&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads the given files or directory contents. File names may include wildcards. Operates recursively if the &amp;quot;r&amp;quot; option is specified&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pa, -putAppend&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file appending it's contents if the given remote file already exists&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-pu, -putUnique&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Uploads a file with a unique name&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rd, -rmdir&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Removes a remote directory&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-rn, -rename&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Renames a remote file&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sys, -system&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Returns a brief description of the remote system&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-cust, -custom&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Sends the given FTP command to the server. Note: only the control channel reply is returned&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;Generic options:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-h, -hostname&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Name or IP address of the remote host to connect to&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-noCopyrightInfo&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Avoids displaying the copyright information header&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-P, -password&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Password to be used in case of non anonymous connections. If omitted it will be requested before connecting. Passing this information as a command line parameter is strongly discouraged for security reasons&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-port&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection port, default is: 21 for standard FTP or explicit FTPS, 990 for implicit FTPS&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-r, -recursive&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Enable recursion to download or upload entire directory trees&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-t, -timeout&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;TCP/IP connection timeout in seconds (default 120s)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-tm, -transferMode&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Transfer mode / representation type. &amp;quot;ASCII&amp;quot; or &amp;quot;Binary&amp;quot; (default)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-U, -username&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Username used to perform the connection. If omitted an anonymous connection will be performed&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-v, -verbose&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Verbose output&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;&lt;u&gt;SSL/TLS specific options:&lt;/u&gt;&lt;/b&gt;                     &lt;br /&gt; &lt;br /&gt;&lt;b&gt;-ssl, -tls&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;SSL/TLS support. Possible values are:                                                                                  &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ClearText (Standard FTP, no SSL/TLS support)                 &lt;/li&gt;&lt;li&gt;CredentialsRequested          &lt;/li&gt;&lt;li&gt;CredentialsRequired                    &lt;/li&gt;&lt;li&gt;ControlChannelRequested                &lt;/li&gt;&lt;li&gt;ControlChannelRequired                 &lt;/li&gt;&lt;li&gt;DataChannelRequested (Default)&lt;/li&gt;&lt;li&gt;DataChannelRequired&lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequested                                                                             &lt;/li&gt;&lt;li&gt;ControlAndDataChannelsRequired (most secure)&lt;/li&gt;&lt;li&gt;All (alias for ControlAndDataChannelsRequired)&lt;/li&gt;&lt;li&gt;Implicit&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslClientCertPath&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X.509 client certificate file path&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslInvalidServerCertHandling&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Invalid X.509 server certificate handling. Valid values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Accept&lt;/li&gt;&lt;li&gt;Prompt (default)&lt;/li&gt;&lt;li&gt;Refuse&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;-sslMinCipherStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. cipher algorithm strength (e.g: 168). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinHashStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. hash algorithm strength (e.g: 160). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslMinKeyExStrength&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Min. key exchange algorithm strength (e.g: 1024). Default is 0&lt;br /&gt; &lt;br /&gt;&lt;b&gt;-sslX509ExportFormat&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;X509 certificate export format. Not all formats are available on all platforms. Supported values are: &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Cert (default)&lt;/li&gt;&lt;li&gt;Pkcs12 &lt;/li&gt;&lt;li&gt;SerializedCert&lt;/li&gt;
&lt;/ul&gt;&lt;a name="FTP/FTPS class library"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
The FTP/FTPS class library
&lt;/h2&gt; &lt;br /&gt;The &lt;i&gt;System.Net.FTPWebRequest&lt;/i&gt; class provided by the .Net Framework, is perfect for simple tasks (e.g. downloading or uploading a file or getting a directory list) and supports also SSL via the &lt;i&gt;EnableSsl&lt;/i&gt; property See: &lt;a href="http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx" class="externalLink"&gt;http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; . So why a new class for that?  &lt;br /&gt; &lt;br /&gt;The point is that SSL support in FTP is more that an on/off switch (as in HTTP/HTTPS). FTP requires two separate connections: one for the commands (the &lt;u&gt;control&lt;/u&gt; connection) and one for the data (the &lt;u&gt;data&lt;/u&gt; connection), for downloads, uploads and directory listings.&lt;br /&gt;&lt;i&gt;FTPWebRequest.EnableSsl&lt;/i&gt; simply forces the use of SSL on both of them. &lt;i&gt;The problem is that this is not always suitable&lt;/i&gt;. &lt;br /&gt; &lt;br /&gt;FTP connections are tipically a pain for firewalls, because the control connection uses a standard TCP port (21), but data connections (in so called &lt;i&gt;passive&lt;/i&gt; mode), tipically listen on a random port, communicated to the client on the control channel. Well, if the connection is not encrypted, as in standard FTP, firewalls are able to do some packet inspection, get the port number sent to the client and allow the connection from that client to the server. To cut a long story short, encrypting the control channel means that firewalls will not be able to do packet inspections and, you guessed it, this is where the problems begin. Please see &lt;a href="http://en.wikipedia.org/wiki/FTPS" class="externalLink"&gt;http://en.wikipedia.org/wiki/FTPS&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for more on the subject.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;There's a partial solution to this problem:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;Encrypting the control channel during the credentials exchange (USER/PASS commands) and reverting to clear text after that. This is of course far below the goals of the SSL/TLS support, but it's enough for a very large number of needs and is supported by all the main FTPS servers. &lt;br /&gt; &lt;br /&gt;This class library provides a number of SSL/TLS related options to deal with this and other issues.&lt;br /&gt; &lt;br /&gt;Aside that, the class library provides support for a large number of standard FTP commands and some very useful features:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Tracking of the download status via delegate based callbacks (useful to display the download/upload progress)&lt;/li&gt;&lt;li&gt;Recursive directory trees downloads and uploads&lt;/li&gt;&lt;li&gt;Support for UTF8 in commands and directory listings (by explicitly setting &lt;i&gt;OPTS UTF8 ON&lt;/i&gt; if available in the features returned by the &lt;i&gt;FEAT&lt;/i&gt; command)&lt;/li&gt;&lt;li&gt;IPV6 support (planned)&lt;/li&gt;&lt;li&gt;Multi platform (Microsoft Windows, Linux, Mac OS X, did I already said that?) ;-)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;The full MSDN style documentation will be released shortly.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;In order to use the FTPS class library, add the &lt;b&gt;&lt;i&gt;AlexPilotti.FTPS.Client.dll&lt;/i&gt;&lt;/b&gt; assembly to your project References.&lt;br /&gt;The assembly is available along with the FTPS client on the &lt;u&gt;Releases&lt;/u&gt; page.&lt;br /&gt; &lt;br /&gt;The class library is distributed as free software and can be freely used in your projects, under the terms of the LGPL license.&lt;br /&gt; &lt;br /&gt;Simple class library usage sample in C# (any other CLR compliant language is also supported, e.g.: VB.Net, C++/CLI, etc.):&lt;br /&gt; &lt;br /&gt;&lt;div style="color:#000000;background-color:#FFFFFF;"&gt;&lt;pre&gt;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Client;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; AlexPilotti.FTPS.Common;
&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; System.Net;
&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt; Test
{
    &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;void&lt;/span&gt; Main()
    {
        &lt;span style="color:#0000FF;"&gt;using&lt;/span&gt; (FTPSClient client = &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; FTPSClient())
        {
            &lt;span style="color:#008000;"&gt;// Connect to the server, with requested but not mandatory SSL/TLS support during authentication&lt;/span&gt;
            client.Connect(&lt;span style="color:#A31515;"&gt;&amp;quot;ftp.yourserver.com&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000FF;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#A31515;"&gt;&amp;quot;yourUsername&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;yourPassword&amp;quot;&lt;/span&gt;), ESSLSupportMode.CredentialsRequested);
			
            &lt;span style="color:#008000;"&gt;// Download a file&lt;/span&gt;
            client.GetFile(&lt;span style="color:#A31515;"&gt;&amp;quot;/path/to/remotefile.jpg&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;c:\\local\\path\\&amp;quot;&lt;/span&gt;);
        }
    }
}
&lt;/pre&gt;&lt;/div&gt; &lt;br /&gt;&lt;h2&gt;
Snapshots
&lt;/h2&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Windows Vista:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;i&gt;This screenshots shows the transfer status available during downloads / uploads.&lt;/i&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53856" alt="ftps_Vista.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Linux:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53857" alt="ftps_Linux.jpg" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;AlexFTPS on Mac OS X:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53854" alt="ftps_Mac_OS_X.png" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;a name="Implemented FTP commands"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
Implemented FTP commands
&lt;/h2&gt; &lt;br /&gt;Note: RFC 959 is listed also for commands introduced in previous documents. &lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Command name &lt;/th&gt;&lt;th&gt; Notes &lt;/th&gt;&lt;th&gt; RFC &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; APPE &lt;/td&gt;&lt;td&gt;  &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; AUTH &lt;/td&gt;&lt;td&gt; TLS supported &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CCC &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CDUP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CLNT &lt;/td&gt;&lt;td&gt; Required by some servers &lt;/td&gt;&lt;td&gt; ? &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; CWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; DELE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; FEAT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LANG &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2640 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; LIST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MDTM &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; MKD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NLST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; NOOP &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; OPTS &lt;/td&gt;&lt;td&gt; Mainly UTF8 support &lt;/td&gt;&lt;td&gt; 2389 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASS &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PASV &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PROT &lt;/td&gt;&lt;td&gt; PROT P support only &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PSBZ &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 2228 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; PWD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; QUIT &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RETR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RMD &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNFR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; RNTO &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SIZE &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 3659 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOR &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; STOU &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; SYST &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; TYPE &lt;/td&gt;&lt;td&gt; ASCII and Image (Binary) representation types supported &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; USER &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; 959 &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt; &lt;br /&gt;&lt;h2&gt;
NUnit tests
&lt;/h2&gt; &lt;br /&gt;Will be posted shortly!&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
TODO 
&lt;/h2&gt; &lt;br /&gt;Here's the list of things that need to be implemented.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Proxy support&lt;/li&gt;&lt;li&gt;PORT (active connections). Currently only passive connections are supported.&lt;/li&gt;&lt;li&gt;More RFC 2228 commands&lt;/li&gt;&lt;li&gt;IPv6 support.&lt;/li&gt;&lt;li&gt;Internationalization&lt;/li&gt;
&lt;/ul&gt;&lt;a name="patch for version 2.0.7"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
vsftpd patch
&lt;/h2&gt; &lt;br /&gt;There is a small bug in vsftpd 2.0.7 related to OpenSSL contexts, confirmed by the author and solved in version 2.1.0 which prevents full SSL/TLS compatibility.&lt;br /&gt;Here's a workaround for version 2.0.7. Just apply this patch to &lt;i&gt;ssl.c&lt;/i&gt;: &lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=ftps&amp;amp;DownloadId=53986';"&gt;vsftpd-2.0.7-ssl-diff.txt&lt;/a&gt; It's just 3 lines of code! :-)&lt;br /&gt;Please note: this is an unofficial patch.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Well, that's all by now. Please provide your comments, feature requests, bug reports, etc. on the Discussion page.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Alessandro Pilotti&lt;br /&gt;
&lt;/div&gt;</description><author>alexp</author><pubDate>Thu, 08 Jan 2009 19:15:03 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090108071503P</guid></item></channel></rss>