SSL, Domains & CDN March 5, 2026 · 5 min read

Wildcard SSL for Multi-Tenant SaaS: Your Complete Guide

Wildcard SSL for Multi-Tenant SaaS: Your Complete Guide

Building a multi-tenant SaaS app is exciting until you hit the SSL certificate wall. Your users want custom domains, subdomains for each tenant, and everything needs to be secure. Enter wildcard SSL certificates - the elegant solution that'll save your sanity and your budget.

What Makes Multi-Tenant SSL Tricky?

When you're building a SaaS app, you'll likely face one of these scenarios:

  • Subdomain per tenant: acme-corp.yourapp.com, startup-xyz.yourapp.com
  • Custom domains: Users want app.acmecorp.com pointing to their tenant
  • Mixed approach: Both subdomains and custom domains

Without proper SSL setup, you'll be juggling individual certificates, dealing with renewal nightmares, and probably losing sleep over certificate expiration alerts.

Wildcard SSL: Your Multi-Tenant Best Friend

A wildcard SSL certificate secures your main domain and all its subdomains with a single certificate. Instead of managing dozens of individual certs, you get one certificate that covers:

  • yourapp.com
  • *.yourapp.com (any subdomain)
  • tenant1.yourapp.com
  • tenant2.yourapp.com
  • api.yourapp.com
  • admin.yourapp.com

Pretty neat, right?

Setting Up Wildcard SSL: The Technical Details

1. Getting Your Wildcard Certificate

You can get wildcard certificates from several providers:

Free Options:

  • Let's Encrypt (via DNS challenge)
  • Cloudflare (if you use their proxy)

Paid Options:

  • DigiCert
  • Sectigo
  • GoDaddy

2. DNS Challenge Setup

For Let's Encrypt wildcards, you'll need DNS validation. Here's a typical setup using Certbot:

# Install certbot with your DNS provider plugin
sudo apt install certbot python3-certbot-dns-cloudflare

# Create credentials file
echo "dns_cloudflare_api_token = YOUR_API_TOKEN" > ~/.secrets/cloudflare.ini
chmod 600 ~/.secrets/cloudflare.ini

# Request wildcard certificate
certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials ~/.secrets/cloudflare.ini \
  -d yourapp.com \
  -d "*.yourapp.com"

3. Web Server Configuration

Once you have your certificate, configure your web server. Here's an Nginx example:

server {
    listen 443 ssl http2;
    server_name *.yourapp.com yourapp.com;
    
    ssl_certificate /etc/letsencrypt/live/yourapp.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourapp.com/privkey.pem;
    
    # Modern SSL configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
    ssl_prefer_server_ciphers off;
    
    location / {
        proxy_pass http://your-app-backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Load Balancer Integration

If you're using a load balancer (and you probably should), configure SSL termination there:

AWS Application Load Balancer

# terraform example
resource "aws_lb_listener" "https" {
  load_balancer_arn = aws_lb.main.arn
  port              = "443"
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-TLS-1-2-2017-01"
  certificate_arn   = aws_acm_certificate.wildcard.arn

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.app.arn
  }
}

Cloudflare Setup

Cloudflare makes this ridiculously easy:

  1. Add your domain to Cloudflare
  2. Enable SSL (Full or Full Strict)
  3. Wildcard certificates are automatically provisioned
  4. Done!

Handling Custom Domains

Wildcard certificates only cover subdomains of your main domain. For custom domains (app.clientdomain.com), you'll need additional strategies:

Option 1: SNI with Multiple Certificates

server {
    listen 443 ssl http2;
    server_name app.clientdomain.com;
    
    ssl_certificate /etc/ssl/certs/clientdomain.pem;
    ssl_certificate_key /etc/ssl/private/clientdomain.key;
    
    # Your app logic here
}

Option 2: Cloudflare for SaaS

Cloudflare's "SSL for SaaS" product handles custom domain certificates automatically:

// Using Cloudflare API to add custom hostname
const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/custom_hostnames`, {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${apiToken}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    hostname: 'app.clientdomain.com',
    ssl: {
      method: 'http',
      type: 'dv'
    }
  })
});

Automation and Renewal

SSL certificates expire, and forgetting to renew them is a fast track to angry customers and downtime.

Automated Renewal Script

#!/bin/bash
# ssl-renewal.sh

# Renew certificates
certbot renew --quiet

# Reload web server if certificates were renewed
if [ $? -eq 0 ]; then
    systemctl reload nginx
    echo "SSL certificates renewed and nginx reloaded"
fi

Add this to your crontab:

# Run twice daily
0 */12 * * * /path/to/ssl-renewal.sh

Security Best Practices

HTTP to HTTPS Redirect

Always redirect HTTP traffic:

server {
    listen 80;
    server_name *.yourapp.com yourapp.com;
    return 301 https://$server_name$request_uri;
}

HSTS Headers

Add HTTP Strict Transport Security:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

Certificate Pinning (Optional)

For high-security applications, consider certificate pinning:

add_header Public-Key-Pins 'pin-sha256="your-pin-here"; max-age=2592000; includeSubDomains';

Monitoring and Alerts

Set up monitoring to catch issues before your users do:

# Simple SSL expiry check
ssl_expiry_days=$(echo | openssl s_client -servername yourapp.com -connect yourapp.com:443 2>/dev/null | openssl x509 -noout -dates | grep notAfter | cut -d= -f2 | xargs -I {} date -d "{}" +%s)
current_date=$(date +%s)
days_until_expiry=$(( (ssl_expiry_days - current_date) / 86400 ))

if [ $days_until_expiry -lt 30 ]; then
    echo "SSL certificate expires in $days_until_expiry days!"
    # Send alert to your monitoring system
fi

Common Pitfalls and Solutions

Mixed Content Issues

When moving to HTTPS, watch out for mixed content errors:

// Use protocol-relative URLs
const apiUrl = '//api.yourapp.com/data';

// Or detect protocol dynamically
const protocol = window.location.protocol;
const apiUrl = `${protocol}//api.yourapp.com/data`;

Subdomain Cookies

Set cookies for your entire domain:

// Set cookie for all subdomains
document.cookie = "session=abc123; domain=.yourapp.com; secure; samesite=strict";

Performance Considerations

SSL termination at the load balancer level generally performs better than handling SSL at the application server level. If you're processing lots of concurrent connections, consider:

  • Using hardware SSL acceleration
  • Enabling HTTP/2
  • Implementing proper SSL session caching

Wrapping Up

Wildcard SSL certificates are a game-changer for multi-tenant SaaS applications. They simplify certificate management, reduce costs, and provide the security your users expect. Combined with proper automation and monitoring, they'll let you focus on building features instead of wrestling with certificate renewals.

The key is setting up proper automation from day one. Your future self (and your customers) will thank you when certificates renew seamlessly and everything just works.

Remember: SSL isn't just about security anymore - it's about trust, SEO rankings, and providing a professional experience. Get it right, and your users will never have to think about it.

Alex Hackney

Alex Hackney

DeployMyVibe

Ready to deploy?

Stop reading about it. Start shipping.

View Pricing