HomeTopicsFTPS In Depth › Hardening

Hardening FTPS: Protocol Versions, Ciphers, and Configuration Pitfalls

Enabling FTPS is not the same as securing it. Server software ships with defaults chosen for one purpose — letting the widest possible spread of clients connect — and that means old protocol versions kept alive, optional encryption on the data channel, and escape hatches like plaintext fallback left open "just in case." A server in that state shows a padlock to auditors while quietly permitting sessions that deserve no padlock at all.

This article is the hardening pass: the settings that close the gap between "FTPS enabled" and "FTPS trustworthy." You will set a protocol-version floor with the reasoning behind it, adopt a cipher policy without needing a cryptography degree, shut every downgrade path a client or attacker could take, verify the result from the outside like an attacker would, and leave with a checklist you can run against any server. It is part of our FTPS In Depth series and assumes the mechanics covered in how TLS wraps FTPAUTH TLS, PROT P, session reuse, and CCC all return here as policy decisions.

What You Are Actually Defending Against

Hardening makes more sense when every setting maps to an attack. For an FTPS service, the realistic list is short:

  • Credential sniffing. An eavesdropper on any network segment between client and server reads passwords from unencrypted logins. This is the attack that killed plain FTP, and it still works against any FTPS server that permits unencrypted logins.
  • Downgrade. An attacker — or just a lazy client — steers the session to a weaker state than you intended: plaintext login, unencrypted data channel, or an obsolete protocol version with known breaks.
  • Data-connection hijack. A stranger connects to your open passive port and receives or supplies a file. The defense is TLS session reuse, covered below.
  • Impersonation. A machine-in-the-middle presents itself as your server. Certificates and clients that verify them are the defense — the subject of certificates for FTPS.
  • Account attacks. Password guessing and stolen credentials work over beautifully encrypted channels. TLS does nothing here; account policy does.

Everything below serves one of those five. If a setting on your server serves none of them, it is compatibility, not security — worth having, but never at the price of one of these.

Protocol Versions: Set the Floor

TLS has a version history, and the versions are not equal. The family began as SSL (Secure Sockets Layer), whose surviving members are thoroughly broken; it was renamed TLS at standardization, and each subsequent version repaired weaknesses in the last. The practical scorecard:

Version Status Your policy
SSL 2.0 / SSL 3.0 Broken by well-documented, practical attacks Disabled, no exceptions
TLS 1.0 / TLS 1.1 Formally deprecated; weak constructions, industry-wide retirement Disabled; exception only as a documented, temporary partner accommodation
TLS 1.2 Solid when configured with modern ciphers; universally supported Your minimum — the floor
TLS 1.3 Current best: fewer options to get wrong, faster handshake, forward secrecy always on Enabled alongside 1.2 wherever your server supports it

The reasoning behind "floor at 1.2" is worth internalizing rather than memorizing. The old versions are not disabled because they are old; they are disabled because attacks against their specific constructions are published, practical, and in some cases automated. Compliance regimes that touch payment or personal data have followed the same evidence and require the 1.2 floor. And the floor matters more than the ceiling: an attacker cannot exploit TLS 1.0 on a server that refuses to speak it, no matter what the client asks for. Version negotiation always settles on the best mutually supported version, so offering 1.2 and 1.3 lets every modern client do the right thing automatically.

Why not go further and require TLS 1.3 only? Because the floor is where the security lives, and the ceiling is where compatibility lives. TLS 1.2 with modern ciphers has no practical break; what a 1.3-only policy buys you is mostly elegance, and what it costs you is every partner whose client library has not caught up. Set the floor for safety, keep 1.2 and 1.3 both enabled for reach, and revisit once your logs show 1.2 negotiations have dwindled to nothing.

Cipher Policy Without a Cryptography Degree

Within a TLS version, the two sides also negotiate a cipher suite — the specific bundle of algorithms used for key agreement, encryption, and integrity. Server defaults often include ancient suites for compatibility, and this is where hand-wringing usually starts. It should not; four rules of thumb cover it:

  1. Prefer key exchanges with forward secrecy — the ones whose names contain ECDHE or DHE. Forward secrecy means each session gets throwaway keys, so an attacker who records your traffic today and steals the server's private key later still cannot decrypt the recordings. TLS 1.3 provides this always; on 1.2 you choose it by preferring ECDHE suites.
  2. Prefer modern authenticated encryption — suites containing AES-GCM or CHACHA20-POLY1305, which encrypt and integrity-protect in one verified construction.
  3. Reject the museum pieces outright: anything named NULL (no encryption at all), EXPORT (deliberately weakened), RC4, DES/3DES, MD5, or "anonymous" suites with no certificate. All have published breaks or fatal weaknesses.
  4. Use your server's curated preset when it offers one. A maintained "modern" or "high security" cipher selection beats a hand-typed list that nobody revisits. Hand-tuning is for the day a scanner flags something specific.

One reassurance: TLS 1.3 did the housecleaning in the standard itself — its cipher list is short and entirely modern, with the junk structurally impossible. The more of your traffic lands on 1.3, the less cipher policy you have to think about.

Close Every Downgrade Path

Version and cipher settings defend the TLS layer. The classic FTPS failures, though, happen a layer up, where the protocol offers polite ways to avoid TLS entirely. This is the heart of the hardening pass — four switches, each closing a real hole:

  1. Require TLS before login. An explicit-mode listener on port 21 speaks plain FTP until the client sends AUTH TLS — that is its design, as covered at the start of this series. The hazard is a server that will also accept USER and PASS without the upgrade: one mis-configured client, and real credentials cross the network in the clear. Set the policy that refuses authentication until the channel is encrypted. This single setting is the difference between "offers FTPS" and "requires FTPS."
  2. Require PROT P for data. The protection level defaults to clear, so a session can log in encrypted and still transfer every file in plaintext. Configure the server to refuse listings and transfers until the session has set protection level P. The mechanics are in how TLS wraps FTP.
  3. Refuse CCC. The clear-command-channel command strips encryption off the control connection after login, exposing commands and filenames and making the session tamperable — a firewall workaround whose price is too high. The clean alternative (a pinned passive range with static rules) is the subject of FTPS through firewalls and NAT.
  4. Sweep the forgotten listeners. Hardening the explicit listener while an implicit listener on port 990 runs with year-old defaults — or while plain FTP remains enabled for accounts that no longer need it — moves the problem, not the risk. Inventory every enabled protocol and port; disable what nothing uses. If plain FTP must survive for a legacy device, isolate it to specific accounts and source addresses and give it an end date.

Remember: an attacker does not fight your strongest configuration — they look for the weakest one you left enabled. A server with perfect TLS 1.3 settings and one account still permitted to log in over plain FTP is, for that account, a plain FTP server. Hardening is complete only when every path to a session meets the same floor.

Certificates, Keys, and Reuse: The Supporting Cast

Three more settings belong in the pass, each with a fuller treatment elsewhere in this series:

  • Certificate strength. A modern key (RSA at 2048 bits or stronger, or an elliptic-curve key) and a SHA-256-family signature; anything weaker draws client refusals and scanner findings. Protect the private key file like a password vault, and calendar the renewal — expiry is the one outage you can schedule away. Details in certificates for FTPS.
  • Require TLS session reuse on data connections. This is the control that stops strangers from hijacking transfers on your open passive range: a data connection must cryptographically prove it belongs to the logged-in control session before the server will use it. Leave it on; treat clients that cannot comply as upgrade candidates first and exception requests second.
  • Account and network hygiene. TLS cannot help with guessed passwords or over-broad access. Enforce strong credentials and lockout on repeated failures, confine each account to the directories it needs, keep activity logging on so every login and transfer is attributable, and — where partners connect from fixed addresses — restrict the firewall rules to those sources. On a Windows deployment, Sysax Multi Server keeps this cluster — encryption, user authentication, activity logging, and the passive range — in one configuration surface, which makes the checklist below an afternoon's work rather than a project.

Verify From the Outside

Configuration screens tell you what you asked for; only an outside probe tells you what the server actually does. The openssl command-line tool covers the essential checks. Run these from a machine outside your network, substituting your hostname:

# 1. Confirm the floor holds: this MUST FAIL if TLS 1.0 is disabled
openssl s_client -connect ftp.example.com:21 -starttls ftp -tls1

# 2. Confirm modern versions work: these should succeed
openssl s_client -connect ftp.example.com:21 -starttls ftp -tls1_2
openssl s_client -connect ftp.example.com:21 -starttls ftp -tls1_3

# 3. Read what was negotiated (look for Protocol and Cipher lines)
openssl s_client -connect ftp.example.com:21 -starttls ftp 2>/dev/null \
  | grep -E "Protocol|Cipher"

Then test the policy layer with any FTP client and thirty seconds: connect without enabling encryption and attempt to log in — the server should refuse before a password is ever sent. Connect with encryption but data protection off — listings should be refused until PROT P. If your client can attempt CCC, that should be refused too. For a deeper cipher-by-cipher enumeration, dedicated TLS scanning tools exist and are worth running annually and after any change; treat every finding as either a fix or a written, dated exception.

Probe every listener you actually run, not just the obvious one. If an implicit-mode service is enabled on port 990, repeat the version checks against it with the -starttls ftp option removed — implicit mode speaks TLS from the first byte, so no upgrade command is involved in the probe. Listeners drift apart over time precisely because one of them stops being tested.

Two cautions on interpreting results. A version probe that fails with a connection error proves nothing if the network blocked you — confirm the baseline connection works first. And some openssl builds no longer include the legacy protocol options at all; a failure of command 1 on such a build tells you about your test machine, not your server, so read the error text before celebrating.

The Hardening Checklist

The whole article in one copyable block. Anything unchecked is either a task or a documented exception with an owner and an end date.

FTPS HARDENING CHECKLIST

TLS layer
 [ ] SSL 2.0/3.0 and TLS 1.0/1.1 disabled
 [ ] TLS 1.2 minimum; TLS 1.3 enabled if supported
 [ ] Cipher policy: ECDHE key exchange, AES-GCM/ChaCha20;
     no NULL, EXPORT, RC4, DES/3DES, MD5, anonymous suites

Protocol policy
 [ ] TLS required before login (no plaintext USER/PASS accepted)
 [ ] PROT P required before any listing or transfer
 [ ] CCC refused
 [ ] TLS session reuse required on data connections
 [ ] Unused listeners disabled (plain FTP, implicit 990 if unoffered)
 [ ] Anonymous access disabled

Certificate
 [ ] Modern key and signature (RSA 2048+/ECDSA, SHA-256 family)
 [ ] Full chain installed (leaf + intermediates); private key secured
 [ ] Expiry monitored with advance warning

Accounts and network
 [ ] Strong passwords enforced; lockout on repeated failures
 [ ] Accounts confined to needed directories; stale accounts removed
 [ ] Activity logging on and retained
 [ ] Passive range pinned and matched by firewall rules
 [ ] Source-IP allowlists for fixed partners

Verification
 [ ] Outside probe: old versions refused, 1.2/1.3 accepted
 [ ] Outside probe: plaintext login refused; PROT P enforced
 [ ] Rerun after every configuration change; rescan annually

Don't Harden Yourself Into an Outage

Every tightening excludes somebody, and the somebodies are usually partners with old client software. Version floors are the most common casualty: raise the minimum to 1.2 and a partner's decade-old script fails its handshake that night. The professional pattern is boring and works: announce, stage, watch. Tell partners the target configuration and date; apply changes to a test listener or during a maintenance window; then watch the server log for handshake failures and note who fails, because those are your exception conversations. The client compatibility matrix maps which client categories struggle with which requirement — reuse, versions, implicit mode — and includes the partner-facing connection document that prevents most of the surprises. Scheduled transfers deserve the same courtesy in reverse: if your own organization runs unattended FTPS jobs through a tool like Sysax FTP Automation, retest those job profiles against the hardened server before the cutover, not after the first 2 a.m. failure.

One thing you should not do is soften a security floor permanently for one laggard. Exceptions get a scope (one account, one source address), an owner, and an end date — otherwise the exception quietly becomes the configuration.

The Version to Tell a Colleague

Hardening FTPS is five moves. Floor the protocol at TLS 1.2 with 1.3 enabled, because the older versions have published, practical breaks. Take a modern cipher preset — forward-secret key exchange, authenticated encryption — and reject the museum pieces. Close the downgrade paths: TLS required before login, PROT P required for data, CCC refused, forgotten listeners disabled. Keep the certificate strong and renewed, require session reuse, and mind accounts and logs, because TLS does not stop password guessing. Then prove it all from outside with openssl, keep the checklist with your runbooks, and stage every change so hardening never turns into an outage.

Related in this series: how TLS wraps FTP explains the machinery behind the policy switches, certificates for FTPS covers the trust layer, and FTPS through firewalls and NAT handles the network side of a hardened deployment.

Frequently Asked Questions

What minimum TLS version should my FTPS server require?
TLS 1.2, with TLS 1.3 enabled alongside it where your server supports it. The SSL versions and TLS 1.0/1.1 have published practical attacks and are formally deprecated, and common compliance regimes require the 1.2 floor. Negotiation automatically gives each client the best version both sides support.
Will raising the TLS floor break my partners' connections?
It can — typically partners running very old client software or long-frozen scripts. Announce the change with a date, watch your logs for handshake failures to identify who is affected, and handle stragglers as scoped, time-limited exceptions rather than lowering the floor for everyone.
Do I need to hand-pick cipher suites?
Usually not. Choose your server's modern or high-security preset, which favors forward-secret key exchange (ECDHE) and authenticated encryption (AES-GCM or ChaCha20) while excluding broken algorithms. Hand-tuning is only needed when a scanner flags a specific suite your preset still allows.
How do I check my FTPS server's TLS configuration from outside?
Use openssl s_client with -starttls ftp against port 21: force old versions and confirm they fail, force TLS 1.2/1.3 and confirm they succeed, and read the negotiated protocol and cipher from the output. Then verify policy with a client: plaintext login and unprotected transfers should both be refused.
Is hardened FTPS as secure as SFTP?
Cryptographically both rest on well-studied foundations, and a hardened FTPS deployment protects credentials and data properly. The practical differences are operational: FTPS has more downgrade paths to close and a harder firewall story, while SFTP concentrates everything on one port. Our SFTP vs FTPS vs FTP series compares them fully.
Should I disable plain FTP completely on an FTPS server?
If nothing depends on it, yes — an enabled plaintext path is the easiest downgrade an attacker or misconfigured client can take. Where a legacy device still requires plain FTP, confine it to specific accounts and source addresses, log it, and set an end date for its retirement.

From the Sysax team: we build secure file transfer software for Windows — Sysax Multi Server, an FTP, FTPS, SFTP, and HTTPS server, and Sysax FTP Automation for scheduled, scripted transfers. Free trials are on the download page.