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:
- SSH into your server
- Navigate to:
/var/cpanel/ssl/apache_tls/
- Edit the domain's CA bundle file directly
- 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