Deprecated TLS or SSL version enabled by configuration

ID

weak_crypto_protocol_in_config

Severity

high

Remediation Complexity

trivial

Remediation Risk

medium

Remediation Effort

low

Family

Cryptography

Tags

ASVS50:v12.1.1, CWE:327, CWE:757, configuration, cryptography, network, non-reachable, security

Description

The protocol versions a service accepts are set by configuration, not by code: ssl_protocols in nginx, SSLProtocol in Apache httpd, ssl-default-bind-options in HAProxy, server.ssl.enabled-protocols in Spring Boot, SslProtocols in a Kestrel endpoint, NSMinimumTLSVersion in an iOS property list, ssl_min_protocol_version in PostgreSQL, tls-protocols in Redis.

This detector reports TLS 1.0 and TLS 1.1, deprecated by RFC 8996, and SSL 2.0 and 3.0, which are broken.

A version the setting disables is never reported. Each product spells a removal differently — Apache writes -SSLv3, OpenSSL !SSLv3, HAProxy no-sslv3 — and all three are read as exclusions, so the hardened configuration produces no finding for the versions it turns off.

Security

An enabled legacy version is negotiable. TLS 1.0 and 1.1 authenticate the handshake with MD5 and SHA-1 and have no support for the AEAD suites; SSL 3.0 falls to POODLE; SSL 2.0 has no handshake integrity at all, so a downgrade cannot even be detected. A client that offers nothing better — or an attacker positioned to strip the better options — gets the weak protocol, and every session negotiated that way is decryptable or tamperable by the corresponding attack.

PCI DSS has forbidden TLS 1.0 since 2018 and every major browser has removed 1.0 and 1.1, so the practical effect of leaving them enabled is rarely compatibility: it is an attack surface kept open for clients that no longer exist.

Mitigation / Fix

Set the floor to TLS 1.2 and enumerate only the versions you intend to serve:

# nginx
ssl_protocols TLSv1.2 TLSv1.3;
# Apache httpd — start from nothing and add back, rather than subtracting from 'all'
SSLProtocol -all +TLSv1.2 +TLSv1.3
# Spring Boot
server:
  ssl:
    enabled-protocols: [ TLSv1.2, TLSv1.3 ]

Prefer an allow-list (+TLSv1.2 +TLSv1.3) over a deny-list (all -SSLv3): the allow-list stays correct when a future version is added to the library’s all, and states the intent a reviewer can check.

Before removing TLS 1.0, check the client population in the access logs for the negotiated version — a payment terminal or an embedded device fleet is the usual reason the setting is still there.