Setting ssl_prefer_server_ciphers directive in nginx config

Solution 1:

When ssl_prefer_server_ciphers is set to on, the web server owner can control which ciphers are available.

The reason why this control was preferred is old and insecure ciphers that were available in SSL, and TLS v1.0 and TLS v1.1.

When the server supports old TLS versions and ssl_prefer_server_ciphers is off, an adversary can interfere with the handshake and force the connection to use weak ciphers, therefore allowing decrypting of the connection.

The weak ciphersuites have been deprecated in TLS v1.2 and v1.3, which removes the need for server to specify preferred ciphers.

The preferred setting in modern setups is ssl_prefer_server_ciphers off, because then the client device can choose his preferred encryption method based on the hardware capabilities of the client device.

For example, if the mobile device does not have AES acceleration, it can choose to use ChaCha cipher for better performance.

Solution 2:

Ok, so there are three categories for choosing this parameter on or off.

**Modern** : Services with clients that support TLS 1.3 and don't need backward compatibility
**Intermediate** : General-purpose servers with a variety of clients, recommended for almost all systems
**Old** : Compatible with a number of very old clients, and should be used only as a last resort

Only situation when you need to put off this parameter is modern configuration where you don't need any backward compatibility, in such cases client will not be able to connect with old ssl/tls except tlsv1.3.