Master Nginx SSL Configuration: Secure HTTPS in 2026
Master Nginx SSL configuration for secure HTTPS in 2026. Learn manual setup & troubleshooting, then automate with OpsSqad's Security Squad for effortless security.

Mastering Nginx SSL Configuration for Secure HTTPS in 2026
As web security continues to be a paramount concern in 2026, securing your Nginx web servers with SSL/TLS is no longer optional – it's a fundamental requirement. This comprehensive guide will walk you through the intricacies of Nginx SSL configuration, from basic HTTPS setup to advanced optimizations and troubleshooting, ensuring your sites are protected against eavesdropping and man-in-the-middle attacks.
TL;DR: Nginx SSL configuration requires properly specifying certificate paths, limiting protocols to TLSv1.2 and TLSv1.3, selecting forward-secrecy cipher suites, and implementing performance optimizations like session caching and OCSP stapling. This guide covers everything from basic HTTPS setup to advanced troubleshooting, with practical examples and security best practices for 2026.
Understanding the Fundamentals: What is SSL/TLS and Why Nginx Needs It
Before diving into configuration, it's crucial to grasp the core concepts. SSL/TLS forms the cryptographic foundation that protects data in transit between web servers and clients, ensuring that sensitive information remains confidential and unaltered during transmission.
The Role of SSL/TLS in Securing Web Traffic
SSL/TLS (Secure Sockets Layer/Transport Layer Security) provides three critical security guarantees for web traffic: encryption, authentication, and data integrity. Encryption scrambles data so that only the intended recipient can read it, preventing eavesdroppers from intercepting sensitive information like passwords, credit card numbers, or personal data. Authentication verifies that you're communicating with the legitimate server, not an imposter attempting a man-in-the-middle attack. Data integrity ensures that information hasn't been tampered with during transmission through cryptographic checksums.
The transition from SSL to TLS represents a significant evolution in web security protocols. SSL 3.0, deprecated in 2015 due to the POODLE vulnerability, was succeeded by TLS 1.0, which itself is now considered insecure. As of 2026, industry standards mandate TLS 1.2 (released in 2008) as the minimum acceptable version, with TLS 1.3 (finalized in 2018) being the gold standard. TLS 1.3 removes outdated cryptographic algorithms, reduces handshake latency, and encrypts more of the handshake process itself.
HTTPS has become the universal standard for all web interactions in 2026, not just for e-commerce or banking sites. Major browsers now flag HTTP sites as "Not Secure," search engines penalize non-HTTPS sites in rankings, and many modern web APIs simply refuse to work over unencrypted connections. The widespread availability of free certificates through Let's Encrypt has eliminated cost as a barrier, making HTTPS implementation a baseline expectation rather than a premium feature.
Nginx as a High-Performance SSL/TLS Terminator
Nginx excels at handling SSL/TLS connections efficiently due to its event-driven architecture and optimized memory usage. Unlike process-based servers that spawn a new process for each connection, Nginx uses an asynchronous, non-blocking event loop that can handle thousands of concurrent SSL connections with minimal resource overhead. This makes Nginx particularly well-suited for high-traffic environments where SSL termination can become a performance bottleneck.
When Nginx acts as a reverse proxy, it commonly terminates SSL connections at the edge, decrypting incoming HTTPS traffic and forwarding plain HTTP requests to backend application servers. This architecture centralizes certificate management, reduces computational load on application servers, and simplifies security configurations. The reverse proxy can then re-encrypt traffic to backends if required, but many internal networks handle this traffic in plaintext within trusted network boundaries.
The importance of proper Nginx SSL configuration cannot be overstated—misconfigured SSL settings can create security vulnerabilities, cause performance degradation, or result in browser compatibility issues. A well-configured Nginx SSL setup balances security requirements with performance optimization, ensuring that your servers support modern encryption standards while maintaining responsiveness under load.
Essential Nginx SSL/TLS Configuration Directives
This section delves into the critical Nginx directives required for setting up and securing HTTPS connections. Understanding these directives forms the foundation of any robust SSL implementation.
Setting Up Your First HTTPS Server Block
The server block in Nginx defines how the web server should handle requests for a specific domain or IP address. For SSL/TLS, you'll create a dedicated server block that listens on port 443 (the standard HTTPS port) and enables SSL processing. The most basic HTTPS server block looks like this:
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
root /var/www/example.com;
index index.html;
}The listen directive specifies both the port number and the ssl parameter, which tells Nginx to expect encrypted connections on this port. Without the ssl parameter, Nginx would treat connections as plain HTTP even on port 443, resulting in connection failures. You can also specify the IP address explicitly if your server has multiple network interfaces: listen 192.168.1.10:443 ssl;.
Specifying Your SSL Certificate and Private Key
The ssl_certificate directive points to your public certificate chain file, which contains your domain certificate and any intermediate certificates needed to establish a chain of trust to a root certificate authority. This file should be in PEM format and typically has a .crt or .pem extension. The order matters: your domain certificate should come first, followed by intermediate certificates in the order they were issued.
The ssl_certificate_key directive points to your private key file, which must be kept absolutely secure since anyone with access to this file can impersonate your server. The private key should never be shared, transmitted over insecure channels, or committed to version control systems.
Best practices for storing and protecting private keys include:
- Store private keys in a dedicated directory like
/etc/nginx/ssl/or/etc/ssl/private/ - Set ownership to the Nginx user (typically
www-dataornginx) - Restrict file permissions to read-only for the owner:
chmod 600 /etc/nginx/ssl/example.com.key - Consider using encrypted filesystems for the directory containing private keys
- Implement regular audits to detect unauthorized access attempts
Pro tip: Ensure your private key file has strict permissions (e.g., chmod 600) to prevent unauthorized access. Nginx will refuse to start if the private key is world-readable, as this represents a critical security vulnerability.
Here's how to verify your certificate and key are properly paired:
openssl x509 -noout -modulus -in /etc/nginx/ssl/example.com.crt | openssl md5
openssl rsa -noout -modulus -in /etc/nginx/ssl/example.com.key | openssl md5Both commands should output identical MD5 hashes. If they differ, the certificate and key don't match, and SSL connections will fail.
Configuring SSL Protocols and Cipher Suites for Robust Security
The ssl_protocols directive specifies which TLS versions Nginx will accept for incoming connections. As of 2026, you should limit this to TLSv1.2 and TLSv1.3 only, explicitly disabling older, vulnerable protocols:
ssl_protocols TLSv1.2 TLSv1.3;The risks of older protocols are well-documented: SSLv3 is vulnerable to POODLE attacks, TLSv1.0 and TLSv1.1 suffer from weaknesses in their cryptographic primitives and lack support for modern cipher suites. Major browsers have dropped support for these protocols, and PCI DSS compliance requirements explicitly prohibit their use. While disabling TLSv1.0 and TLSv1.1 may affect a tiny percentage of users on extremely outdated systems (typically less than 0.1% of traffic in 2026), the security benefits far outweigh compatibility concerns.
The ssl_ciphers directive determines which cipher suites Nginx will offer during the TLS handshake. Cipher suites define the specific algorithms used for key exchange, authentication, encryption, and message authentication. A secure configuration prioritizes forward secrecy, strong encryption, and authenticated encryption with associated data (AEAD):
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;Let's break down what makes a cipher suite secure in 2026:
Forward Secrecy (ECDHE/DHE): Cipher suites beginning with ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) or DHE (Diffie-Hellman Ephemeral) provide forward secrecy, meaning that even if your private key is compromised in the future, past communications cannot be decrypted. This is critical for long-term confidentiality.
Authentication (ECDSA/RSA): The second component specifies the authentication algorithm. ECDSA certificates offer better performance than RSA at equivalent security levels, but RSA remains more widely deployed. Your choice here depends on your certificate type.
Encryption (AES-GCM/CHACHA20): AES-GCM provides authenticated encryption with excellent hardware acceleration on modern processors. CHACHA20-POLY1305 offers similar security with better performance on mobile devices and systems without AES hardware support.
Key Size (128/256): While AES-256 offers a larger key size, AES-128 provides sufficient security for virtually all use cases in 2026 and performs better. The security difference is negligible for practical purposes.
Avoid These Weak Ciphers:
- Anything with
RC4,3DES, orDES(broken or weak encryption) - Ciphers with
MD5(weak hashing) - Ciphers with
NULL(no encryption) - Non-ephemeral key exchange like
RSAkey exchange (no forward secrecy) CBCmode ciphers when GCM alternatives exist (vulnerable to padding oracle attacks)
The ssl_prefer_server_ciphers directive has evolved in its recommended setting. Previously set to on to enforce server-side cipher preferences, the modern recommendation is off to allow clients to choose their preferred cipher from the allowed list, as clients are now better at selecting optimal ciphers for their hardware capabilities.
Enabling HTTP/2 for Enhanced Performance with SSL
HTTP/2 represents a major evolution in web protocol efficiency, and it requires SSL/TLS in all major browser implementations (though the specification technically allows unencrypted HTTP/2). HTTP/2 leverages SSL/TLS for multiplexing multiple requests over a single connection, compressing headers, and enabling server push capabilities.
Configuring Nginx to enable HTTP/2 is straightforward—simply add http2 to your listen directive:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
}Note that HTTP/2 requires Nginx 1.9.5 or later, and you must compile Nginx with HTTP/2 support (most package manager installations include this by default in 2026). You can verify HTTP/2 support with:
nginx -V 2>&1 | grep -o with-http_v2_moduleThe benefits of HTTP/2 for website speed and user experience are substantial. By multiplexing requests, HTTP/2 eliminates the need for domain sharding and connection pooling workarounds that were necessary with HTTP/1.1. Header compression reduces overhead for cookie-heavy sites, and the binary framing layer reduces parsing complexity. Real-world performance improvements typically range from 10-30% reduction in page load times, with the greatest benefits seen on high-latency connections or pages with many small resources.
Advanced SSL/TLS Optimizations in Nginx
Beyond the basics, optimizing SSL/TLS can significantly improve performance and security. These advanced techniques reduce the computational overhead of SSL handshakes and enhance the user experience.
Optimizing SSL Performance with Session Caching
SSL/TLS handshakes are computationally expensive, involving multiple round trips and cryptographic operations. Session caching allows clients to resume previous SSL sessions without performing a full handshake, dramatically reducing latency and CPU usage for returning visitors.
The ssl_session_cache directive enables server-side session resumption with configurable cache storage:
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;Understanding the cache types is essential for optimization:
shared:SSL:10m creates a cache shared between all Nginx worker processes, with 10 megabytes of storage. This is the recommended configuration for production environments. The cache name (SSL in this example) can be any identifier, and the size determines how many sessions can be stored—roughly 4,000 sessions per megabyte. For a high-traffic site receiving 1 million unique visitors per day, a 50-100MB cache would be appropriate.
off completely disables session caching, forcing a full handshake for every connection. This should only be used in specific security scenarios where session resumption is considered a risk.
none tells Nginx not to cache sessions but still allows session resumption using session tickets (a different mechanism where the server sends encrypted session data to the client for storage).
The ssl_session_timeout directive controls how long session information remains valid in the cache. A value of 10 minutes balances security (limiting the window for session hijacking) with performance (allowing resumption for users actively browsing your site). Longer timeouts reduce handshake overhead but increase the risk window if session data is compromised.
Balancing cache size and memory usage requires monitoring your actual session resumption rates:
# Check Nginx stub status for SSL handshake statistics
curl http://localhost/nginx_statusYou can monitor cache efficiency by comparing full handshakes to resumed sessions. A well-tuned cache should show 60-80% session resumption for sites with returning visitors.
Implementing OCSP Stapling for Faster Certificate Validation
OCSP (Online Certificate Status Protocol) allows clients to verify that your SSL certificate hasn't been revoked. Without OCSP stapling, each client must contact the certificate authority's OCSP responder directly, adding latency and creating a privacy concern (the CA learns which sites users are visiting).
OCSP stapling solves this by having the server periodically query the OCSP responder and "staple" the signed response to the TLS handshake. This reduces client-side validation overhead, improves privacy, and eliminates the dependency on the CA's OCSP responder being available for every client connection.
Configuring OCSP stapling in Nginx requires two directives:
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/chain.pem;
# Optional: specify DNS resolvers for OCSP lookups
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;The ssl_stapling on directive enables OCSP stapling functionality. The ssl_stapling_verify on directive tells Nginx to verify the OCSP response before stapling it to handshakes, preventing the server from stapling invalid or malicious responses.
The ssl_trusted_certificate directive points to a file containing the certificate chain needed to verify the OCSP response. This should include intermediate and root certificates but not your server certificate. Many certificate providers supply a separate chain file for this purpose.
The resolver directive specifies DNS servers Nginx should use to look up the OCSP responder's address. Using reliable public DNS servers like Google's (8.8.8.8) or Cloudflare's (1.1.1.1) ensures OCSP lookups succeed even if your local DNS has issues.
You can verify OCSP stapling is working correctly:
openssl s_client -connect example.com:443 -status -tlsextdebug < /dev/null 2>&1 | grep -A 17 "OCSP response"A successful configuration will show an OCSP response with status "good." If you see "no response sent," OCSP stapling isn't working, which could indicate DNS resolution issues, firewall blocking OCSP responder access, or incorrect certificate chain configuration.
Managing SSL Certificates: From Generation to Renewal
Effective certificate management is crucial for maintaining a secure HTTPS setup. Certificate-related outages remain one of the most common causes of production incidents, making automation and monitoring essential.
Obtaining and Installing SSL Certificates
Let's Encrypt revolutionized SSL certificate accessibility by providing free, automated certificates trusted by all major browsers. As of 2026, Let's Encrypt issues over 300 million active certificates and has become the default choice for most web deployments. Certbot, the official Let's Encrypt client, automates the entire certificate lifecycle from initial issuance to renewal.
Step-by-step guide to using Certbot with Nginx:
1. Install Certbot:
# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx
# CentOS/RHEL
sudo yum install certbot python3-certbot-nginx
# Verify installation
certbot --version2. Obtain a certificate for your domain:
sudo certbot --nginx -d example.com -d www.example.comThis command will:
- Verify you control the domain by placing a temporary file on your web server
- Obtain a certificate from Let's Encrypt
- Automatically modify your Nginx configuration to use the new certificate
- Set up automatic renewal
3. Review the changes Certbot made:
sudo cat /etc/nginx/sites-available/defaultCertbot adds the ssl_certificate and ssl_certificate_key directives and typically creates a redirect from HTTP to HTTPS.
4. Test your SSL configuration:
sudo nginx -t
sudo systemctl reload nginxWildcard certificates allow you to secure unlimited subdomains with a single certificate (e.g., *.example.com covers blog.example.com, shop.example.com, api.example.com). They're particularly useful for environments with dynamic subdomain creation or microservices architectures. To obtain a wildcard certificate with Certbot:
sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.comNote that wildcard certificates require DNS validation rather than HTTP validation, meaning you'll need to create a TXT record in your DNS configuration to prove domain ownership.
Choosing between SSL certificate providers in 2026 depends on your specific requirements:
Let's Encrypt provides free certificates with 90-day validity, automated renewal, and is suitable for 95% of use cases. Limitations include the 90-day lifespan (though automation makes this a non-issue) and lack of extended validation (EV) certificates.
Commercial CAs (DigiCert, Sectigo, GlobalSign) offer longer validity periods (up to 1 year as of 2026 industry standards), extended validation certificates that show your organization name in the browser, and insurance/warranty coverage. These are primarily relevant for enterprise environments with specific compliance requirements or organizations that want the green address bar EV certificates provide.
Cloud provider certificates (AWS Certificate Manager, Google-managed certificates, Cloudflare) offer free certificates tightly integrated with their platforms, often with automatic renewal and deployment. These are excellent if you're already using the respective cloud platform but lock you into that ecosystem.
Automating SSL Certificate Renewal with Certbot
Let's Encrypt certificates expire after 90 days, making automated renewals essential to prevent service disruptions. Certbot handles this through scheduled tasks that check for expiring certificates and renew them automatically.
The importance of automated renewals cannot be overstated—manual certificate management at scale is error-prone and leads to preventable outages. A 2025 survey found that 37% of SSL-related incidents were caused by expired certificates, costing organizations an average of $89,000 per hour in downtime.
Setting up automated renewal with systemd timers (the modern approach on most Linux distributions):
# Check if the Certbot timer is enabled
sudo systemctl status certbot.timer
# If not enabled, enable it
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer
# View renewal schedule
sudo systemctl list-timers | grep certbotThe systemd timer typically runs twice daily, checking all certificates and renewing any that expire within 30 days. This provides ample buffer time to detect and resolve renewal issues.
For systems using cron instead:
# Edit crontab
sudo crontab -e
# Add a renewal check twice daily
0 0,12 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"The --quiet flag suppresses output unless there's an error, and --post-hook ensures Nginx reloads after successful renewal to start using the new certificate.
Best practices for testing renewal processes include:
1. Perform a dry run to verify renewal will work:
sudo certbot renew --dry-runThis simulates the renewal process without actually obtaining new certificates, allowing you to catch configuration issues before they cause an outage.
2. Monitor certificate expiration:
# Check certificate expiration date
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates3. Set up monitoring alerts for certificates expiring within 14 days. Many monitoring systems (Prometheus, Nagios, Datadog) include SSL certificate expiration checks.
4. Test the reload process:
# Verify Nginx configuration before reload
sudo nginx -t && sudo systemctl reload nginx5. Keep logs of renewal attempts:
# Review Certbot logs
sudo cat /var/log/letsencrypt/letsencrypt.logUnderstanding SNI (Server Name Indication) for Multiple SSL Certificates
Server Name Indication (SNI) is a TLS extension that allows a single IP address to host multiple SSL certificates, each for different domains. Before SNI, each SSL certificate required a dedicated IP address, which was costly and inefficient in the IPv4 address space.
SNI works by having the client send the requested hostname during the TLS handshake (before encryption begins), allowing the server to select the appropriate certificate. This is analogous to the HTTP Host header but occurs at the TLS layer.
Nginx has excellent SNI support and configuration is straightforward—simply define multiple server blocks with different server_name and ssl_certificate directives:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
}
server {
listen 443 ssl http2;
server_name shop.example.com;
ssl_certificate /etc/nginx/ssl/shop.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/shop.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
}Nginx automatically handles SNI selection based on the requested hostname.
Troubleshooting SNI-related issues:
Problem: Clients see certificate mismatch warnings
This typically occurs with very old clients that don't support SNI (Internet Explorer on Windows XP, Android 2.x). Check if SNI was sent:
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>&1 | grep -i "server name"Problem: Default certificate served instead of domain-specific certificate
Nginx will serve the first defined server block's certificate if SNI isn't provided or doesn't match any configured server_name. Define a specific default server to handle this case:
server {
listen 443 ssl http2 default_server;
server_name _;
ssl_certificate /etc/nginx/ssl/default.crt;
ssl_certificate_key /etc/nginx/ssl/default.key;
return 444; # Close connection without response
}Problem: Certificate chain issues
Ensure your certificate file includes the full chain in the correct order:
cat domain.crt intermediate.crt > fullchain.crtAs of 2026, SNI support exceeds 99.5% of web traffic, making it safe to rely on for virtually all deployments. The only notable exception is extremely old Android devices and specialized IoT equipment.
Securing Your Nginx Configuration: Best Practices and Common Pitfalls
Hardening your Nginx SSL configuration goes beyond basic setup—it requires understanding common attack vectors and implementing defense-in-depth strategies.
Configuring a Default HTTPS Server
The challenge of a "greedy" default server occurs when Nginx must decide which server block to use for requests that don't match any configured server_name. Without explicit configuration, Nginx uses the first server block defined in its configuration files, which can lead to unexpected behavior and security issues.
For example, if someone points a domain at your IP address or connects directly via IP, Nginx will serve content using whatever server block it considers default, potentially exposing a site you didn't intend to make public or using the wrong SSL certificate (causing browser warnings).
Defining a specific server_name for your primary HTTPS site ensures it only responds to intended domains:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# Your actual site configuration
root /var/www/example.com;
}Setting up a fallback server for non-matching requests or invalid SNI provides explicit control over default behavior:
server {
listen 443 ssl http2 default_server;
server_name _;
# Use a self-signed certificate for the default server
ssl_certificate /etc/nginx/ssl/default-selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/default-selfsigned.key;
ssl_protocols TLSv1.2 TLSv1.3;
# Return a 444 status (close connection) or serve a generic page
return 444;
}The default_server parameter explicitly marks this block as the fallback. The underscore _ as server_name matches any hostname that doesn't match other server blocks. Returning 444 closes the connection without sending a response, which is appropriate for clearly unwanted traffic.
Redirecting HTTP to HTTPS
Enforcing HTTPS for all traffic is essential in 2026—there's no legitimate reason to serve content over unencrypted HTTP. Configuring Nginx to automatically redirect HTTP requests to HTTPS ensures users always connect securely, even if they type http:// in their browser or follow an old link.
Using return 301 for permanent redirects is the correct approach:
server {
listen 80;
server_name example.com www.example.com;
# Redirect all HTTP traffic to HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
# Your HTTPS site configuration
root /var/www/example.com;
}The return 301 directive is more efficient than using rewrite because it immediately returns the redirect without processing location blocks. The $host variable preserves the requested hostname, and $request_uri preserves the path and query string.
Warning: Make sure your SSL certificate is properly configured before redirecting all traffic to HTTPS, or you'll lock users out of your site entirely.
For sites that need to support both HTTP and HTTPS on specific paths (rare in 2026 but occasionally required for legacy systems):
server {
listen 80;
server_name example.com;
location /.well-known/acme-challenge/ {
# Allow HTTP for Let's Encrypt validation
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}Troubleshooting Common Nginx SSL Connection Resets
SSL connection resets manifest as browser errors like "ERR_SSL_PROTOCOL_ERROR," "SSL_ERROR_NO_CYPHER_OVERLAP," or simply connection timeouts. Diagnosing these issues requires systematic investigation of certificates, ciphers, and protocol configurations.
Diagnosing certificate errors:
# Check certificate validity and chain
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>&1 | openssl x509 -noout -text
# Verify certificate chain completeness
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>&1 | grep -A 5 "Certificate chain"Common certificate issues include:
- Expired certificates: Check the "Not After" date in the certificate output
- Invalid chain: Missing intermediate certificates prevent browsers from building a trust path to root CAs
- Hostname mismatch: Certificate CN or SAN doesn't match the requested domain
- Self-signed certificates: Not trusted by browsers without manual trust configuration
Identifying cipher suite mismatches:
# Test which ciphers are available
nmap --script ssl-enum-ciphers -p 443 example.com
# Test connection with specific TLS version
openssl s_client -connect example.com:443 -tls1_2 < /dev/null
openssl s_client -connect example.com:443 -tls1_3 < /dev/nullCipher mismatches occur when the server and client have no mutually supported cipher suites. This can happen if:
- Your
ssl_ciphersconfiguration is too restrictive - The client is extremely outdated and only supports weak ciphers you've disabled
- Protocol version mismatch (client only supports TLSv1.0, server requires TLSv1.2+)
Checking Nginx error logs for SSL-related messages:
# View recent SSL errors
sudo tail -f /var/log/nginx/error.log | grep -i ssl
# Common error patterns to look for
sudo grep "SSL_do_handshake" /var/log/nginx/error.log
sudo grep "peer closed connection" /var/log/nginx/error.log
sudo grep "ssl_stapling" /var/log/nginx/error.logCommon error messages and their meanings:
SSL_do_handshake() failed (SSL: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure)
This indicates a cipher suite or protocol version mismatch.
SSL_do_handshake() failed (SSL: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small)
The client rejected your DH parameters as too small (should be 2048-bit minimum).
no "ssl_certificate" is defined in server listening on SSL port
You have listen 443 ssl but didn't specify certificate paths.
Using openssl s_client for detailed connection diagnostics:
# Full handshake details
openssl s_client -connect example.com:443 -servername example.com -state -debug < /dev/null
# Test specific cipher
openssl s_client -connect example.com:443 -cipher 'ECDHE-RSA-AES128-GCM-SHA256' < /dev/null
# Check certificate expiration
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -datesThe output will show the complete handshake process, including which TLS version was negotiated, which cipher suite was selected, and the complete certificate chain. Look for error messages in the output—successful connections will end with "Verify return code: 0 (ok)."
In-depth Comparison of Different SSL/TLS Versions and Their Compatibility
Understanding the evolution and differences between TLS versions helps you make informed decisions about protocol support and security trade-offs.
TLS 1.2 (RFC 5246, finalized 2008) represents the mature, widely-deployed standard as of 2026. Key features include:
- Support for AEAD cipher suites (AES-GCM, ChaCha20-Poly1305)
- Flexible cipher suite negotiation
- Support for SHA-256 and stronger hash functions
- Mandatory support for SNI
- Extensions for OCSP stapling and session tickets
TLS 1.2 is supported by virtually all clients in active use: Chrome 30+, Firefox 27+, Safari 7+, Internet Explorer 11+, Edge (all versions), and Android 4.4+. Browser compatibility is effectively universal in 2026, with less than 0.5% of global traffic from clients lacking TLS 1.2 support.
TLS 1.3 (RFC 8446, finalized 2018) represents the cutting edge with significant security and performance improvements:
- Reduced handshake latency (1-RTT for new connections, 0-RTT for resumed sessions)
- Removed support for weak cryptographic algorithms (RSA key exchange, CBC mode ciphers, SHA-1, MD5)
- Encrypted handshake messages (only the initial ClientHello is unencrypted)
- Simplified cipher suite structure
- Forward secrecy mandatory for all connections
- Improved resistance to downgrade attacks
TLS 1.3 is supported by Chrome 70+, Firefox 63+, Safari 12.1+, Edge 79+, and Android 10+. As of 2026, approximately 65-70% of global HTTPS traffic uses TLS 1.3, with the percentage continuing to grow.
Performance comparison:
TLS 1.3 reduces handshake latency by approximately 30-40% compared to TLS 1.2 for new connections through its 1-RTT handshake (one round trip instead of two). For resumed sessions, 0-RTT can eliminate handshake latency entirely, though this comes with replay attack considerations that must be carefully managed.
Security comparison:
TLS 1.3 eliminates entire categories of vulnerabilities present in TLS 1.2 by removing support for problematic features. Attacks like ROBOT, SWEET32, and various CBC padding oracle attacks are impossible against TLS 1.3. The encrypted handshake prevents passive observers from learning which certificates are being requested, improving privacy.
Why older versions are being deprecated:
- SSLv3 (1996): Vulnerable to POODLE attack, completely broken, disabled by all browsers
- TLS 1.0 (1999): Vulnerable to BEAST attack, supports weak ciphers, deprecated by PCI DSS and major browsers
- TLS 1.1 (2006): Marginal improvements over 1.0, lacks support for modern cipher suites, no compelling reason to use over 1.2
Major browser vendors deprecated TLS 1.0 and 1.1 in 2020, and as of 2026, these protocols account for less than 0.1% of traffic. Compliance standards like PCI DSS prohibit their use for payment processing.
Recommended configuration for 2026:
# Optimal balance of security and compatibility
ssl_protocols TLSv1.2 TLSv1.3;
# If you can afford to drop the last 0.5% of legacy clients
ssl_protocols TLSv1.3;For most organizations, supporting both TLSv1.2 and TLSv1.3 provides the best balance. High-security environments or internal applications with controlled client populations can safely use TLSv1.3 exclusively.
Skip the Manual Work: How OpsSqad's Security Squad Solves Nginx SSL Configuration and Troubleshooting
Manually configuring and troubleshooting Nginx SSL can be time-consuming and prone to error, especially in complex environments with multiple domains, certificate providers, and security requirements. A single misconfigured directive can expose vulnerabilities or cause complete service outages, and diagnosing SSL handshake failures often requires deep expertise in cryptographic protocols.
The OpsSqad Advantage: Secure Remote Access and AI-Driven Debugging
Problem: You've just updated your Nginx SSL configuration to enforce TLS 1.3 only, and suddenly mobile users are reporting connection errors. You need to quickly check which clients are failing, review your cipher suite configuration, analyze error logs, and potentially roll back changes—all while ensuring you don't introduce new security vulnerabilities. Traditionally, this means SSH-ing into multiple servers, parsing logs manually, testing configurations, and hoping you catch all the edge cases.
Solution: OpsSqad allows you to securely interact with your servers via a chat interface, leveraging AI agents trained on security best practices. The Security Squad can execute diagnostic commands, analyze SSL configurations, review certificate chains, and even suggest optimized configurations based on your specific requirements—all without exposing SSH ports or setting up VPN access.
The reverse TCP architecture means your servers establish outbound connections to OpsSqad's cloud infrastructure, so no inbound firewall rules are required. Your existing security perimeter remains intact while gaining powerful remote management capabilities. Every command executed through OpsSqad is whitelisted, sandboxed, and logged for audit compliance, giving you security teams confidence that AI-assisted operations won't introduce unauthorized changes.
Getting Started with OpsSqad's Security Squad
The complete setup takes approximately three minutes from account creation to executing your first debugging session:
1. Create your free account at app.opssquad.ai and deploy a Node:
Navigate to app.opssqad.ai and sign up for a free account. Once logged in, go to the Nodes section in the dashboard and click "Create Node." Give your node a descriptive name like "production-web-01" or "nginx-ssl-servers." The dashboard will generate a unique Node ID and authentication token—keep these handy for the next step.
2. Deploy the agent to your server/cluster:
SSH into your target server and run the installation commands using the Node ID and token from your dashboard:
curl -fsSL https://install.opssquad.ai/install.sh | bash
opssquad node install --node-id=node_abc123xyz --token=tok_secure_token_here
opssquad node startThe installer is lightweight (under 20MB) and establishes the reverse TCP connection immediately. You'll see confirmation in both your terminal and the OpsSqad dashboard that the node is connected and ready.
3. Browse Squad Marketplace and deploy the Security Squad:
In the OpsSqad dashboard, navigate to the Squad Marketplace and locate the Security Squad. This pre-built squad includes AI agents specifically trained on security operations, SSL/TLS troubleshooting, certificate management, and compliance scanning. Click "Deploy Squad" to create your private instance with all included agents.
4. Link agents to nodes and grant permissions:
Open your deployed Security Squad and go to the Agents tab. Here you'll grant agents access to the node you created in step 2. This permission system ensures agents can only execute commands on infrastructure you've explicitly authorized. The Security Squad uses a carefully curated whitelist of security-related commands—agents can't execute arbitrary code or make unauthorized changes.
5. Start debugging via chat at chat.opssquad.ai:
Navigate to chat.opssquad.ai, select your Security Squad from the sidebar, and start interacting with your AI agents. You can ask questions in natural language, request specific diagnostic commands, or describe problems you're experiencing.
Real-World Scenario: Troubleshooting Nginx SSL Errors with the Security Squad
Imagine you're facing connection resets on your Nginx server after updating SSL configurations. Instead of manually logging in, parsing logs, and running diagnostic commands, you can leverage the Security Squad:
User: "My Nginx server at production-web-01 is showing SSL connection errors after I updated the configuration to require TLS 1.3. Can you check the Nginx error logs and analyze the current SSL configuration?"
The Security Squad, leveraging its access to your linked node and AI-powered analysis capabilities, executes the necessary commands and provides a comprehensive response:
Security Squad: "I've analyzed your Nginx error logs and reviewed the SSL configuration on production-web-01. Here's what I found:
Error Log Analysis:
2026-02-27 14:23:15 [crit] 8472#8472: *1847 SSL_do_handshake() failed (SSL: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure) while SSL handshaking, client: 203.0.113.42
2026-02-27 14:23:18 [crit] 8472#8472: *1849 SSL_do_handshake() failed (SSL: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure) while SSL handshaking, client: 198.51.100.87
Current SSL Configuration (from /etc/nginx/sites-enabled/default):
listen 443 ssl http2;
ssl_protocols TLSv1.3;
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256';
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;Root Cause: Your configuration enforces TLS 1.3 exclusively, which is causing handshake failures for clients that only support TLS 1.2. I've checked the client IPs from the error logs—they're coming from Android 8.x devices and older Windows 10 builds that lack TLS 1.3 support.
Impact Assessment: Based on your access logs from the past 24 hours, approximately 8.3% of your traffic comes from clients that don't support TLS 1.3. This represents roughly 12,400 failed connection attempts since the configuration change.
Recommended Solution: I suggest reverting to support both TLS 1.2 and TLS 1.3 to maintain compatibility while still providing enhanced security for modern clients. Here's the updated configuration:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256';
ssl_prefer_server_ciphers off;Would you like me to apply this configuration and reload Nginx? I'll run a configuration test first to ensure there are no syntax errors."
User: "Yes, please apply the fix and reload Nginx."
Security Squad: "Configuration updated and validated successfully. Here's what I did:
- Created backup of current configuration:
/etc/nginx/sites-enabled/default.backup.2026-02-27-14-30 - Applied updated SSL directives
- Ran configuration test:
nginx -t- Syntax OK - Reloaded Nginx:
systemctl reload nginx- Success
I'm monitoring the error logs now... No new SSL handshake failures in the past 60 seconds. The configuration change appears successful. I recommend monitoring for the next 15 minutes to confirm all client types can connect properly.
Additionally, I noticed your SSL certificate expires in 18 days. Would you like me to check your Certbot renewal configuration to ensure automatic renewal is properly configured?"
This interaction demonstrates the power of OpsSqad's approach: what would have taken 15-20 minutes of manual SSH access, log parsing, configuration editing, and testing was accomplished in under 90 seconds through natural language conversation. The Security Squad not only diagnosed the issue but provided context about the impact, suggested a fix, and proactively identified a potential future problem with certificate expiration.
The reverse TCP architecture ensures your servers remain protected behind firewalls—no SSH ports exposed to the internet, no VPN configuration required. Command whitelisting guarantees that even AI-suggested operations are limited to approved security commands. Every action is logged in OpsSqad's audit trail, providing compliance teams with complete visibility into what was changed, when, and why.
Prevention and Best Practices for Nginx SSL in 2026
Proactive measures are key to maintaining a secure and reliable HTTPS setup. These best practices help you avoid common pitfalls and maintain security posture over time.
Regular Audits and Monitoring
Implementing automated checks for SSL certificate expiry prevents the most common cause of SSL-related outages. Use monitoring tools or simple cron jobs:
# Script to check certificate expiration
#!/bin/bash
DOMAIN="example.com"
EXPIRY_DATE=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
CURRENT_EPOCH=$(date +%s)
DAYS_REMAINING=$(( ($EXPIRY_EPOCH - $CURRENT_EPOCH) / 86400 ))
if [ $DAYS_REMAINING -lt 14 ]; then
echo "WARNING: SSL certificate for $DOMAIN expires in $DAYS_REMAINING days"
# Send alert to your monitoring system
fiUsing security scanning tools to identify SSL/TLS vulnerabilities should be part of your regular security posture. Tools like SSL Labs' SSL Server Test, testssl.sh, or commercial scanners provide comprehensive analysis:
# Install and run testssl.sh
git clone https://github.com/drwetter/testssl.sh.git
cd testssl.sh
./testssl.sh --severity MEDIUM example.com:443Monitoring Nginx logs for suspicious activity includes watching for:
- Unusual spikes in SSL handshake failures (potential attacks)
- Connections from unexpected geographic regions
- Attempts to use deprecated protocols (reconnaissance activity)
- Certificate validation errors (possible MITM attempts)
# Monitor for SSL-related anomalies
sudo tail -f /var/log/nginx/access.log | grep -E "400|495|496|497"Nginx status codes 495 (SSL certificate error), 496 (SSL certificate required), and 497 (HTTP to HTTPS) indicate SSL-specific issues worth investigating.
Keeping Nginx and OpenSSL Updated
The importance of patching Nginx and its underlying OpenSSL library cannot be overstated. SSL/TLS vulnerabilities like Heartbleed, POODLE, and BEAST have demonstrated the critical need for timely updates. As of 2026, new vulnerabilities continue to be discovered, making update management a continuous requirement.
Strategies for managing updates without service disruption:
1. Use rolling updates in load-balanced environments:
# Remove one server from load balancer
# Update and restart Nginx on that server
sudo apt update && sudo apt upgrade nginx
sudo systemctl restart nginx
# Return server to load balancer
# Repeat for remaining servers2. Test updates in staging environments first:
Maintain a staging environment that mirrors production configuration. Apply updates there first and run automated tests before promoting to production.
3. Use graceful reloads instead of restarts when possible:
# Reload preserves existing connections
sudo nginx -t && sudo systemctl reload nginx4. Subscribe to security mailing lists:
- Nginx security advisories: nginx-announce mailing list
- OpenSSL security advisories: openssl-announce mailing list
- Your Linux distribution's security announcements
5. Automate security updates for critical packages:
# Ubuntu/Debian - configure unattended-upgrades
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgradesConfigure this to install security updates automatically while leaving feature updates for manual review.
Implementing HSTS (HTTP Strict Transport Security)
HSTS forces browsers to connect exclusively over HTTPS, even if the user types http:// or clicks an HTTP link. This prevents SSL stripping attacks where an attacker intercepts the initial HTTP request before the redirect to HTTPS occurs.
Configuring the Strict-Transport-Security header in Nginx:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# HSTS header with 1-year duration
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
}Understanding the HSTS directive components:
max-age=31536000: Browsers should remember to use HTTPS for one year (31,536,000 seconds)includeSubDomains: Apply HSTS to all subdomains (be certain all subdomains support HTTPS before enabling)preload: Indicates you want to be included in browsers' HSTS preload listsalways: Add the header to all responses, not just 200 OK
Warning: HSTS can lock users out if you later have SSL certificate issues. Start with a short max-age (e.g., 300 seconds) for testing, then increase to one year once you're confident in your SSL setup.
To submit your domain to the HSTS preload list (making browsers enforce HTTPS even on first visit):
- Ensure you meet the requirements (valid HTTPS, redirect HTTP to HTTPS, HSTS header with
preloadandincludeSubDomains) - Submit your domain at https://hstspreload.org/
- Wait for inclusion in browser updates (typically 2-3 months)
Practical Examples of Nginx SSL Configuration for Various Use Cases
Reverse proxy with SSL termination:
This is one of the most common Nginx SSL configurations—Nginx handles SSL/TLS, then forwards decrypted traffic to backend application servers:
upstream backend_app {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
server 10.0.1.12:8080;
}
server {
listen 443 ssl http2;
server_name app.example.com;
ssl_certificate /etc/nginx/ssl/app.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/app.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
location / {
proxy_pass http://backend_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}The X-Forwarded-Proto header tells backend applications whether the original request was HTTP or HTTPS, which is important for generating correct URLs and enforcing security policies.
API gateway with SSL and rate limiting:
For API endpoints, you'll often want SSL combined with rate limiting and API key validation:
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/api.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/api.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
# Require client certificates for API access (mutual TLS)
ssl_client_certificate /etc/nginx/ssl/ca.crt;
ssl_verify_client optional;
location /api/v1 {
limit_req zone=api_limit burst=20 nodelay;
# Reject requests without valid client certificates
if ($ssl_client_verify != SUCCESS) {
return 403;
}
proxy_pass http://api_backend;
proxy_set_header X-SSL-Client-DN $ssl_client_s_dn;
}
}This configuration implements mutual TLS authentication (mTLS), where clients must present valid certificates to access the API—common in microservices architectures and B2B integrations.
Multi-domain configuration with SNI:
Hosting multiple domains with different SSL certificates on a single server:
server {
listen 443 ssl http2;
server_name blog.example.com;
ssl_certificate /etc/nginx/ssl/blog.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/blog.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/blog;
}
server {
listen 443 ssl http2;
server_name shop.example.com;
ssl_certificate /etc/nginx/ssl/shop.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/shop.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/shop;
}
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/nginx/ssl/api.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/api.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://api_backend;
}
}Nginx automatically selects the correct certificate based on the SNI hostname provided by the client.
Explanation of HTTP/2 and Its Interaction with Nginx SSL Configuration
HTTP/2 fundamentally changes how browsers and servers communicate, but it's tightly coupled with SSL/TLS in practice. While the HTTP/2 specification technically allows unencrypted connections, no major browser implements this—HTTP/2 effectively requires HTTPS.
HTTP/2 is enabled in Nginx by adding the http2 parameter to the listen directive:
listen 443 ssl http2;This single parameter activates several performance optimizations:
Multiplexing: HTTP/2 allows multiple requests and responses to be in flight simultaneously over a single TCP connection. With HTTP/1.1, browsers opened 6-8 parallel connections to work around head-of-line blocking. HTTP/2 eliminates this need, reducing connection overhead and improving SSL session reuse.
Header compression: HTTP/2 uses HPACK compression for headers, which is particularly beneficial for SSL connections where every byte matters for performance. For sites with large cookies or many requests, this can reduce header overhead by 80-90%.
Server push: Nginx can proactively send resources to clients before they're requested:
server {
listen 443 ssl http2;
server_name example.com;
location / {
# Push critical CSS when HTML is requested
http2_push /css/critical.css;
root /var/www/example.com;
}
}Binary framing: HTTP/2 uses binary protocols instead of text-based HTTP/1.1, reducing parsing overhead and ambiguity. This is transparent to applications but improves efficiency.
Optimizing HTTP/2 with SSL:
http {
# Increase buffer sizes for HTTP/2
http2_max_field_size 16k;
http2_max_header_size 32k;
# Adjust stream limits
http2_max_concurrent_streams 128;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
# HTTP/2 works best with session caching
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
}Performance considerations:
HTTP/2 performs best when combined with SSL session caching because establishing new TLS connections is expensive. The connection multiplexing means a single TLS handshake can serve many resources, but only if sessions are properly cached.
For optimal performance in 2026, the recommended configuration is:
- TLS 1.3 for reduced handshake latency
- HTTP/2 for multiplexing and header compression
- Session caching for connection reuse
- OCSP stapling to reduce validation overhead
This combination can improve page load times by 20-40% compared to HTTP/1.1 over TLS 1.2, with the greatest benefits on high-latency connections (mobile networks, international traffic).
Conclusion
Securing your Nginx web servers with robust SSL/TLS configurations is a critical component of online security in 2026. By understanding the fundamental directives, implementing advanced optimizations like session caching and OCSP stapling, and adopting best practices for certificate management and protocol selection, you can significantly enhance the trust and integrity of your web applications. Regular monitoring, timely updates, and proactive security measures ensure your SSL implementation remains resilient against evolving threats.
For DevOps teams managing complex SSL configurations across multiple servers, the manual overhead of troubleshooting handshake failures, managing certificate renewals, and optimizing performance can be substantial. If you want to automate these workflows and leverage AI-powered security expertise, OpsSqad's Security Squad provides a powerful solution that simplifies configuration, accelerates troubleshooting, and bolsters your overall security posture—all while maintaining strict security controls through whitelisting, sandboxing, and comprehensive audit logging.
Ready to experience effortless Nginx SSL management and proactive security? Create your free account at https://app.opssquad.ai and explore the power of the Security Squad today!