Fixing SSL Certificate Trust Issues on Android: Missing Intermediate CAs and WHM Bug Workarounds


2 views

When your SSL certificate works flawlessly on desktop browsers but fails on some Android devices despite having the root certificate installed, you're likely facing intermediate certificate chain issues. The symptoms typically include:

  • Certificate warnings on Android (varying by OS version)
  • Working validation on desktop Chrome/Firefox
  • Positive results from SSL Labs tester
  • Identical root certificate fingerprints across devices

The core issue stems from Android's handling of certificate chains when intermediate certificates are missing. Many certificates previously chained through the now-retired AddTrust External CA Root. Modern Android versions require proper chaining to current intermediates.

# Example of incomplete chain (problematic)
Server Certificate → USERTrust RSA → (missing) → AddTrust External (retired)

# Required complete chain
Server Certificate → USERTrust RSA → AddTrust External → Root

The WebHost Manager control panel has a known bug where CA bundle updates don't persist correctly. Even after pasting the complete chain, WHM silently replaces it with an outdated bundle.

Here's how to verify your current chain:

openssl s_client -showcerts -connect yourdomain.com:443

1. Generate the Correct Certificate Bundle

Create a text file containing all certificates in proper order:

-----BEGIN CERTIFICATE-----
[Your Domain Certificate]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[USERTrust RSA Certificate]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[AddTrust External Certificate]
-----END CERTIFICATE-----

2. WHM Workaround Implementation

To bypass WHM's CA bundle bug, directly modify the Apache configuration:

SSLCertificateFile /path/to/your_domain.crt
SSLCertificateKeyFile /path/to/your_private.key
SSLCertificateChainFile /path/to/ca-bundle.crt

3. Verification Steps

After implementation, verify with:

# Check chain completeness
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts

# Test Android compatibility using emulator
emulator -avd TestDevice -dns-server 8.8.8.8

Create a validation script to check certificate chain:

#!/bin/bash
DOMAIN="yourdomain.com"
echo | openssl s_client -showcerts -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | \
  openssl x509 -inform pem -noout -text | \
  grep -A 1 "Authority Information Access"

For non-WHM environments, Certbot handles chains correctly:

sudo certbot --apache -d yourdomain.com --preferred-chain "ISRG Root X1"
  • Confirm all intermediate certificates exist in bundle
  • Verify certificate order (end-entity first, root last)
  • Check file permissions (400 for private key)
  • Test on multiple Android versions (7.0+ specifically)
  • Clear SSL cache on test devices before validation

When your SSL certificate works on desktops but fails on some Android devices, despite the root certificate being properly installed, you're likely facing intermediate certificate chain issues. This specific case involves the AddTrust External CA Root and SHA-256 fingerprint compatibility.

The key symptom here is that SSL Labs reports everything correctly, yet Android devices still show trust errors. This typically indicates:

  • Missing intermediate certificates in the chain
  • Incorrect certificate order in the bundle
  • Legacy Android devices rejecting newer signature algorithms

After extensive testing, the correct certificate chain should include:

-----BEGIN CERTIFICATE-----
[Your domain certificate]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[USERTrust RSA Certification Authority]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[AddTrust External CA Root]
-----END CERTIFICATE-----

Due to a known WHM bug, the CA bundle doesn't update properly through the GUI. Here's how to force the update:

  1. SSH into your server
  2. Navigate to: /var/cpanel/ssl/apache_tls/
  3. Edit the domain's CA bundle file directly
  4. Restart Apache: service httpd restart

Use these OpenSSL commands to verify your chain:

openssl s_client -connect yourdomain.com:443 -showcerts
openssl verify -CAfile /path/to/your/cabundle.crt yourcert.crt

For maximum Android compatibility:

  • Include both SHA-1 and SHA-256 intermediate certificates
  • Keep certificate chains under 3 certificates when possible
  • Test on Android 4.x devices as they're most sensitive to chain issues

Here's a script to verify your fix works across devices:

#!/bin/bash
ANDROID_USERAGENT="Mozilla/5.0 (Linux; Android 8.0.0) AppleWebKit/537.36"
curl -Iv --tlsv1.2 --user-agent "$ANDROID_USERAGENT" https://yourdomain.com