Bird
Raised Fist0
Nginxdevops~20 mins

SSL protocol and cipher configuration in Nginx - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
SSL Mastery Badge
Get all challenges correct to earn this badge!
Test your skills under time pressure!
💻 Command Output
intermediate
1:30remaining
Check enabled SSL protocols in Nginx
You run the command nginx -T | grep ssl_protocols on your server. What output do you expect if only TLSv1.2 and TLSv1.3 are enabled?
Nginx
nginx -T | grep ssl_protocols
Assl_protocols TLSv1.1 TLSv1.2;
Bssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
Cssl_protocols SSLv3 TLSv1.2 TLSv1.3;
Dssl_protocols TLSv1.2 TLSv1.3;
Attempts:
2 left
💡 Hint
Only modern TLS versions TLSv1.2 and TLSv1.3 should be enabled for security.
❓ Configuration
intermediate
1:30remaining
Configure strong cipher suites in Nginx
Which ssl_ciphers configuration line enables only strong ciphers recommended for modern browsers?
Assl_ciphers NULL:!aNULL:!eNULL;
Bssl_ciphers ALL;
Cssl_ciphers HIGH:!aNULL:!MD5;
Dssl_ciphers LOW:MEDIUM:HIGH;
Attempts:
2 left
💡 Hint
Strong ciphers exclude anonymous and weak algorithms.
❓ Troubleshoot
advanced
2:00remaining
Troubleshoot SSL handshake failure due to protocol mismatch
A client reports SSL handshake failure connecting to your Nginx server. Your config has ssl_protocols TLSv1.3; only. The client supports TLSv1.2 but not TLSv1.3. What is the cause?
ACipher suites are mismatched causing handshake failure.
BClient and server have no common SSL protocol version enabled.
CNginx is missing the SSL certificate configuration.
DThe server is using deprecated SSLv3 protocol.
Attempts:
2 left
💡 Hint
Handshake requires at least one common protocol version.
✅ Best Practice
advanced
2:00remaining
Select the best SSL configuration for security and compatibility
Which Nginx SSL configuration balances strong security and broad client compatibility?
Assl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on;
Bssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers ALL; ssl_prefer_server_ciphers off;
Cssl_protocols TLSv1.3; ssl_ciphers LOW:MEDIUM; ssl_prefer_server_ciphers on;
Dssl_protocols SSLv3 TLSv1.2; ssl_ciphers NULL; ssl_prefer_server_ciphers off;
Attempts:
2 left
💡 Hint
Avoid old protocols and weak ciphers but keep TLSv1.2 for compatibility.
🧠 Conceptual
expert
2:30remaining
Impact of disabling TLSv1.2 in Nginx SSL config
What is the most likely impact if you remove TLSv1.2 from ssl_protocols and keep only TLSv1.3 in Nginx?
AClients that do not support TLSv1.3 will fail to connect, reducing compatibility.
BAll clients will connect faster because TLSv1.3 is more efficient.
CThe server will accept insecure SSLv3 connections as fallback.
DCipher suites will automatically downgrade to weaker options.
Attempts:
2 left
💡 Hint
Consider client support for TLS versions.

Practice

(1/5)
1. What is the purpose of the ssl_protocols directive in an nginx configuration?
easy
A. To specify which SSL/TLS protocol versions are allowed for secure connections
B. To define the encryption algorithms used for data compression
C. To set the maximum size of SSL certificates
D. To enable HTTP/2 support over SSL

Solution

  1. Step 1: Understand the role of ssl_protocols

    The ssl_protocols directive controls which SSL/TLS versions nginx will accept for secure connections.
  2. Step 2: Compare options with this role

    Only To specify which SSL/TLS protocol versions are allowed for secure connections correctly describes this purpose; others mention unrelated features like compression or HTTP/2.
  3. Final Answer:

    To specify which SSL/TLS protocol versions are allowed for secure connections -> Option A
  4. Quick Check:

    ssl_protocols = Allowed SSL/TLS versions [OK]
Hint: ssl_protocols controls TLS versions allowed [OK]
Common Mistakes:
  • Confusing ssl_protocols with cipher settings
  • Thinking ssl_protocols sets certificate size
  • Assuming ssl_protocols enables HTTP/2
2. Which of the following is the correct syntax to enable only TLSv1.2 and TLSv1.3 in nginx?
easy
A. ssl_protocols tlsv12 tlsv13;
B. ssl_protocols tls1.2 tls1.3;
C. ssl_protocols TLSv1.2 TLSv1.3;
D. ssl_protocols TLS1_2 TLS1_3;

Solution

  1. Step 1: Recall correct nginx ssl_protocols syntax

    The correct syntax uses capitalized TLS versions separated by spaces, ending with a semicolon, e.g., ssl_protocols TLSv1.2 TLSv1.3;.
  2. Step 2: Check each option's format

    ssl_protocols TLSv1.2 TLSv1.3; matches the correct syntax exactly. Options A, B, and C use incorrect casing or underscores, which nginx does not accept.
  3. Final Answer:

    ssl_protocols TLSv1.2 TLSv1.3; -> Option C
  4. Quick Check:

    Correct syntax = ssl_protocols TLSv1.2 TLSv1.3; [OK]
Hint: Use exact case: TLSv1.2 TLSv1.3 with spaces [OK]
Common Mistakes:
  • Using lowercase letters for TLS versions
  • Replacing dots with underscores
  • Missing semicolon at the end
3. Given this nginx snippet:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

What effect does ssl_prefer_server_ciphers on; have during SSL handshake?
medium
A. Client chooses the cipher from its list ignoring server preference
B. SSL handshake fails if client and server ciphers differ
C. Cipher selection is random between client and server lists
D. Server forces selection of its preferred cipher from the client's list

Solution

  1. Step 1: Understand ssl_prefer_server_ciphers directive

    When set to on, nginx forces the server's cipher preference to override the client's during SSL handshake.
  2. Step 2: Analyze options

    Server forces selection of its preferred cipher from the client's list correctly states the server enforces its cipher choice from the client's offered list. Client chooses the cipher from its list ignoring server preference is the opposite. Cipher selection is random between client and server lists is incorrect as selection is not random. SSL handshake fails if client and server ciphers differ is false; handshake does not fail just because of differing preferences.
  3. Final Answer:

    Server forces selection of its preferred cipher from the client's list -> Option D
  4. Quick Check:

    ssl_prefer_server_ciphers on = Server cipher priority [OK]
Hint: ssl_prefer_server_ciphers on means server picks cipher [OK]
Common Mistakes:
  • Thinking client always chooses cipher
  • Assuming random cipher selection
  • Believing handshake fails on cipher mismatch
4. You configured nginx with:
ssl_protocols TLSv1.2 TLSv1.3
ssl_ciphers HIGH:!aNULL:!MD5
ssl_prefer_server_ciphers on;

But nginx fails to start. What is the likely cause?
medium
A. Missing semicolons at the end of directives
B. Using unsupported TLS versions
C. Incorrect cipher string syntax
D. ssl_prefer_server_ciphers must be off

Solution

  1. Step 1: Check syntax of nginx directives

    Each directive must end with a semicolon. The given config lines miss semicolons at the end.
  2. Step 2: Validate other options

    TLS versions and cipher strings are valid. ssl_prefer_server_ciphers can be on. So the syntax error (missing semicolons) causes nginx to fail.
  3. Final Answer:

    Missing semicolons at the end of directives -> Option A
  4. Quick Check:

    Missing semicolons cause config errors [OK]
Hint: Always end nginx directives with semicolon [OK]
Common Mistakes:
  • Ignoring semicolon syntax errors
  • Assuming TLS versions are unsupported
  • Thinking ssl_prefer_server_ciphers must be off
5. You want to configure nginx to only allow TLSv1.3 and use strong ciphers, but also ensure clients that do not support TLSv1.3 can still connect securely using TLSv1.2. Which configuration snippet achieves this best?
hard
A. ssl_protocols TLSv1.3; ssl_ciphers TLS_AES_256_GCM_SHA384; ssl_prefer_server_ciphers on;
B. ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers TLS_AES_256_GCM_SHA384:HIGH:!aNULL; ssl_prefer_server_ciphers on;
C. ssl_protocols TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers off;
D. ssl_protocols TLSv1.3 TLSv1.1; ssl_ciphers HIGH:!aNULL; ssl_prefer_server_ciphers on;

Solution

  1. Step 1: Identify required TLS versions

    We want to allow TLSv1.3 and TLSv1.2 to support clients without TLSv1.3.
  2. Step 2: Check cipher configuration

    ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers TLS_AES_256_GCM_SHA384:HIGH:!aNULL; ssl_prefer_server_ciphers on; includes TLS_AES_256_GCM_SHA384 (a strong TLSv1.3 cipher) plus HIGH strength ciphers for TLSv1.2, with server cipher preference enabled.
  3. Step 3: Validate other options

    ssl_protocols TLSv1.3; ssl_ciphers TLS_AES_256_GCM_SHA384; ssl_prefer_server_ciphers on; excludes TLSv1.2, blocking older clients. ssl_protocols TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers off; excludes TLSv1.3. ssl_protocols TLSv1.3 TLSv1.1; ssl_ciphers HIGH:!aNULL; ssl_prefer_server_ciphers on; includes insecure TLSv1.1, which is deprecated.
  4. Final Answer:

    ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers TLS_AES_256_GCM_SHA384:HIGH:!aNULL; ssl_prefer_server_ciphers on; -> Option B
  5. Quick Check:

    Allow TLSv1.2 and TLSv1.3 with strong ciphers = ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers TLS_AES_256_GCM_SHA384:HIGH:!aNULL; ssl_prefer_server_ciphers on; [OK]
Hint: Include TLSv1.2 and TLSv1.3 with strong ciphers [OK]
Common Mistakes:
  • Excluding TLSv1.2 and blocking older clients
  • Including deprecated TLS versions like TLSv1.1
  • Not combining strong ciphers for both TLS versions
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard