Connecting to FTPS (FTP over SSL) with FluentFTP
As you seem to be connecting to the default port 21 (no explicit port specified anywhere), you need to use the "Explicit" mode:
conn.EncryptionMode = FtpEncryptionMode.Explicit;
If the server uses a self-signed certificate, you may need to verify it programmatically. Do not blindly accept any certificate, as the answer by @Ivan does. That's a security flaw. Validate the specific certificate, e.g. by checking its fingerprint.
See FtpWebRequest "The remote certificate is invalid according to the validation procedure".
Upload file to implicit FTPS server in C# with TLS session reuse
You can use WinSCP .NET assembly.
It supports implicit TLS (port 990). And uses OpenSSL TLS implementation (not .NET Framework), so it should not have the problem that FluentFTP has. It definitely works for me against FileZilla FTP server, even with session resumption requirement turned on.
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = "ftp.example.com",
UserName = "username",
Password = "password",
FtpSecure = FtpSecure.Implicit,
TlsHostCertificateFingerprint = "xx:xx:xx:...",
};
using (Session session = new Session())
{
session.Open(sessionOptions);
session.PutFiles(localPath, remotePath).Check();
}
(I'm the author of WinSCP)
For more references about the problem, see also Can connect to FTP using FileZilla or WinSCP, but not with FtpWebRequest or FluentFTP.
sending file using ftp over ssl in C#, with filezilla server
If your certificate is self-signed, you need to tell ServicePointManager
to accept it.
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
Does .NET FtpWebRequest Support both Implicit (FTPS) and explicit (FTPES)?
as far as I know the current (.NET 2.0 and 3.5) version of FtpWebRequest supports Explicit SSL only.
Actually, .NET 2.0 does not currently
support implicit SSL, only explicit.
We will consider adding this for a
future release.JonCole - MSFTModerator at MSDN forum post
If you need to use both Implict and Explicit TLS/SSL you have to try one of third-party FTP/SSL components. Following code uses our Rebex FTP/SSL and is taken from the tutorial page.
Explicit TLS/SSL
Client connects to FTP server in a usual non-protected way, usually to port 21 was assigned to FTP protocol. When it is desired to protect the connection using SSL, an SSL negotiation is initialized, control connection is secured and all following communication is being protected.
// Create an instance of the Ftp class.
Ftp ftp = new Ftp();
// Connect securely using explicit SSL.
// Use the third argument to specify additional SSL parameters.
ftp.Connect(hostname, 21, null, FtpSecurity.Explicit);
// Connection is protected now, we can log in safely.
ftp.Login(username, password);
Explicit protection means that it is possible to secure the connection at any moment. If you don't know whether you will need the protection on not at the connection time, you might want to connect using the ordinary unencrypted FTP protocol and secure the connection later.
Ftp ftp = new Ftp();
// Connect to the server with no protection.
ftp.Connect(hostname, 21);
// Upgrade connection to SSL.
// This method also accepts an argument to specify SSL parameters.
ftp.Secure();
// Connection is protected now, we can log in safely.
ftp.Login(username, password);
Implicit SSL protection of the FTP session
FTPS protocol was originally assigned a separate port by the IANA. Upon connection to this port, an SSL negotiation starts immediately and the control connection is secured. All data connections are also secured implicitly in the same way. This is similar to the approach used by HTTPS.
This approach is not favored by the IETF and is deprecated. It is supported by Rebex FTP/SSL for interoperability with older servers, but it is strongly recommended to use the explicit protection instead whenever possible.
Ftp ftp = new Ftp();
// Connect securely using implicit SSL.
// Use the third argument to specify additional SSL parameters.
ftp.Connect(hostname, 990, null, FtpSecurity.Implicit);
// Connection is protected now, we can log in safely.
ftp.Login(username, password);
You may download the component at rebex.net/ftp-ssl.net/
C# FTP Explicit SSL Request Never Logs In
The answer came to me about 2 minutes after I posted this question. I'll leave it around in case anyone else has these struggles (I sometimes like to entertain the idea that someone shares my problems, however unlikely that may be).
In the "FTP over TLS settings" dialog on the FileZilla server I had configured a port to listen for implicit FTP or TLS (default is 990). This was the port I used in the FZ Client FTPS connection. I was also trying to use this port from C#, which doesn't work, because the connection is explicit FTPS. I had to use the port specified in the General Settings as the listen port (default 21).
I had actually tried this before posting the question, but forgot to apply the router's configuration so it didn't work, "Der".
Related Topics
Embedding One Dll Inside Another as an Embedded Resource and Then Calling It from My Code
Download Image from the Site in .Net/C#
How to Call .Net Methods from Excel Vba
Wpf: Binding a Contextmenu to an Mvvm Command
Why Is the 'This' Keyword Required to Call an Extension Method from Within the Extended Class
Prevent Using Dispatcher.Invoke in Wpf Code
How to Pass an Object from Form1 to Form2 and Back to Form1
Retrieve Current Url from C# Windows Forms Application
How to Implement a Never Ending Task. (Timers VS Task)
Best Way in .Net to Manage Queue of Tasks on a Separate (Single) Thread
Capture Screenshot Including Semitransparent Windows in .Net
Log4Net: Programmatically Specify Multiple Loggers (With Multiple File Appenders)
The ':' Character, Hexadecimal Value 0X3A, Cannot Be Included in a Name
Mail Sending with Network Credential as True in Windows Form Not Working