SNI for multiple SSL certificates in Nginx - Time & Space Complexity
We want to understand how the time to handle SSL connections changes when using multiple certificates with SNI in nginx.
How does nginx manage multiple SSL certificates as the number of domains grows?
Analyze the time complexity of the following nginx configuration snippet using SNI.
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/example.com.crt;
ssl_certificate_key /etc/ssl/example.com.key;
}
server {
listen 443 ssl;
server_name example.org;
ssl_certificate /etc/ssl/example.org.crt;
ssl_certificate_key /etc/ssl/example.org.key;
}
# ... more server blocks for other domains
This config uses SNI to serve different SSL certificates based on the requested domain.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: nginx matches the requested domain against server blocks to select the correct SSL certificate.
- How many times: This matching happens once per new SSL connection during the handshake.
As the number of server blocks (domains) increases, nginx must check more entries to find the right certificate.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 domain checks per connection |
| 100 | About 100 domain checks per connection |
| 1000 | About 1000 domain checks per connection |
Pattern observation: The number of checks grows roughly in direct proportion to the number of configured domains.
Time Complexity: O(n)
This means the time to select the SSL certificate grows linearly with the number of domains configured.
[X] Wrong: "nginx instantly finds the right certificate no matter how many domains there are."
[OK] Correct: nginx checks server blocks one by one until it finds a match, so more domains mean more checks.
Understanding how nginx handles multiple SSL certificates helps you explain real-world server performance and scaling in interviews.
"What if nginx used a hash map to store domain-to-certificate mappings? How would the time complexity change?"
Practice
Solution
Step 1: Understand what SNI does
SNI allows the server to present different SSL certificates depending on the domain name requested by the client.Step 2: Relate SNI to nginx configuration
In nginx, SNI lets you use multipleserverblocks with different SSL certificates on the same IP and port.Final Answer:
To allow multiple SSL certificates on a single IP address by selecting the correct certificate based on the requested domain name. -> Option AQuick Check:
SNI = Multiple SSL certs on one IP [OK]
- Confusing SNI with HTTP/2 support
- Thinking SNI merges certificates into one
- Assuming SNI automatically redirects HTTP to HTTPS
Solution
Step 1: Check listen directive for SSL
Each server block must listen on port 443 withsslenabled to serve HTTPS.Step 2: Verify separate server blocks for each domain
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/ssl/example.com.crt; ssl_certificate_key /etc/ssl/example.com.key; } server { listen 443 ssl; server_name example.org; ssl_certificate /etc/ssl/example.org.crt; ssl_certificate_key /etc/ssl/example.org.key; } has two server blocks, each with its ownserver_nameand SSL cert/key, which is correct for SNI.Final Answer:
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/ssl/example.com.crt; ssl_certificate_key /etc/ssl/example.com.key; } server { listen 443 ssl; server_name example.org; ssl_certificate /etc/ssl/example.org.crt; ssl_certificate_key /etc/ssl/example.org.key; } -> Option BQuick Check:
Separate server blocks + listen 443 ssl = correct SNI setup [OK]
- Omitting 'ssl' in listen directive on port 443
- Combining multiple domains in one server block with one cert
- Using port 80 for SSL configuration
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/example.com.crt;
ssl_certificate_key /etc/ssl/example.com.key;
}
server {
listen 443 ssl;
server_name example.org;
ssl_certificate /etc/ssl/example.org.crt;
ssl_certificate_key /etc/ssl/example.org.key;
}
Solution
Step 1: Identify configured server names
Only example.com and example.org have server blocks with SSL certificates.Step 2: Understand nginx default server behavior
If a requested domain is not matched, nginx serves the default SSL server block, which is usually the first one defined (example.com here).Final Answer:
The client will receive the SSL certificate for example.com because example.net is not configured. -> Option AQuick Check:
Unmatched domain gets first SSL cert [OK]
- Assuming nginx picks a fallback cert arbitrarily
- Thinking connection fails without explicit config
- Believing client gets a certificate error immediately
Solution
Step 1: Check server_name directives
If theserver_namedirectives are identical in both blocks, nginx cannot distinguish between domains using SNI.Step 2: Understand effect on SNI
SNI relies on uniqueserver_namematches to select the correct server block and certificate. Identical names cause all requests to use the first block (default), resulting in the same certificate.Final Answer:
Theserver_namedirectives are identical in both server blocks. -> Option CQuick Check:
Identical server_name = always first cert [OK]
- Missing 'ssl' parameter in listen directive
- The SSL certificate files are corrupted
- The firewall is blocking port 443
Solution
Step 1: Understand SNI requires separate server blocks
Each domain needs its own server block withlisten 443 ssl;and its own SSL cert/key.Step 2: Verify correct listen and server_name usage
Create three separate server blocks, each withlisten 443 ssl;, uniqueserver_name, and correspondingssl_certificateandssl_certificate_key. correctly uses three server blocks with SSL enabled on port 443 and unique domain names.Final Answer:
Create three separate server blocks, each with listen 443 ssl, unique server_name, and corresponding SSL certificate and key. -> Option DQuick Check:
Separate server blocks + listen 443 ssl + unique certs = correct SNI [OK]
- Using one server block for multiple domains without SAN cert
- Omitting 'ssl' in listen directive
- Using port 80 for SSL traffic
Ready to prove it?
Pass the test and this pattern moves unknown
