Common SSL Certificate Errors: Complete Troubleshooting Guide

Comprehensive guide to diagnosing and fixing common SSL certificate errors including browser warnings, configuration issues, and step-by-step solutions.

By SSL Security Team Updated May 23, 2025 13 min read
Intermediate

Common SSL Certificate Errors: Complete Troubleshooting Guide

SSL certificate errors can be frustrating and impact user experience significantly. This comprehensive guide covers the most common SSL errors, their causes, and step-by-step solutions to get your website running securely.

Understanding SSL Error Messages

Browser Error Categories

Security Warnings:

  • Certificate not trusted
  • Certificate expired
  • Domain mismatch
  • Certificate chain issues

Connection Errors:

  • SSL handshake failures
  • Protocol version mismatches
  • Cipher suite incompatibility
  • Timeout issues

Configuration Errors:

  • Mixed content warnings
  • Certificate installation problems
  • Server configuration issues
  • Certificate authority problems

Most Common SSL Certificate Errors

1. "Your Connection is Not Private" (Chrome)

Error Variations:

  • Chrome: "Your connection is not private"
  • Firefox: "Warning: Potential Security Risk Ahead"
  • Safari: "This Connection Is Not Private"
  • Edge: "Your connection isn't private"

Common Causes:

  • Expired SSL certificate
  • Self-signed certificate
  • Domain name mismatch
  • Incomplete certificate chain
  • Clock synchronization issues

Quick Diagnosis:

# Check certificate details
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com

# Check expiration date
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates

# Verify certificate chain
curl -I https://yourdomain.com

2. Certificate Expired Error

Error Message: "This certificate has expired"

Symptoms:

  • Browser displays warning page
  • HTTPS connection fails
  • Users see "Not Secure" warning

Immediate Solutions:

  1. Verify Expiration:
# Check current certificate expiration
openssl x509 -enddate -noout -in certificate.crt
# or check remotely
echo | openssl s_client -connect domain.com:443 2>/dev/null | openssl x509 -noout -enddate
  1. Renew Certificate:
# For Let's Encrypt
sudo certbot renew

# For commercial certificates
# Follow your CA's renewal process
  1. Update Server Configuration:
# Restart web server after renewal
sudo systemctl restart apache2
# or
sudo systemctl restart nginx

3. Domain Name Mismatch Error

Error Message: "Certificate name mismatch" or "Common name doesn't match"

Causes:

  • Certificate issued for different domain
  • Missing www or subdomain coverage
  • Incorrect certificate installation

Solutions:

  1. Check Certificate Domains:
# View certificate details
openssl x509 -text -noout -in certificate.crt | grep -A1 "Subject Alternative Name"

# Check what domains are covered
echo | openssl s_client -connect domain.com:443 2>/dev/null | openssl x509 -noout -text | grep DNS
  1. Fix Domain Mismatch:
  • Wrong Domain: Get new certificate for correct domain
  • Missing www: Use wildcard certificate or multi-domain certificate
  • Subdomain Issues: Ensure certificate covers all required subdomains
  1. Server Configuration Fix:
# Apache - ensure ServerName matches certificate
<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    # SSL configuration...
</VirtualHost>
# Nginx - ensure server_name matches certificate
server {
    listen 443 ssl;
    server_name example.com www.example.com;
    # SSL configuration...
}

4. Certificate Chain Issues

Error Message: "Certificate authority invalid" or "Certificate not trusted"

Symptoms:

  • Browser shows "Not Secure"
  • Certificate appears invalid despite being from trusted CA
  • Some browsers work, others don't

Diagnosis:

# Check certificate chain completeness
openssl verify -CAfile root.crt -untrusted intermediate.crt domain.crt

# Test certificate chain online
curl -I https://yourdomain.com

# Check what browsers see
openssl s_client -connect yourdomain.com:443 -showcerts

Solutions:

  1. Install Missing Intermediate Certificate:
# Apache configuration
SSLCertificateFile /path/to/domain.crt
SSLCertificateKeyFile /path/to/private.key
SSLCertificateChainFile /path/to/intermediate.crt
# Nginx - concatenate certificates
cat domain.crt intermediate.crt > fullchain.crt

# Then use in configuration
ssl_certificate /path/to/fullchain.crt;
ssl_certificate_key /path/to/private.key;
  1. Verify Certificate Order:
# Correct order: domain cert → intermediate → root
# Verify with
openssl crl2pkcs7 -nocrl -certfile fullchain.crt | openssl pkcs7 -print_certs -noout

5. Mixed Content Warnings

Error Message: "This page includes resources that are not secure"

Symptoms:

  • Yellow warning triangle in browser
  • Some page elements don't load
  • Console shows mixed content errors

Identification:

# Check for mixed content using browser dev tools
# Or use online tools like WhyNoPadlock.com

# Command line check for HTTP references
grep -r "http://" /var/www/html/ --include="*.html" --include="*.php"

Solutions:

  1. Update Internal Links:
<!-- Change from -->
<img src="http://example.com/image.jpg" />
<script src="http://example.com/script.js"></script>

<!-- To -->
<img src="https://example.com/image.jpg" />
<script src="https://example.com/script.js"></script>

<!-- Or use protocol-relative URLs -->
<img src="//example.com/image.jpg" />
  1. Content Security Policy:
<!-- Force HTTPS for all content -->
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />
  1. Server-Level Redirects:
# Apache - redirect HTTP to HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

6. Self-Signed Certificate Errors

Error Message: "Certificate not trusted" or "Self-signed certificate"

Symptoms:

  • Browser blocks access by default
  • Security warning for all users
  • Certificate shows as invalid

Solutions:

  1. Replace with Trusted Certificate:
# Get free certificate from Let's Encrypt
sudo certbot --apache -d yourdomain.com

# Or purchase from commercial CA
  1. For Development/Testing:
# Create proper self-signed certificate
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

# Add to browser trust store (development only)
# Chrome: Settings → Privacy and Security → Manage Certificates

7. SSL Handshake Failures

Error Message: "SSL connection error" or "Handshake failure"

Common Causes:

  • Protocol version mismatch
  • Cipher suite incompatibility
  • Certificate/key mismatch
  • Server configuration errors

Diagnosis:

# Test SSL handshake
openssl s_client -connect domain.com:443 -servername domain.com

# Check supported protocols
nmap --script ssl-enum-ciphers -p 443 domain.com

# Verify certificate and key match
openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in private.key | openssl md5

Solutions:

  1. Fix Protocol Configuration:
# Apache - enable modern protocols
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
# Nginx - enable TLS 1.2 and 1.3
ssl_protocols TLSv1.2 TLSv1.3;
  1. Update Cipher Suites:
# Apache - modern cipher suites
SSLCipherSuite ECDHE+AESGCM:ECDHE+AES256:ECDHE+AES128:!aNULL:!MD5:!DSS
  1. Verify Certificate/Key Pair:
# Generate new CSR if key doesn't match
openssl req -new -key private.key -out domain.csr

Advanced Troubleshooting Techniques

Using Online SSL Testing Tools

SSL Labs SSL Test:

  1. Visit ssllabs.com/ssltest/
  2. Enter your domain name
  3. Review detailed report
  4. Follow recommendations for fixes

Key Metrics to Check:

  • Overall grade (aim for A or A+)
  • Certificate validity
  • Protocol support
  • Cipher suite strength
  • Vulnerability status

Command-Line Diagnostic Tools

Comprehensive SSL Check Script:

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

DOMAIN="$1"

if [ -z "$DOMAIN" ]; then
    echo "Usage: $0 domain.com"
    exit 1
fi

echo "=== SSL Diagnostics for $DOMAIN ==="

# Basic connectivity test
echo "1. Testing connectivity..."
if curl -Is https://$DOMAIN > /dev/null 2>&1; then
    echo "✓ HTTPS connection successful"
else
    echo "✗ HTTPS connection failed"
fi

# Certificate expiration
echo "2. Checking certificate expiration..."
EXPIRY=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_TIMESTAMP=$(date -d "$EXPIRY" +%s)
CURRENT_TIMESTAMP=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_TIMESTAMP - $CURRENT_TIMESTAMP) / 86400 ))

if [ $DAYS_LEFT -gt 30 ]; then
    echo "✓ Certificate expires in $DAYS_LEFT days"
elif [ $DAYS_LEFT -gt 0 ]; then
    echo "⚠ Certificate expires in $DAYS_LEFT days (WARNING)"
else
    echo "✗ Certificate expired $((DAYS_LEFT * -1)) days ago"
fi

# Certificate chain
echo "3. Checking certificate chain..."
CHAIN_OUTPUT=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null)
CERT_COUNT=$(echo "$CHAIN_OUTPUT" | grep -c "BEGIN CERTIFICATE")

if [ $CERT_COUNT -gt 1 ]; then
    echo "✓ Certificate chain includes $CERT_COUNT certificates"
else
    echo "⚠ Only $CERT_COUNT certificate found - missing intermediate?"
fi

# Protocol support
echo "4. Checking protocol support..."
for PROTOCOL in tls1_2 tls1_3; do
    if echo | openssl s_client -$PROTOCOL -connect $DOMAIN:443 2>/dev/null | grep -q "Verify return code: 0"; then
        echo "✓ $PROTOCOL supported"
    else
        echo "✗ $PROTOCOL not supported"
    fi
done

# Mixed content check
echo "5. Checking for mixed content..."
if curl -s https://$DOMAIN | grep -q "http://"; then
    echo "⚠ Potential mixed content found"
    echo "   Check page source for HTTP resources"
else
    echo "✓ No obvious mixed content detected"
fi

echo "=== Diagnostics complete ==="

Browser-Specific Debugging

Chrome DevTools:

  1. Open Developer Tools (F12)
  2. Go to Security tab
  3. Review certificate details
  4. Check Console for mixed content errors

Firefox Certificate Viewer:

  1. Click padlock icon in address bar
  2. Select "Connection not secure" or certificate info
  3. View certificate details
  4. Check certificate chain

Safari Certificate Inspector:

  1. Click padlock icon
  2. Select "Show Certificate"
  3. Review certificate information
  4. Check trust settings

Prevention Strategies

Proactive Monitoring

Certificate Expiration Monitoring:

# Add to crontab for daily checks
0 9 * * * /path/to/ssl-check.sh yourdomain.com

Automated Renewal Setup:

# Let's Encrypt auto-renewal
0 3 * * * /usr/bin/certbot renew --quiet

# Commercial certificate renewal reminder
0 9 1 * * /path/to/renewal-reminder.sh

Configuration Best Practices

Server Security Headers:

# Apache security headers
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff

Regular Configuration Audits:

# Weekly SSL configuration check
#!/bin/bash
# audit-ssl-config.sh

DOMAINS="domain1.com domain2.com api.domain.com"

for DOMAIN in $DOMAINS; do
    echo "Auditing $DOMAIN..."

    # Check SSL Labs grade
    GRADE=$(curl -s "https://api.ssllabs.com/api/v3/analyze?host=$DOMAIN" | jq -r '.endpoints[0].grade')
    echo "SSL Labs Grade: $GRADE"

    # Check certificate expiration
    DAYS_LEFT=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2 | xargs -I {} date -d "{}" +%s | xargs -I {} expr \( {} - $(date +%s) \) / 86400)
    echo "Days until expiration: $DAYS_LEFT"

    echo "---"
done

Emergency Response Procedures

Immediate Actions for SSL Outages

  1. Assess Impact:

    • Check website accessibility
    • Monitor user reports
    • Review error logs
  2. Quick Diagnosis:

    • Use SSL testing tools
    • Check certificate status
    • Verify server configuration
  3. Emergency Fixes:

    • Temporary certificate installation
    • DNS changes to working servers
    • Emergency certificate purchase

Emergency Certificate Replacement

Fast Certificate Deployment:

#!/bin/bash
# emergency-cert-deploy.sh

DOMAIN="$1"
CERT_FILE="$2"
KEY_FILE="$3"

# Backup current configuration
cp /etc/ssl/certs/$DOMAIN.crt /etc/ssl/certs/$DOMAIN.crt.backup
cp /etc/ssl/private/$DOMAIN.key /etc/ssl/private/$DOMAIN.key.backup

# Deploy new certificate
cp $CERT_FILE /etc/ssl/certs/$DOMAIN.crt
cp $KEY_FILE /etc/ssl/private/$DOMAIN.key

# Set permissions
chmod 644 /etc/ssl/certs/$DOMAIN.crt
chmod 600 /etc/ssl/private/$DOMAIN.key

# Test configuration
if nginx -t; then
    systemctl reload nginx
    echo "Emergency certificate deployed successfully"
else
    # Rollback on failure
    cp /etc/ssl/certs/$DOMAIN.crt.backup /etc/ssl/certs/$DOMAIN.crt
    cp /etc/ssl/private/$DOMAIN.key.backup /etc/ssl/private/$DOMAIN.key
    echo "Deployment failed - rolled back to previous certificate"
fi

Specific Platform Solutions

WordPress SSL Issues

Common WordPress SSL Problems:

  • Mixed content from themes/plugins
  • Hardcoded HTTP URLs in database
  • CDN configuration issues

WordPress-Specific Fixes:

// wp-config.php - Force HTTPS
define('FORCE_SSL_ADMIN', true);

// .htaccess - Redirect HTTP to HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

E-commerce Platform Issues

Shopify SSL Setup:

  1. Add custom domain in admin
  2. Enable SSL certificate
  3. Update domain settings
  4. Verify HTTPS redirect

WooCommerce SSL Configuration:

// Force HTTPS for checkout pages
add_action('init', 'force_ssl_checkout');
function force_ssl_checkout() {
    if (is_admin() || is_checkout() || is_account_page()) {
        force_ssl();
    }
}

Conclusion

SSL certificate errors can significantly impact user experience and website security. By understanding common error types and following systematic troubleshooting approaches, you can quickly identify and resolve most SSL issues.

Key Prevention Strategies:

  • Regular monitoring of certificate expiration and health
  • Proactive renewal processes and automation
  • Configuration audits to catch issues early
  • Testing procedures for certificate deployments

Emergency Response:

  • Quick diagnosis tools and scripts
  • Emergency certificate deployment procedures
  • Rollback plans for failed deployments
  • Communication strategies for user notifications

Best Practices:

  • Use trusted Certificate Authorities
  • Implement complete certificate chains
  • Enable security headers
  • Monitor certificate transparency logs
  • Maintain certificate inventory

Related Articles


Need Help with SSL Errors? Use our SSL certificate checker tool to diagnose issues quickly and get specific recommendations for fixing your SSL configuration.